Merge branch 'master' into wip/h2database-v2

This commit is contained in:
Rob Bygrave authored and GitHub committed 2022-01-25 21:30:36 +13:00
commit bc6d2fb3be
113 files changed
+1589 -372

No files matched your search

@@ -27,16 +27,17 @@ public class DatabaseConfigTest {
@Test
public void evalPropertiesInput() {
String home = System.getenv("HOME");
String home = System.getProperty("user.home");
String fileSeparator = System.getProperty("file.separator");
Properties props = new Properties();
props.setProperty("ddl.initSql", "${HOME}/initSql");
props.setProperty("ddl.initSql", "${user.home}" + fileSeparator + "initSql");
DatabaseConfig config = new DatabaseConfig();
config.loadFromProperties(props);
String ddlInitSql = config.getDdlInitSql();
assertThat(ddlInitSql).isEqualTo(home+"/initSql");
assertThat(ddlInitSql).isEqualTo(home + fileSeparator + "initSql");
}
@Test
@@ -50,30 +50,31 @@ public class PropertiesWrapperTest {
@Test
public void testGetProperties() {
String home = System.getenv("HOME");
String home = System.getProperty("user.home");
String tmpDir = System.getProperty("java.io.tmpdir");
String fileSeparator = System.getProperty("file.separator");
Properties properties = new Properties();
properties.put("someBasic", "hello");
properties.put("someInt", "42");
properties.put("someDouble", "5.5");
properties.put("somePath", "${HOME}/hello");
properties.put("someSystemProp", "/aaa/${java.io.tmpdir}/bbb");
properties.put("somePath", "${user.home}" + fileSeparator + "hello");
properties.put("someSystemProp", fileSeparator + "aaa" + fileSeparator + "${java.io.tmpdir}" + fileSeparator + "bbb");
Properties evalCopy = Config.asConfiguration().eval(properties);
PropertiesWrapper pw = new PropertiesWrapper("pref", "myserver", evalCopy, null);
assertEquals(42, pw.getInt("someInt", 99));
assertEquals(Double.valueOf(5.5D), (Double.valueOf(pw.getDouble("someDouble", 99.9D))));
assertEquals(home + "/hello", pw.get("somePath", null));
assertEquals("/aaa/" + tmpDir + "/bbb", pw.get("someSystemProp"));
assertEquals(home + fileSeparator + "hello", pw.get("somePath", null));
assertEquals(fileSeparator + "aaa" + fileSeparator + tmpDir + fileSeparator + "bbb", pw.get("someSystemProp"));
pw = new PropertiesWrapper(evalCopy, null);
assertEquals(42, pw.getInt("someInt", 99));
assertEquals(Double.valueOf(5.5D), (Double.valueOf(pw.getDouble("someDouble", 99.9D))));
assertEquals(home + "/hello", pw.get("somePath", null));
assertEquals("/aaa/" + tmpDir + "/bbb", pw.get("someSystemProp"));
assertEquals(home + fileSeparator + "hello", pw.get("somePath", null));
assertEquals(fileSeparator + "aaa" + fileSeparator + tmpDir + fileSeparator + "bbb", pw.get("someSystemProp"));
}
}
@@ -2,28 +2,34 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.oracle.Oracle11Platform;
import io.ebean.config.dbplatform.oracle.Oracle12Platform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class OraclePlatformTest {
class OraclePlatformTest {
@Test
public void columnAliasPrefix_Oracle11Platform() {
void columnAliasPrefix_Oracle11Platform() {
Oracle11Platform platform11 = new Oracle11Platform();
assertThat(platform11.columnAliasPrefix).isEqualTo("c");
}
@Test
public void columnAliasPrefix_OraclePlatform() {
OraclePlatform platform = new OraclePlatform();
assertThat(platform.columnAliasPrefix).isEqualTo("c");
void columnAliasPrefix_Oracle12Platform() {
Oracle12Platform platform12 = new Oracle12Platform();
assertThat(platform12.columnAliasPrefix).isEqualTo("c");
}
@Test
public void uuid_default() {
void columnAliasPrefix_OraclePlatform() {
OraclePlatform platform = new OraclePlatform();
assertThat(platform.columnAliasPrefix).isNull();
}
@Test
void uuid_default() {
OraclePlatform platform = new OraclePlatform();
platform.configure(new PlatformConfig(), false);
DbPlatformType dbType = platform.getDbTypeMap().get(DbPlatformType.UUID);
@@ -31,8 +37,7 @@ public class OraclePlatformTest {
}
@Test
public void uuid_as_binary() {
void uuid_as_binary() {
OraclePlatform platform = new OraclePlatform();
PlatformConfig config = new PlatformConfig();
config.setDbUuid(PlatformConfig.DbUuid.AUTO_BINARY);
@@ -4,24 +4,22 @@ import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import io.ebean.ModifyAwareType;
import io.ebean.text.json.EJson;
import io.ebean.util.IOUtils;
import io.ebeaninternal.json.ModifyAwareMap;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.Writer;
import java.nio.file.Files;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
public class EJsonTests {
private static final Logger log = LoggerFactory.getLogger(EJsonTests.class);
@Test
public void test_map_simple() throws IOException {
@@ -46,15 +44,13 @@ public class EJsonTests {
public void write_withWriter_expect_writerNotClosed() throws IOException {
File temp = Files.createTempFile("some", ".json").toFile();
FileWriter writer = new FileWriter(temp);
Map<String,Object> map = new LinkedHashMap<>();
map.put("foo", "bar");
EJson.write(map, writer);
writer.write("The end.");
writer.flush();
writer.close();
log.info("write to file {}", temp.getAbsolutePath());
try (Writer writer = IOUtils.newWriter(temp)) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("foo", "bar");
EJson.write(map, writer);
writer.write("The end.");
}
assertThat(temp).hasContent("{\"foo\":\"bar\"}The end.");
}
@Test
@@ -0,0 +1,87 @@
package io.ebean.test.config.platform;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class DockerHostTest {
@Test
void runningInDocker_when_false_alwaysUseLocalhost() {
DockerHost dockerHost = new DockerHost();
assertFalse(dockerHost.runningInDocker());
assertEquals("localhost", dockerHost.dockerHost("foo"));
}
@Test
void runningInDocker_when_true_useExplicit() {
TDDockerHost dockerHost = new TDDockerHost();
assertTrue(dockerHost.runningInDocker());
assertEquals("my-host", dockerHost.dockerHost("my-host"));
}
@Disabled
@Test
void runningInDocker_when_trueAndLinux_useDefault() {
TDDockerHost dockerHost = new TDDockerHost();
assertTrue(dockerHost.runningInDocker());
assertEquals("172.17.0.1", dockerHost.dockerHost(null));
}
@Test
void runningInDocker_when_windowsDefault() {
TDDockerHost dockerHost = new TDDockerHost();
assertTrue(dockerHost.runningInDocker());
String origName = System.getProperty("os.name");
System.setProperty("os.name", "win");
try {
assertEquals("host.docker.internal",dockerHost.defaultDockerHost());
assertEquals("host.docker.internal", dockerHost.dockerHost(null));
} finally {
System.setProperty("os.name", origName);
}
}
@Test
void runningInDocker_when_macDefault() {
TDDockerHost dockerHost = new TDDockerHost();
assertTrue(dockerHost.runningInDocker());
String origName = System.getProperty("os.name");
System.setProperty("os.name", "mac");
try {
assertEquals("host.docker.internal",dockerHost.defaultDockerHost());
assertEquals("host.docker.internal", dockerHost.dockerHost(null));
} finally {
System.setProperty("os.name", origName);
}
}
@Test
void runningInDocker_when_linuxDefault() {
TDDockerHost dockerHost = new TDDockerHost();
assertTrue(dockerHost.runningInDocker());
String origName = System.getProperty("os.name");
System.setProperty("os.name", "linux");
try {
assertEquals("172.17.0.1",dockerHost.defaultDockerHost());
assertEquals("172.17.0.1", dockerHost.dockerHost(null));
} finally {
System.setProperty("os.name", origName);
}
}
static class TDDockerHost extends DockerHost {
@Override
boolean initInDocker() {
return true;
}
}
}
@@ -11,6 +11,7 @@ import org.tests.model.basic.ResetBasicData;
import org.tests.model.basic.TBytesOnly;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
@@ -94,7 +95,7 @@ public class CachedBeanDataSerializeTest extends BaseTestCase {
TBytesOnly bean = new TBytesOnly();
bean.setId(42);
bean.setContent(stringContent.getBytes("UTF-8"));
bean.setContent(stringContent.getBytes(StandardCharsets.UTF_8));
BeanDescriptor<TBytesOnly> desc = getBeanDescriptor(TBytesOnly.class);
CachedBeanData extract = CachedBeanDataFromBean.extract(desc, (EntityBean) bean);
@@ -5,6 +5,7 @@ import io.ebean.config.EncryptKey;
import org.junit.jupiter.api.Test;
import org.tests.basic.encrypt.BasicEncryptKey;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import static org.assertj.core.api.Assertions.assertThat;
@@ -19,7 +20,7 @@ public class TestSimpleEncryptor extends BaseTestCase {
EncryptKey key = new BasicEncryptKey("hello");
byte[] data = "test123".getBytes();
byte[] data = "test123".getBytes(StandardCharsets.UTF_8);
byte[] ecData = e.encrypt(data, key);
@@ -15,6 +15,8 @@ import org.tests.model.ivo.converter.MoneyTypeConverter;
import javax.persistence.EnumType;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Calendar;
import java.util.GregorianCalendar;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
@@ -29,7 +31,6 @@ public class TestTypeManager extends BaseTestCase {
DefaultTypeManager typeManager = createTypeManager();
ScalarType<?> type = typeManager.createEnumScalarType(MyEnum.class, null);
typeManager.addEnumType(type, MyEnum.class);
Object val = type.read(new DummyDataReader("A"));
assertThat(val).isEqualTo(MyEnum.Aval);
@@ -131,6 +132,13 @@ public class TestTypeManager extends BaseTestCase {
return new DefaultTypeManager(config, bootupClasses);
}
@Test
public void testCalendar() throws SQLException {
DefaultTypeManager typeManager = createTypeManager();
ScalarType<?> typeB = typeManager.getScalarType(GregorianCalendar.class);
assertThat(typeB).isInstanceOf(ScalarTypeCalendar.class);
}
/**
* Test double DataReader implementation.
*/
@@ -8,12 +8,14 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.nio.charset.StandardCharsets;
public class TestDeleteImportedPartial extends BaseTestCase {
@Test
public void test() {
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
Integer id = persistentFile.getId();
@@ -8,13 +8,15 @@ import org.tests.model.basic.PersistentFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.nio.charset.StandardCharsets;
public class TestDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt", new PersistentFileContent(
"test".getBytes()));
"test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
Integer id = persistentFile.getId();
@@ -8,16 +8,18 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.nio.charset.StandardCharsets;
public class TestDeleteOneToOneMultiple extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
// PFile persistentFile = new PFile();
// persistentFile.setName("test.txt");
// PFileContent content = new PFileContent();
// content.setContent("test".getBytes());
// content.setContent("test".getBytes(StandardCharsets.UTF_8));
// persistentFile.setFileContent(content);
DB.save(persistentFile);
@@ -8,12 +8,14 @@ import org.tests.model.basic.PersistentFileContent;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.nio.charset.StandardCharsets;
public class TestSaveDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt",
new PersistentFileContent("test".getBytes()));
new PersistentFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
DB.delete(persistentFile);
@@ -22,7 +24,7 @@ public class TestSaveDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateLoadDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt",
new PersistentFileContent("test".getBytes()));
new PersistentFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
@@ -8,11 +8,13 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.nio.charset.StandardCharsets;
public class TestSaveDeleteOneToOneMultiple extends BaseTestCase {
// public void testCreateDeletePFile() {
// PFile persistentFile = new PFile("test.txt",
// new PFileContent("test".getBytes()));
// new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
//
// DB.save(persistentFile);
// DB.delete(persistentFile);
@@ -21,7 +23,7 @@ public class TestSaveDeleteOneToOneMultiple extends BaseTestCase {
@Test
public void testCreateLoadDeletePFile() {
PFile persistentFile = new PFile("test.txt",
new PFileContent("test".getBytes()));
new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
@@ -6,6 +6,7 @@ import io.ebean.DB;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.TWithPreInsert;
import org.tests.model.basic.TWithPreInsertChild;
import org.tests.model.basic.event.TWithPreInsertPersistAdapter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -27,6 +28,7 @@ class TestPreInsertValidation extends BaseTestCase {
assertThat(e.requestCascadeState()).isEqualTo(2);
TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId());
assert e1 != null;
e1.setTitle("Missus");
DB.save(e1);
@@ -54,11 +56,21 @@ class TestPreInsertValidation extends BaseTestCase {
assert e1 != null;
e1.setTitle("ParentCascading-changed");
e1.children().get(0).setName("Child0-changed");
TWithPreInsertChild childBean = e1.children().get(0);
childBean.setName("Child0-changed");
DB.save(e1);
assertThat(e1.requestCascadeState()).isEqualTo(12);
assertThat(e1.children().get(0).requestCascadeState()).isEqualTo(11);
assertThat(childBean.requestCascadeState()).isEqualTo(11);
DB.delete(e1);
assertThat(e1.requestCascadeState()).isEqualTo(22);
// assert that isCascade() was true for the child bean
assertThat(TWithPreInsertPersistAdapter.cascadeDelete).hasSize(1);
String deleteCascade = TWithPreInsertPersistAdapter.cascadeDelete.get(0);
assertThat(deleteCascade).isEqualTo("class org.tests.model.basic.TWithPreInsertChild:1");
}
@Test
@@ -26,7 +26,7 @@ public class TestDefaults extends BaseTestCase {
final List<String> current = LoggedSql.collect();
assertThat(current).isNotEmpty();
if (isMySql() || isMariaDB()) {
if (isMySql() || isMariaDB() || isOracle()) {
assertThat(current.get(0)).contains("insert into defaults_model_draft values (default);");
} else if (isSqlServer()) {
assertThat(current.get(0)).contains("insert into defaults_model_draft (id) values (?)");
@@ -9,12 +9,14 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.nio.charset.StandardCharsets;
public class TestConstructorPutfieldReplacement extends BaseTestCase {
@Test
public void test() {
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
EntityBean eb = (EntityBean) persistentFile;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
@@ -14,6 +14,8 @@ import org.tests.idkeys.db.GenKeySeqB;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@@ -24,6 +26,7 @@ public class TestGeneratedKeys extends BaseTestCase {
@ForPlatform(Platform.H2) // readSequenceValue is H2 specific
public void testGenKeySeqA() throws SQLException {
assumeTrue(idType() == IdType.SEQUENCE);
SpiEbeanServer server = spiEbeanServer();
try (Transaction tx = server.beginTransaction()) {
@@ -69,20 +72,34 @@ public class TestGeneratedKeys extends BaseTestCase {
}
private long readSequenceValue(Transaction tx, String sequence) throws SQLException {
Statement stm = null;
try {
stm = tx.connection().createStatement();
ResultSet rs = stm.executeQuery("select currval('" + sequence + "')");
rs.next();
String sql;
switch (spiEbeanServer().databasePlatform().getPlatform().base()) {
case H2 :
sql = "select currval('" + sequence + "')";
break;
case DB2 :
sql = "values previous value for " + sequence;
break;
case SQLSERVER :
sql = "select current_value from sys.sequences where name = '" + sequence + "'";
break;
case MARIADB :
throw new UnsupportedOperationException("reading sequence value outside of the current connection is not supported. "
+ "See https://mariadb.com/kb/en/previous-value-for-sequence_name/#description");
default :
throw new UnsupportedOperationException("reading sequence value from "
+ spiEbeanServer().databasePlatform().getPlatform()
+ " is not supported.");
}
try (Statement stm = tx.connection().createStatement()) {
ResultSet rs = stm.executeQuery(sql);
rs.next();
return rs.getLong(1);
} finally {
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
}
}
}
}
@@ -109,5 +126,25 @@ public class TestGeneratedKeys extends BaseTestCase {
assertNotNull(al.getId());
}
}
@Test
@ForPlatform({Platform.H2, Platform.MARIADB, Platform.SQLSERVER, Platform.DB2})
public void testGeneratedKeys() throws SQLException {
assumeTrue(idType() == IdType.SEQUENCE);
SpiEbeanServer server = spiEbeanServer();
List<Long> idList = new ArrayList<>(52);
try (Transaction tx = server.beginTransaction()) {
// bigger than increment
for (int i = 1; i < 52; i++) {
GenKeySeqA gks = new GenKeySeqA();
gks.setDescription("my description " + i);
server.save(gks);
assertFalse(idList.contains(gks.getId()));
idList.add(gks.getId());
}
}
}
}
@@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.CascadeType.PERSIST;
import static javax.persistence.CascadeType.ALL;
@Entity
public class TWithPreInsert implements TWithPreInsertCommon {
@@ -20,7 +20,7 @@ public class TWithPreInsert implements TWithPreInsertCommon {
private String title;
@OneToMany(cascade = PERSIST)
@OneToMany(cascade = ALL)
private List<TWithPreInsertChild> children = new ArrayList<>();
/**
@@ -2,6 +2,8 @@ package org.tests.model.basic;
public interface TWithPreInsertCommon {
Integer getId();
String getName();
void setName(String name);
@@ -4,8 +4,13 @@ import io.ebean.event.BeanPersistAdapter;
import io.ebean.event.BeanPersistRequest;
import org.tests.model.basic.TWithPreInsertCommon;
import java.util.ArrayList;
import java.util.List;
public class TWithPreInsertPersistAdapter extends BeanPersistAdapter {
public static List<String> cascadeDelete = new ArrayList<>();
@Override
public boolean isRegisterFor(Class<?> cls) {
return TWithPreInsertCommon.class.isAssignableFrom(cls);
@@ -32,4 +37,14 @@ public class TWithPreInsertPersistAdapter extends BeanPersistAdapter {
return super.preUpdate(request);
}
@Override
public boolean preDelete(BeanPersistRequest<?> request) {
TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean();
if (request.isCascade()) {
cascadeDelete.add(bean.getClass() + ":" + bean.getId());
} else {
bean.requestCascadeState(22);
}
return true;
}
}
@@ -0,0 +1,61 @@
package org.tests.model.elementcollection;
import io.ebean.annotation.Cache;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Cache
@Entity
public class EcblPerson2 {
@Id
long id;
String name;
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "person_id"))
List<EcPhone> phoneNumbers = new ArrayList<>();
@Version
long version;
@Override
public String toString() {
return "person id:" + id + " name:" + name + " phs:" + phoneNumbers;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<EcPhone> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<EcPhone> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -9,10 +9,10 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
class TestElementCollectionEmbeddedListCache extends BaseTestCase {
@Test
public void test() {
void test() {
EcblPerson person = new EcblPerson("CacheL");
person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
@@ -86,12 +86,10 @@ public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
assertThat(four.getPhoneNumbers().toString()).contains("61-07-11");
assertThat(four.getPhoneNumbers()).hasSize(1);
DB.delete(four);
sql = LoggedSql.collect();
assertThat(sql).hasSize(2);
LoggedSql.stop();
}
}
@@ -0,0 +1,99 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.test.LoggedSql;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
class TestElementCollectionEmbeddedListCache2 extends BaseTestCase {
@Test
void test() {
EcblPerson2 person = new EcblPerson2();
person.setName("CacheL");
person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
person.getPhoneNumbers().add(new EcPhone("64","021","4321"));
DB.save(person);
EcblPerson2 one = DB.find(EcblPerson2.class)
.setId(person.getId())
.fetch("phoneNumbers")
.findOne();
LoggedSql.start();
one.getPhoneNumbers().size();
List<String> sql = LoggedSql.collect();
assertThat(sql).isEmpty();
EcblPerson2 two = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
two.getPhoneNumbers().size();
assertThat(two.getPhoneNumbers().toString()).contains("64-021-1234", "64-021-4321");
sql = LoggedSql.collect();
assertThat(sql).isEmpty(); // cache hit
two.getPhoneNumbers().add(new EcPhone("61", "07", "11"));
two.getPhoneNumbers().remove(1);
DB.save(two);
sql = LoggedSql.collect();
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(5); // update of collection only
assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
assertSqlBind(sql.get(1));
assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
assertSqlBind(sql, 3, 4);
} else {
assertThat(sql).hasSize(3); // update of collection only
assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
assertSql(sql.get(1)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
}
EcblPerson2 three = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
assertThat(three.getPhoneNumbers().toString()).contains("61-07-11", "64-021-1234");
assertThat(three.getPhoneNumbers()).hasSize(2);
sql = LoggedSql.collect();
assertThat(sql).isEmpty(); // cache hit
three.setName("mod-3");
three.getPhoneNumbers().remove(0);
DB.save(three);
sql = LoggedSql.collect();
assertThat(sql).hasSize(5);
EcblPerson2 four = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
assertThat(four.getPhoneNumbers().toString()).contains("61-07-11");
assertThat(four.getPhoneNumbers()).hasSize(1);
DB.delete(four);
sql = LoggedSql.collect();
assertThat(sql).hasSize(2);
LoggedSql.stop();
}
}
@@ -0,0 +1,31 @@
package org.tests.model.embedded;
import io.ebean.annotation.DbArray;
import javax.persistence.*;
import java.util.List;
@Entity
public class EmbArrayMaster {
@Embeddable
public static class EmbArrayDetail {
@DbArray
List<String> vals;
public EmbArrayDetail(List<String> vals) {
this.vals = vals;
}
}
@Id
int id;
@ElementCollection
@CollectionTable(name = "test_array_detail", joinColumns = {@JoinColumn(name = "master_id")})
List<EmbArrayDetail> details;
public EmbArrayMaster(List<EmbArrayDetail> details) {
this.details = details;
}
}
@@ -0,0 +1,21 @@
package org.tests.model.embedded;
import io.ebean.DB;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
class TestEmbeddedDbArray {
/**
* Failing test case for #2477
*/
@Disabled
@Test
void testArrayInsert() {
EmbArrayMaster t = new EmbArrayMaster(singletonList(new EmbArrayMaster.EmbArrayDetail(emptyList())));
DB.insert(t);
}
}
@@ -33,7 +33,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 1 != 0")
@Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = Platform.H2)
@Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = {Platform.H2, Platform.ORACLE})
List<MnyNode> bit1Relations;
@ManyToMany
@@ -41,7 +41,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 1 != 0")
@Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = Platform.H2)
@Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = {Platform.H2, Platform.ORACLE})
List<MnyNode> bit1ReverseRelations;
@ManyToMany
@@ -49,7 +49,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 2 != 0")
@Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = Platform.H2)
@Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = {Platform.H2, Platform.ORACLE})
List<MnyNode> bit2Relations;
@ManyToMany
@@ -57,7 +57,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 2 != 0")
@Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = Platform.H2)
@Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = {Platform.H2, Platform.ORACLE})
List<MnyNode> bit2ReverseRelations;
@ManyToMany
@@ -7,6 +7,7 @@ import javax.persistence.Version;
import java.nio.file.Path;
import java.sql.Date;
import java.time.*;
import java.util.Calendar;
@Entity
public class SomeNewTypesBean {
@@ -58,6 +59,8 @@ public class SomeNewTypesBean {
Duration duration;
Calendar calendar;
public Long getId() {
return id;
}
@@ -217,4 +220,12 @@ public class SomeNewTypesBean {
public void setDuration(Duration duration) {
this.duration = duration;
}
public Calendar getCalendar() {
return calendar;
}
public void setCalendar(final Calendar calendar) {
this.calendar = calendar;
}
}
@@ -12,14 +12,12 @@ import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
public class ParentQueryTest extends BaseTestCase {
class ParentQueryTest extends BaseTestCase {
@Test
public void QueryParentCollectionFetch() {
void queryParentCollectionFetch() {
List<Data> exampleData = new ArrayList<>();
exampleData.add(new Data(0));
exampleData.add(new Data(1));
@@ -40,7 +38,7 @@ public class ParentQueryTest extends BaseTestCase {
List<Parent> partial = DB.find(Parent.class).where().ge("val", 1001).findList();
assertNotNull(partial.get(0).getData());
assertThat(partial.get(0).getMore()).startsWith("PQT-");
assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0);
assertThat(partial.get(0).getData()).hasSize(3);
}
}
@@ -3,26 +3,25 @@ package org.tests.text.csv;
import io.ebean.DB;
import io.ebean.TransactionalTestCase;
import io.ebean.text.csv.CsvReader;
import io.ebean.util.IOUtils;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.net.URL;
import java.util.Locale;
public class TestCsvReader extends TransactionalTestCase {
@Test
public void test() {
public void test() throws Exception {
ResetBasicData.reset();
try {
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
File f = new File(resource.getFile());
FileReader reader = new FileReader(f);
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
try (Reader reader = IOUtils.newReader(resource.openStream())){
CsvReader<Customer> csvReader = DB.getDefault().createCsvReader(Customer.class);
@@ -32,15 +31,13 @@ public class TestCsvReader extends TransactionalTestCase {
// csvReader.addProperty("id");
csvReader.addProperty("status");
csvReader.addProperty("name");
csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH);
csvReader.addProperty("billingAddress.line1");
csvReader.addProperty("billingAddress.city");
csvReader.addProperty("billingAddress.country.code");
csvReader.process(reader);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@@ -4,12 +4,14 @@ import io.ebean.DB;
import io.ebean.TransactionalTestCase;
import io.ebean.text.csv.CsvReader;
import io.ebean.text.csv.DefaultCsvCallback;
import io.ebean.util.IOUtils;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Customer;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.net.URL;
import java.util.Locale;
import static org.assertj.core.api.Assertions.assertThat;
@@ -19,41 +21,40 @@ public class TestCsvReaderWithCallback extends TransactionalTestCase {
public void test() throws Throwable {
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
File f = new File(resource.getFile());
try (Reader reader = IOUtils.newReader(resource.openStream())) {
FileReader reader = new FileReader(f);
CsvReader<Customer> csvReader = DB.getDefault().createCsvReader(Customer.class);
CsvReader<Customer> csvReader = DB.getDefault().createCsvReader(Customer.class);
csvReader.setPersistBatchSize(2);
csvReader.setLogInfoFrequency(3);
csvReader.setPersistBatchSize(2);
csvReader.setLogInfoFrequency(3);
csvReader.addIgnore();
// csvReader.addProperty("id");
csvReader.addProperty("status");
csvReader.addProperty("name");
csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH);
csvReader.addProperty("billingAddress.line1");
csvReader.addProperty("billingAddress.city");
// processor.addReference("billingAddress.country.code");
csvReader.addProperty("billingAddress.country.code");
csvReader.addIgnore();
// csvReader.addProperty("id");
csvReader.addProperty("status");
csvReader.addProperty("name");
csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
csvReader.addProperty("billingAddress.line1");
csvReader.addProperty("billingAddress.city");
// processor.addReference("billingAddress.country.code");
csvReader.addProperty("billingAddress.country.code");
int before = DB.find(Customer.class).findCount();
int before = DB.find(Customer.class).findCount();
csvReader.process(reader, new DefaultCsvCallback<Customer>() {
csvReader.process(reader, new DefaultCsvCallback<Customer>() {
@Override
public void processBean(int row, String[] lineContent, Customer cust) {
@Override
public void processBean(int row, String[] lineContent, Customer cust) {
server.save(cust.getBillingAddress(), transaction);
server.save(cust, transaction);
server.save(cust.getBillingAddress(), transaction);
server.save(cust, transaction);
}
}
});
});
int after = DB.find(Customer.class).findCount();
assertThat(after).isEqualTo(before + 9);
int after = DB.find(Customer.class).findCount();
assertThat(after).isEqualTo(before + 9);
}
}
}
@@ -4,9 +4,12 @@ import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.text.json.EJson;
import io.ebean.text.json.JsonContext;
import io.ebean.util.IOUtils;
import org.junit.jupiter.api.Test;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -20,19 +23,20 @@ public class TestJsonSimple extends BaseTestCase {
public void test() throws IOException {
InputStream is = this.getClass().getResourceAsStream("/example1.json");
String jsonText;
try (final Reader reader = IOUtils.newReader(is)) {
LineNumberReader lineReader = new LineNumberReader(reader);
final Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
LineNumberReader lineReader = new LineNumberReader(reader);
String readLine;
String readLine;
StringBuilder sb = new StringBuilder();
while ((readLine = lineReader.readLine()) != null) {
sb.append(readLine);
}
StringBuilder sb = new StringBuilder();
while ((readLine = lineReader.readLine()) != null) {
sb.append(readLine);
jsonText = sb.toString();
}
String jsonText = sb.toString();
Object el = EJson.parse(jsonText);
assertThat(el).isNotNull();
@@ -10,6 +10,7 @@ import org.tests.model.types.SomeNewTypesBean;
import java.io.File;
import java.nio.file.Paths;
import java.time.*;
import java.util.Calendar;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -44,6 +45,7 @@ public class TestNewTypes extends BaseTestCase {
bean.setPath(Paths.get(TEMP_PATH));
bean.setPeriod(Period.of(4,3,2));
bean.setDuration(Duration.ofMinutes(5));
bean.setCalendar(Calendar.getInstance());
DB.save(bean);
@@ -104,6 +106,10 @@ public class TestNewTypes extends BaseTestCase {
list = DB.find(SomeNewTypesBean.class).where().eq("duration", Duration.ofMinutes(5)).findList();
assertThat(list).isNotEmpty();
// Calendar.getInstance() returns an implementation, which then has to be remapped to ScalarTypeCalendar
list = DB.find(SomeNewTypesBean.class).where().le("calendar", Calendar.getInstance()).findList();
assertThat(list).isNotEmpty();
SomeNewTypesBean fetched = DB.find(SomeNewTypesBean.class, bean.getId());
assertEquals(bean.getZoneId(), fetched.getZoneId());
@@ -122,6 +128,7 @@ public class TestNewTypes extends BaseTestCase {
assertEquals(bean.getPath(), fetched.getPath());
assertEquals(bean.getPeriod(), fetched.getPeriod());
assertEquals(bean.getDuration(), fetched.getDuration());
assertEquals(bean.getCalendar(), fetched.getCalendar());
String asJson = DB.json().toJson(fetched);
@@ -139,10 +146,10 @@ public class TestNewTypes extends BaseTestCase {
assertThat(toBean.getOffsetDateTime()).isEqualToIgnoringNanos(bean.getOffsetDateTime());
assertEquals(bean.getLocalTime().toSecondOfDay(), toBean.getLocalTime().toSecondOfDay());
assertEquals(bean.getInstant().toEpochMilli() / 1000, toBean.getInstant().toEpochMilli() / 1000);
// FIXME: This test fails on Windows with: expected:<\tmp> but was:<C:\tmp>
assertEquals(bean.getPath(), toBean.getPath());
assertEquals(bean.getPeriod(), toBean.getPeriod());
assertEquals(bean.getDuration(), toBean.getDuration());
assertEquals(bean.getCalendar(), toBean.getCalendar());
}