#693 - ENH: Add support for mapping @DbJson to list of scalar types like List<String>

This commit is contained in:
Robin Bygrave
2016-05-05 16:36:16 +12:00
parent 8c86976e68
commit 2c95d9dc9a
30 changed files with 524 additions and 98 deletions
@@ -13,16 +13,16 @@ public class DbTypeMapTest {
PostgresPlatform pg = new PostgresPlatform();
DbTypeMap dbTypeMap = pg.getDbTypeMap();
assertThat(dbTypeMap.lookup("clob").renderType(0,0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("CLOB").renderType(0, 0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("clob", false).renderType(0,0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("CLOB", false).renderType(0, 0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("varchar").renderType(20,0)).isEqualTo("varchar(20)");
assertThat(dbTypeMap.lookup("varchar", true).renderType(20,0)).isEqualTo("varchar(20)");
assertThat(dbTypeMap.lookup("json").renderType(0,0)).isEqualTo("json");
assertThat(dbTypeMap.lookup("jsonb").renderType(0,0)).isEqualTo("jsonb");
assertThat(dbTypeMap.lookup("jsonclob").renderType(0,0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("jsonblob").renderType(0,0)).isEqualTo("bytea");
assertThat(dbTypeMap.lookup("jsonvarchar").renderType(200,0)).isEqualTo("varchar(200)");
assertThat(dbTypeMap.lookup("json", false).renderType(0,0)).isEqualTo("json");
assertThat(dbTypeMap.lookup("jsonb", false).renderType(0,0)).isEqualTo("jsonb");
assertThat(dbTypeMap.lookup("jsonclob", false).renderType(0,0)).isEqualTo("text");
assertThat(dbTypeMap.lookup("jsonblob", false).renderType(0,0)).isEqualTo("bytea");
assertThat(dbTypeMap.lookup("jsonvarchar", false).renderType(200,0)).isEqualTo("varchar(200)");
}
@@ -31,7 +31,7 @@ public class DbTypeMapTest {
DbTypeMap dbTypeMap = DbTypeMap.logicalTypes();
DbType dbType = dbTypeMap.get(DbType.JSON);
DbType json = dbTypeMap.lookup("json");
DbType json = dbTypeMap.lookup("json", false);
assertThat(dbType).isSameAs(json);
}
@@ -246,4 +246,18 @@ public class EJsonTests {
}
@Test
public void parse_when_null() throws IOException {
Object nothing = EJson.parse((String) null);
Assert.assertNull(nothing);
}
@Test
public void parseList_when_null() throws IOException {
Object nothing = EJson.parseList((String) null);
Assert.assertNull(nothing);
}
}
@@ -98,7 +98,7 @@ public class CachedBeanDataSerializeTest extends BaseTestCase {
TBytesOnly bean = new TBytesOnly();
bean.setId(42);
bean.setContent(stringContent.getBytes("UTF8"));
bean.setContent(stringContent.getBytes("UTF-8"));
BeanDescriptor<TBytesOnly> desc = getBeanDescriptor(TBytesOnly.class);
CachedBeanData extract = CachedBeanDataFromBean.extract(desc, (EntityBean)bean);
@@ -0,0 +1,78 @@
package com.avaje.tests.json;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.json.EBasicJsonList;
import org.avaje.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
public class TestDbJson_List extends BaseTestCase {
private EBasicJsonList bean = new EBasicJsonList();
private EBasicJsonList found;
@Test
public void insert() {
bean.setName("stuff");
List<String> tags = bean.getTags();
tags.add("one");
tags.add("two");
Ebean.save(bean);
found = Ebean.find(EBasicJsonList.class, bean.getId());
assertThat(found.getTags()).containsExactly("one", "two");
json_parse_format();
update_when_notDirty();
update_when_dirty();
}
//@Test//(dependsOnMethods = "insert")
public void json_parse_format() {
String asJson = Ebean.json().toJson(found);
assertThat(asJson).contains("\"tags\":[\"one\",\"two\"]");
assertThat(asJson).contains("\"id\":");
EBasicJsonList fromJson = Ebean.json().toBean(EBasicJsonList.class, asJson);
assertEquals(found.getId(), fromJson.getId());
assertEquals(found.getId(), fromJson.getId());
assertEquals(found.getName(), fromJson.getName());
assertThat(fromJson.getTags()).containsExactly("one", "two");
}
//@Test//(dependsOnMethods = "insert")
public void update_when_notDirty() {
found.setName("mod");
LoggedSqlCollector.start();
Ebean.save(found);
List<String> sql = LoggedSqlCollector.stop();
// we don't update the phone numbers (as they are not dirty)
assertThat(sql.get(0)).contains("update ebasic_json_list set name=?, version=? where");
}
public void update_when_dirty() {
//found.setName("modAgain");
found.getTags().add("three");
LoggedSqlCollector.start();
Ebean.save(found);
List<String> sql = LoggedSqlCollector.stop();
// we don't update the phone numbers (as they are not dirty)
assertThat(sql.get(0)).contains("update ebasic_json_list set tags=?, version=? where");
}
}
@@ -0,0 +1,57 @@
package com.avaje.tests.model.json;
import com.avaje.ebean.annotation.DbJson;
import com.avaje.ebean.annotation.DbJsonType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
import java.util.ArrayList;
import java.util.List;
@Entity
public class EBasicJsonList {
@Id
Long id;
String name;
@DbJson(length = 100, storage = DbJsonType.VARCHAR)
List<String> tags = new ArrayList<String>();
@Version
Long version;
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<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}