package jef.database.dynamic;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jef.codegen.EntityEnhancer;
import jef.database.DbClient;
import jef.database.QB;
import jef.database.Transaction;
import jef.database.dialect.ColumnType;
import jef.database.meta.MetaHolder;
import jef.database.meta.TupleMetadata;
import jef.database.query.Query;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.DatabaseInit;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"),
@DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"),
@DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"),
@DataSource(name="derby",url="jdbc:derby:./db;create=true"),
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""),
@DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"),
@DataSource(name = "sqlserver", url = "${sqlserver.url}",user="${sqlserver.user}",password="${sqlserver.password}")
})
public class DynamicExtendsTest extends org.junit.Assert{
private DbClient db;
@DatabaseInit
public void setup() throws SQLException{
db.dropTable(Status.class);
db.createTable(Status.class);
db.merge(new Status(0,"不可用"));
db.merge(new Status(1,"正常"));
db.merge(new Status(2,"警戒"));
db.merge(new Status(3,"异常"));
db.merge(new Status(4,"短路"));
db.merge(new Status(5,"网元故障"));
}
/**
* 测试两种动态属性扩展的实现方式,
*
* 当使用[]作为SQLSERVER的关键字回避方式后,
*
* @throws SQLException
*/
@Test
public void testAttrTable() throws SQLException {
// ORMConfig.getInstance().setUseOuterJoin(false);
// ORMConfig.getInstance().setCacheLevel1(true);
// ORMConfig.getInstance().setCacheDebug(true);
initUserExtendInfo();
db.createTable(UserEx.class);
Transaction db=this.db.startTransaction();
UserEx user = new UserEx();
user.setComm("TEST of USEREXT");
user.setName("张三");
user.setStatus(2);
user.setAtribute("QQ", "213324333");
user.setAtribute("E_MAIL", "dsff@google.com");
user.setAtribute("address", "重点萨芬撒地方");
user.setAtribute("day", 123);
db.insert(user);
user = new UserEx();
user.setComm("TEST of 2");
user.setName("李四");
user.setAtribute("QQ", "77853431");
user.setAtribute("E_MAIL", "Lisi@baidu.com");
user.setAtribute("address", "China town");
user.setAtribute("day", 8873);
user.setStObj(new Status(6,"测试"));
db.insert(user);
{
List<UserEx> list=db.selectByField(UserEx.Field.name, "李四");
UserEx ex=list.get(0);
System.out.println(ex.getName());
System.out.println(ex.getAtribute("QQ"));
System.out.println(ex.getAtribute("E_MAIL"));
System.out.println(ex.getAtribute("address"));
System.out.println(ex.getAtribute("day"));
assertNotNull(ex.getId());
assertEquals(8873, ex.getAtribute("day"));
assertEquals("Lisi@baidu.com", ex.getAtribute("E_MAIL"));
assertEquals("77853431", ex.getAtribute("QQ"));
ex.setAtribute("QQ", "6320535");
int i=db.update(ex);
assertEquals(0, i); //由于记录本身没有字段变化,仅级联对象变化,更新后记录行数仅返回主表更新行数,所以为0
}
{
List<UserEx> list=db.selectByField(UserEx.Field.name, "李四");
UserEx ex=list.get(0);
assertEquals(8873, ex.getAtribute("day"));
assertEquals("6320535", ex.getAtribute("QQ"));
ex.setComm("TestUpdated2");
int i=db.update(ex);
assertEquals(1, i);
}
{
List<UserEx> list=db.selectByField(UserEx.Field.name, "李四");
UserEx ex=list.get(0);
assertEquals("TestUpdated2", ex.getComm());
int i=db.delete(ex);
assertEquals(1, i);
int j=db.delete(QB.create(UserEx.class));
assertEquals(1, i);
}
db.commit(true);
}
@Test
public void testRealDynmicTable() throws SQLException {
initResourceMetadata();
db.createTable(new DynaResource("桌子"));
db.createTable(new DynaResource("电视机"));
db.createTable(new DynaResource("计算机"));
String id1;
String id2;
String id3;
{
List<DynaResource> list=new ArrayList<DynaResource>();
DynaResource resource = new DynaResource("桌子");
resource.setName("一张大桌子");
resource.setElevation(120.243);
resource.setPrice(199);
resource.setStatus(0);
resource.setAtribute("height", 100);
resource.setAtribute("width", 100);
resource.setAtribute("type", "SQUARE");
list.add(resource);
resource = new DynaResource("桌子");
resource.setName("一张大桌子");
resource.setElevation(120.243);
resource.setPrice(199);
resource.setStatus(0);
resource.setAtribute("height", 100);
resource.setAtribute("width", 100);
resource.setAtribute("type", "SQUARE");
list.add(resource);
db.batchInsert(list);
id1= list.get(0).getIndexCode();
id2 = list.get(1).getIndexCode();
}
{
DynaResource resource = new DynaResource("桌子");
resource.setIndexCode(id1);
resource.setStatus(1);
resource.setElevation(200.0);
resource.setAtribute("width", 250);
db.update(resource);
DynaResource loaded=db.load(resource);
loaded.setAtribute("height", 250);
db.update(loaded);
}
{
System.out.println("====================测试关联====================");
List<DynaResource> tables=db.select(QB.create(DynaResource.class, "桌子"));
for(DynaResource t:tables){
System.out.println(t.getStatusObj().getData());
}
}
{
DynaResource r1= new DynaResource("桌子");
r1.setStatus(1);
r1.setIndexCode(id1);
r1.setElevation(200.0);
r1.setAtribute("width", 250);
DynaResource r2 = new DynaResource("桌子");
r2.setStatus(1);
r2.setIndexCode(id2);
r2.setElevation(200.0);
r2.setAtribute("width", 250);
db.batchUpdate(Arrays.asList(r1,r2));
}
{
Transaction tx=db.startTransaction();
DynaResource r1= new DynaResource("桌子");
r1.setIndexCode(id1);
DynaResource r2 = new DynaResource("桌子");
r2.setIndexCode(id2);
tx.executeBatchDeletion(Arrays.asList(r1,r2));
tx.rollback(true);
}
{
DynaResource r1= new DynaResource("桌子");
r1.setIndexCode(id2);
db.delete(r1);
}
{
DynaResource resource = new DynaResource("电视机");
resource.setName("一台电视机");
resource.setElevation(120.243);
resource.setPrice(4280);
resource.setStatus(2);
resource.setAtribute("pixel", "1920x1080");
resource.setAtribute("brand", "Sharp");
db.insert(resource);
id2 = resource.getIndexCode();
}
{
DynaResource resource = new DynaResource("计算机");
resource.setName("一台计算机");
resource.setElevation(1.234);
resource.setPrice(6999);
resource.setStatus(3);
resource.setAtribute("CPU", "Intel XEON E4200");
resource.setAtribute("mainboard", "gigabyte 227LE");
resource.setAtribute("memory", "4Gx2");
resource.setAtribute("disk_size", "Seagate 2T");
resource.setAtribute("DISPLAY_CARD", "ATI 9600");
resource.setAtribute("monitor", "PHILIPS 227E'");
resource.setAtribute("NET", "Realtek PCIe 1000M");
db.insert(resource);
id3 = resource.getIndexCode();
}
{
DynaResource res = db.load(DynaResource.class, "桌子", "123");
System.out.println(res);
Query<DynaResource> q = QB.create(DynaResource.class,"桌子");
q.terms()
.gt("width", 100).or().gt("height", 100)
.and().not().in("type", new String[] { "CRICLE", "BOX" });
System.out.println(q.getConditions());
db.select(q);
}
}
/**
* 初始化商品资源的扩展字段信息
*/
private void initResourceMetadata() {
TupleMetadata meta = new TupleMetadata("桌子");
meta.addColumn("height", new ColumnType.Int(8));
meta.addColumn("width", new ColumnType.Int(8));
meta.addColumn("type", new ColumnType.Varchar(40));
MetaHolder.putDynamicMeta(meta);
meta = new TupleMetadata("电视机");
meta.addColumn("pixel", new ColumnType.Varchar(20));
meta.addColumn("brand", new ColumnType.Varchar(40));
meta.addColumn("color", new ColumnType.Boolean().defaultIs(true));
MetaHolder.putDynamicMeta(meta);
meta = new TupleMetadata("计算机");
meta.addColumn("CPU", new ColumnType.Varchar(20));
meta.addColumn("mainboard", new ColumnType.Varchar(40));
meta.addColumn("memory", new ColumnType.Varchar(40));
meta.addColumn("disk_size", new ColumnType.Varchar(64));
meta.addColumn("DISPLAY_CARD", new ColumnType.Varchar(64));
meta.addColumn("monitor", new ColumnType.Varchar(64));
meta.addColumn("NET", new ColumnType.Varchar(64));
MetaHolder.putDynamicMeta(meta);
}
/**
* 初始化用户的扩展字段信息
*/
private void initUserExtendInfo() {
TupleMetadata meta = new TupleMetadata("USER_EX");
meta.addColumn("QQ", new ColumnType.Varchar(20));
meta.addColumn("E_MAIL", new ColumnType.Varchar(40));
meta.addColumn("address", new ColumnType.Varchar(40));
meta.addColumn("day", new ColumnType.Int(10));
MetaHolder.putDynamicMeta(meta);
}
}