From f7c1845f0c5dae997f27a799438fea02a7dadf2f Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 6 Apr 2021 19:58:02 +1200 Subject: [PATCH] #2177 - Fix where schema not provided by JDBC driver For @Table with schema, using findNative with a JDBC driver that does not provide the schema this fix matches by just using the table name. --- .../server/deploy/BeanDescriptor.java | 6 +-- .../server/deploy/BeanDescriptorTest.java | 53 ++++++++++++++++--- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index a2d902f13..e05c636bb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -2473,7 +2473,7 @@ public class BeanDescriptor implements BeanType, STreeType { * Return the property path given the db table and column. */ public String findBeanPath(String schemaName, String tableName, String columnName) { - if (matchBaseTable(schemaName, tableName)) { + if (matchBaseTable(tableName)) { return columnPath.get(columnName); } BeanPropertyAssoc assocProperty = tablePath.get(tableName); @@ -2489,10 +2489,10 @@ public class BeanDescriptor implements BeanType, STreeType { return null; } - private boolean matchBaseTable(String schemaName, String tableName) { + boolean matchBaseTable(String tableName) { return tableName.isEmpty() || baseTable.equalsIgnoreCase(tableName) - || baseTable.equalsIgnoreCase(schemaName + "." + tableName); + || baseTable.endsWith("." + tableName); } /** diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java index d4cbcbfbf..ab8ae6a87 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java @@ -4,21 +4,22 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.bean.EntityBean; import io.ebean.plugin.Property; +import io.ebeaninternal.server.core.CacheOptions; +import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; +import io.ebeaninternal.server.deploy.meta.DeployIdentityMode; +import io.ebeanservice.docstore.api.DocStoreBeanAdapter; import org.junit.Test; -import org.tests.model.basic.Animal; -import org.tests.model.basic.AnimalShelter; -import org.tests.model.basic.Cat; -import org.tests.model.basic.Contact; -import org.tests.model.basic.Country; -import org.tests.model.basic.Customer; -import org.tests.model.basic.Dog; -import org.tests.model.basic.Order; +import org.tests.model.basic.*; import org.tests.model.bridge.BSite; import org.tests.model.bridge.BUser; import java.util.Collection; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class BeanDescriptorTest extends BaseTestCase { @@ -88,6 +89,42 @@ public class BeanDescriptorTest extends BaseTestCase { assertThat(props).extracting("name").contains("id", "status", "orderDate", "shipDate"); } + @Test + public void matchBaseTable() { + BeanDescriptor desc = getBeanDescriptor(Customer.class); + assertTrue(desc.matchBaseTable("o_customer")); + } + + @Test + public void matchBaseTable_whenTableHasSchema_expect_matchRegardlessOfSchema() { + + DeployBeanDescriptor deploy = mockDeployCustomer(); + + when(deploy.getBaseTable()).thenReturn("foo.o_customer"); + BeanDescriptor desc1 = new BeanDescriptor<>(mockOwner(), deploy); + assertTrue(desc1.matchBaseTable("o_customer")); + + when(deploy.getBaseTable()).thenReturn("bar.o_customer"); + BeanDescriptor desc2 = new BeanDescriptor<>(mockOwner(), deploy); + assertTrue(desc2.matchBaseTable("o_customer")); + } + + @SuppressWarnings("unchecked") + private DeployBeanDescriptor mockDeployCustomer() { + DeployBeanDescriptor deploy = mock(DeployBeanDescriptor.class); + when(deploy.getBeanType()).thenReturn(Customer.class); + when(deploy.getIdentityMode()).thenReturn(DeployIdentityMode.auto()); + when(deploy.buildIdentityMode()).thenReturn(IdentityMode.NONE); + when(deploy.getCacheOptions()).thenReturn(CacheOptions.NO_CACHING); + return deploy; + } + + private BeanDescriptorMap mockOwner() { + BeanDescriptorMap owner = mock(BeanDescriptorMap.class); + when(owner.createDocStoreBeanAdapter(any(), any())).thenReturn(mock(DocStoreBeanAdapter.class)); + return owner; + } + @Test public void merge_when_empty() {