use of org.apache.cayenne.map.DbJoin in project cayenne by apache.
the class IngresMergerTokenFactory method createAddRelationshipToDb.
@Override
public MergerToken createAddRelationshipToDb(DbEntity entity, final DbRelationship rel) {
return new AddRelationshipToDb(entity, rel) {
@Override
public List<String> createSql(DbAdapter adapter) {
if (!rel.isToMany() && rel.isToPK() && !rel.isToDependentPK()) {
DbEntity source = (DbEntity) rel.getSourceEntity();
QuotingStrategy context = adapter.getQuotingStrategy();
StringBuilder buf = new StringBuilder();
StringBuilder refBuf = new StringBuilder();
buf.append("ALTER TABLE ");
buf.append(context.quotedFullyQualifiedName(source));
// requires the ADD CONSTRAINT statement
buf.append(" ADD CONSTRAINT ");
String name = "U_" + rel.getSourceEntity().getName() + "_" + (long) (System.currentTimeMillis() / (Math.random() * 100000));
buf.append(context.quotedIdentifier(rel.getSourceEntity(), name));
buf.append(" FOREIGN KEY (");
boolean first = true;
for (DbJoin join : rel.getJoins()) {
if (!first) {
buf.append(", ");
refBuf.append(", ");
} else {
first = false;
}
buf.append(context.quotedSourceName(join));
refBuf.append(context.quotedTargetName(join));
}
buf.append(") REFERENCES ");
buf.append(context.quotedFullyQualifiedName((DbEntity) rel.getTargetEntity()));
buf.append(" (");
buf.append(refBuf.toString());
buf.append(')');
// also make sure we delete dependent FKs
buf.append(" ON DELETE CASCADE");
String fksql = buf.toString();
if (fksql != null) {
return Collections.singletonList(fksql);
}
}
return Collections.emptyList();
}
};
}
use of org.apache.cayenne.map.DbJoin in project cayenne by apache.
the class EntityMergeSupportIT method testMerging.
@Test
public void testMerging() {
DbEntity dbEntity1 = new DbEntity("NEW_TABLE");
DbAttribute e1col1 = new DbAttribute("ID", Types.INTEGER, dbEntity1);
e1col1.setMandatory(true);
e1col1.setPrimaryKey(true);
dbEntity1.addAttribute(e1col1);
DbAttribute e1col2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity1);
e1col2.setMaxLength(10);
e1col2.setMandatory(false);
dbEntity1.addAttribute(e1col2);
map.addDbEntity(dbEntity1);
DbEntity dbEntity2 = new DbEntity("NEW_TABLE2");
DbAttribute e2col1 = new DbAttribute("ID", Types.INTEGER, dbEntity2);
e2col1.setMandatory(true);
e2col1.setPrimaryKey(true);
dbEntity2.addAttribute(e2col1);
DbAttribute e2col2 = new DbAttribute("FK", Types.INTEGER, dbEntity2);
dbEntity2.addAttribute(e2col2);
map.addDbEntity(dbEntity2);
// create db relationships
DbRelationship rel1To2 = new DbRelationship("rel1To2");
rel1To2.setSourceEntity(dbEntity1);
rel1To2.setTargetEntityName(dbEntity2);
rel1To2.setToMany(true);
rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
dbEntity1.addRelationship(rel1To2);
DbRelationship rel2To1 = new DbRelationship("rel2To1");
rel2To1.setSourceEntity(dbEntity2);
rel2To1.setTargetEntityName(dbEntity1);
rel2To1.setToMany(false);
rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
dbEntity2.addRelationship(rel2To1);
assertSame(rel1To2, rel2To1.getReverseRelationship());
assertSame(rel2To1, rel1To2.getReverseRelationship());
ObjEntity objEntity1 = new ObjEntity("NewTable");
objEntity1.setDbEntity(dbEntity1);
map.addObjEntity(objEntity1);
ObjEntity objEntity2 = new ObjEntity("NewTable2");
objEntity2.setDbEntity(dbEntity2);
map.addObjEntity(objEntity2);
EntityMergeSupport entityMergeSupport = new EntityMergeSupport(new DefaultObjectNameGenerator(NoStemStemmer.getInstance()), NamePatternMatcher.EXCLUDE_ALL, true, true, false);
assertTrue(entityMergeSupport.synchronizeWithDbEntities(Arrays.asList(objEntity1, objEntity2)));
assertNotNull(objEntity1.getAttribute("name"));
assertNotNull(objEntity1.getRelationship("newTable2s"));
assertNotNull(objEntity2.getRelationship("newTable"));
assertEquals(objEntity1.getRelationship("newTable2s").getDeleteRule(), DeleteRule.DEFAULT_DELETE_RULE_TO_MANY);
assertEquals(objEntity2.getRelationship("newTable").getDeleteRule(), DeleteRule.DEFAULT_DELETE_RULE_TO_ONE);
map.removeObjEntity(objEntity2.getName());
map.removeObjEntity(objEntity1.getName());
map.removeDbEntity(dbEntity2.getName());
map.removeDbEntity(dbEntity1.getName());
}
use of org.apache.cayenne.map.DbJoin in project cayenne by apache.
the class MergerFactoryIT method testAddForeignKeyAfterTable.
@Test
public void testAddForeignKeyAfterTable() throws Exception {
dropTableIfPresent("NEW_TABLE");
assertTokensAndExecute(0, 0);
DbEntity dbEntity = new DbEntity("NEW_TABLE");
attr(dbEntity, "ID", Types.INTEGER, true, true);
attr(dbEntity, "NAME", Types.VARCHAR, false, false).setMaxLength(10);
attr(dbEntity, "ARTIST_ID", Types.BIGINT, false, false);
map.addDbEntity(dbEntity);
DbEntity artistDbEntity = map.getDbEntity("ARTIST");
assertNotNull(artistDbEntity);
assertTokensAndExecute(1, 0);
assertTokensAndExecute(0, 0);
// relation from new_table to artist
DbRelationship r1 = new DbRelationship("toArtistR1");
r1.setSourceEntity(dbEntity);
r1.setTargetEntityName(artistDbEntity);
r1.setToMany(false);
r1.addJoin(new DbJoin(r1, "ARTIST_ID", "ARTIST_ID"));
dbEntity.addRelationship(r1);
// relation from artist to new_table
DbRelationship r2 = new DbRelationship("toNewTableR2");
r2.setSourceEntity(artistDbEntity);
r2.setTargetEntityName(dbEntity);
r2.setToMany(true);
r2.addJoin(new DbJoin(r2, "ARTIST_ID", "ARTIST_ID"));
artistDbEntity.addRelationship(r2);
assertTokensAndExecute(1, 0);
assertTokensAndExecute(0, 0);
// remove relationships
dbEntity.removeRelationship(r1.getName());
artistDbEntity.removeRelationship(r2.getName());
resolver.refreshMappingCache();
/*
* Add Relationship ARTIST->NEW_TABLE To Model -- Not generated any more
* Drop Relationship NEW_TABLE->ARTIST To DB
* */
assertTokensAndExecute(1, 0);
assertTokensAndExecute(0, 0);
// clear up
// map.removeObjEntity(objEntity.getName(), true);
map.removeDbEntity(dbEntity.getName(), true);
resolver.refreshMappingCache();
// assertNull(map.getObjEntity(objEntity.getName()));
assertNull(map.getDbEntity(dbEntity.getName()));
assertFalse(map.getDbEntities().contains(dbEntity));
assertTokensAndExecute(1, 0);
assertTokensAndExecute(0, 0);
}
use of org.apache.cayenne.map.DbJoin in project cayenne by apache.
the class TokensReverseTest method testReverses.
@Test
public void testReverses() {
DbAttribute attr = dbAttr().build();
DbEntity entity = dbEntity().attributes(attr).build();
DbRelationship rel = new DbRelationship("rel");
rel.setSourceEntity(entity);
rel.addJoin(new DbJoin(rel, attr.getName(), "dontKnow"));
testOneToOneReverse(factory().createAddColumnToDb(entity, attr));
testOneToOneReverse(factory().createAddColumnToModel(entity, attr));
testOneToOneReverse(factory().createDropColumnToDb(entity, attr));
testOneToOneReverse(factory().createDropColumnToModel(entity, attr));
testOneToOneReverse(factory().createAddRelationshipToDb(entity, rel));
testOneToOneReverse(factory().createAddRelationshipToModel(entity, rel));
testOneToOneReverse(factory().createDropRelationshipToDb(entity, rel));
testOneToOneReverse(factory().createDropRelationshipToModel(entity, rel));
testOneToOneReverse(factory().createCreateTableToDb(entity));
testOneToOneReverse(factory().createCreateTableToModel(entity));
testOneToOneReverse(factory().createDropTableToDb(entity));
testOneToOneReverse(factory().createDropTableToModel(entity));
testOneToOneReverse(factory().createSetAllowNullToDb(entity, attr));
testOneToOneReverse(factory().createSetAllowNullToModel(entity, attr));
testOneToOneReverse(factory().createSetNotNullToDb(entity, attr));
testOneToOneReverse(factory().createSetNotNullToModel(entity, attr));
DbAttribute attr2 = dbAttr().build();
testOneToOneReverse(factory().createSetColumnTypeToDb(entity, attr, attr2));
testOneToOneReverse(factory().createSetColumnTypeToModel(entity, attr, attr2));
testOneToOneReverse(factory().createSetPrimaryKeyToDb(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
testOneToOneReverse(factory().createSetPrimaryKeyToModel(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
testOneToOneReverse(factory().createSetValueForNullToDb(entity, attr, new DefaultValueForNullProvider()));
}
use of org.apache.cayenne.map.DbJoin in project cayenne by apache.
the class EJBQLPathAnaliserTranslator method visitMemberOf.
@Override
public boolean visitMemberOf(EJBQLExpression expression) {
if (expression.getChildrenCount() != 2) {
throw new EJBQLException("MEMBER OF must have exactly two children, got: " + expression.getChildrenCount());
}
if (!(expression.getChild(1) instanceof EJBQLPath)) {
throw new EJBQLException("Second child of the MEMBER OF must be a collection path, got: " + expression.getChild(1));
}
QuotingStrategy quoter = context.getQuotingStrategy();
EJBQLPath path = (EJBQLPath) expression.getChild(1);
// make sure the ID for the path does not overlap with other condition
// joins...
String id = path.getAbsolutePath();
String correlatedEntityId = path.getId();
ClassDescriptor correlatedEntityDescriptor = context.getEntityDescriptor(correlatedEntityId);
String correlatedTableName = quoter.quotedFullyQualifiedName(correlatedEntityDescriptor.getEntity().getDbEntity());
String correlatedTableAlias = context.getTableAlias(correlatedEntityId, correlatedTableName);
String subqueryId = context.createIdAlias(id);
ClassDescriptor targetDescriptor = context.getEntityDescriptor(subqueryId);
if (expression.isNegated()) {
context.append(" NOT");
}
context.append(" EXISTS (SELECT 1 FROM ");
String subqueryTableName = quoter.quotedFullyQualifiedName(targetDescriptor.getEntity().getDbEntity());
String subqueryRootAlias = context.getTableAlias(subqueryId, subqueryTableName);
ObjRelationship relationship = correlatedEntityDescriptor.getEntity().getRelationship(path.getRelativePath());
if (relationship.getDbRelationshipPath().contains(".")) {
// if the DbRelationshipPath contains '.', the relationship is
// flattened
subqueryRootAlias = processFlattenedRelationShip(subqueryRootAlias, relationship);
} else {
// not using "AS" to separate table name and alias name - OpenBase
// doesn't
// support "AS", and the rest of the databases do not care
context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
}
context.append(" WHERE");
DbRelationship correlatedJoinRelationship = context.getIncomingRelationships(new EJBQLTableId(id)).get(0);
for (DbJoin join : correlatedJoinRelationship.getJoins()) {
context.append(' ').append(subqueryRootAlias).append('.').append(join.getTargetName()).append(" = ");
context.append(correlatedTableAlias).append('.').append(quoter.quotedSourceName(join));
context.append(" AND");
}
// translate subquery_root_id = LHS_of_memberof
EJBQLEquals equals = new EJBQLEquals(-1);
EJBQLIdentificationVariable identifier = new EJBQLIdentificationVariable(-1);
identifier.setText(subqueryId);
equals.jjtAddChild(identifier, 0);
equals.jjtAddChild((Node) expression.getChild(0), 1);
equals.visit(this);
context.append(")");
return false;
}
Aggregations