Search in sources :

Example 36 with DbJoin

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();
        }
    };
}
Also used : DbAdapter(org.apache.cayenne.dba.DbAdapter) DbEntity(org.apache.cayenne.map.DbEntity) AddRelationshipToDb(org.apache.cayenne.dbsync.merge.token.db.AddRelationshipToDb) DbJoin(org.apache.cayenne.map.DbJoin) QuotingStrategy(org.apache.cayenne.dba.QuotingStrategy)

Example 37 with DbJoin

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());
}
Also used : DefaultObjectNameGenerator(org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator) EntityMergeSupport(org.apache.cayenne.dbsync.merge.context.EntityMergeSupport) ObjEntity(org.apache.cayenne.map.ObjEntity) DbEntity(org.apache.cayenne.map.DbEntity) DbRelationship(org.apache.cayenne.map.DbRelationship) DbAttribute(org.apache.cayenne.map.DbAttribute) DbJoin(org.apache.cayenne.map.DbJoin) Test(org.junit.Test)

Example 38 with DbJoin

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);
}
Also used : DbEntity(org.apache.cayenne.map.DbEntity) DbRelationship(org.apache.cayenne.map.DbRelationship) DbJoin(org.apache.cayenne.map.DbJoin) Test(org.junit.Test)

Example 39 with DbJoin

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()));
}
Also used : DbEntity(org.apache.cayenne.map.DbEntity) DbRelationship(org.apache.cayenne.map.DbRelationship) DbAttribute(org.apache.cayenne.map.DbAttribute) DbJoin(org.apache.cayenne.map.DbJoin) Test(org.junit.Test)

Example 40 with DbJoin

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;
}
Also used : ObjRelationship(org.apache.cayenne.map.ObjRelationship) EJBQLIdentificationVariable(org.apache.cayenne.ejbql.parser.EJBQLIdentificationVariable) ClassDescriptor(org.apache.cayenne.reflect.ClassDescriptor) DbRelationship(org.apache.cayenne.map.DbRelationship) EJBQLException(org.apache.cayenne.ejbql.EJBQLException) DbJoin(org.apache.cayenne.map.DbJoin) QuotingStrategy(org.apache.cayenne.dba.QuotingStrategy) EJBQLPath(org.apache.cayenne.ejbql.parser.EJBQLPath) EJBQLEquals(org.apache.cayenne.ejbql.parser.EJBQLEquals)

Aggregations

DbJoin (org.apache.cayenne.map.DbJoin)49 DbRelationship (org.apache.cayenne.map.DbRelationship)35 DbEntity (org.apache.cayenne.map.DbEntity)24 DbAttribute (org.apache.cayenne.map.DbAttribute)18 ObjRelationship (org.apache.cayenne.map.ObjRelationship)14 ObjAttribute (org.apache.cayenne.map.ObjAttribute)12 ObjEntity (org.apache.cayenne.map.ObjEntity)11 ClassDescriptor (org.apache.cayenne.reflect.ClassDescriptor)9 CayenneRuntimeException (org.apache.cayenne.CayenneRuntimeException)8 ArrayList (java.util.ArrayList)7 AttributeProperty (org.apache.cayenne.reflect.AttributeProperty)7 PropertyVisitor (org.apache.cayenne.reflect.PropertyVisitor)7 ToManyProperty (org.apache.cayenne.reflect.ToManyProperty)7 ToOneProperty (org.apache.cayenne.reflect.ToOneProperty)7 HashMap (java.util.HashMap)6 Test (org.junit.Test)6 QuotingStrategy (org.apache.cayenne.dba.QuotingStrategy)5 EJBQLException (org.apache.cayenne.ejbql.EJBQLException)5 HashSet (java.util.HashSet)4 List (java.util.List)3