Search in sources :

Example 16 with DbRelationship

use of org.apache.cayenne.map.DbRelationship in project cayenne by apache.

the class EJBQLTranslationContext method getIncomingRelationships.

List<DbRelationship> getIncomingRelationships(EJBQLTableId id) {
    List<DbRelationship> incoming = compiledExpression.getIncomingRelationships(resolveId(id.getEntityId()));
    // append tail of flattened relationships...
    if (id.getDbPath() != null) {
        DbEntity entity;
        if (incoming == null || incoming.isEmpty()) {
            entity = compiledExpression.getEntityDescriptor(id.getEntityId()).getEntity().getDbEntity();
        } else {
            DbRelationship last = incoming.get(incoming.size() - 1);
            entity = last.getTargetEntity();
        }
        incoming = new ArrayList<>(incoming);
        Iterator<?> it = entity.resolvePathComponents(id.getDbPath());
        while (it.hasNext()) {
            incoming.add((DbRelationship) it.next());
        }
    }
    return incoming;
}
Also used : DbEntity(org.apache.cayenne.map.DbEntity) DbRelationship(org.apache.cayenne.map.DbRelationship)

Example 17 with DbRelationship

use of org.apache.cayenne.map.DbRelationship in project cayenne by apache.

the class DropColumnToModelIT method testRemoveFKColumnWithoutRelationshipInDb.

@Test
public void testRemoveFKColumnWithoutRelationshipInDb() throws Exception {
    dropTableIfPresent("NEW_TABLE");
    dropTableIfPresent("NEW_TABLE2");
    assertTokensAndExecute(0, 0);
    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);
    DbAttribute e2col3 = new DbAttribute("NAME", Types.VARCHAR, dbEntity2);
    e2col3.setMaxLength(10);
    dbEntity2.addAttribute(e2col3);
    map.addDbEntity(dbEntity2);
    assertTokensAndExecute(2, 0);
    assertTokensAndExecute(0, 0);
    // force drop fk column in db
    execute(mergerFactory().createDropColumnToDb(dbEntity2, e2col2));
    // create db relationships, but do not sync them to db
    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());
    // create ObjEntities
    ObjEntity objEntity1 = new ObjEntity("NewTable");
    objEntity1.setDbEntity(dbEntity1);
    ObjAttribute oatr1 = new ObjAttribute("name");
    oatr1.setDbAttributePath(e1col2.getName());
    oatr1.setType("java.lang.String");
    objEntity1.addAttribute(oatr1);
    map.addObjEntity(objEntity1);
    ObjEntity objEntity2 = new ObjEntity("NewTable2");
    objEntity2.setDbEntity(dbEntity2);
    ObjAttribute o2a1 = new ObjAttribute("name");
    o2a1.setDbAttributePath(e2col3.getName());
    o2a1.setType("java.lang.String");
    objEntity2.addAttribute(o2a1);
    map.addObjEntity(objEntity2);
    // create ObjRelationships
    assertEquals(0, objEntity1.getRelationships().size());
    assertEquals(0, objEntity2.getRelationships().size());
    ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
    objRel1To2.addDbRelationship(rel1To2);
    objRel1To2.setSourceEntity(objEntity1);
    objRel1To2.setTargetEntityName(objEntity2);
    objEntity1.addRelationship(objRel1To2);
    ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
    objRel2To1.addDbRelationship(rel2To1);
    objRel2To1.setSourceEntity(objEntity2);
    objRel2To1.setTargetEntityName(objEntity1);
    objEntity2.addRelationship(objRel2To1);
    assertEquals(1, objEntity1.getRelationships().size());
    assertEquals(1, objEntity2.getRelationships().size());
    assertSame(objRel1To2, objRel2To1.getReverseRelationship());
    assertSame(objRel2To1, objRel1To2.getReverseRelationship());
    // try do use the merger to remove the column and relationship in the
    // model
    List<MergerToken> tokens = createMergeTokens();
    assertTokens(tokens, 2, 0);
    // TODO: reversing the following two tokens should also reverse the
    // order
    MergerToken token0 = tokens.get(0).createReverse(mergerFactory());
    MergerToken token1 = tokens.get(1).createReverse(mergerFactory());
    if (!(token0 instanceof DropRelationshipToModel && token1 instanceof DropColumnToModel || token1 instanceof DropRelationshipToModel && token0 instanceof DropColumnToModel)) {
        fail();
    }
    // do not execute DropRelationshipToModel, only DropColumnToModel.
    if (token1 instanceof DropColumnToModel) {
        execute(token1);
    } else {
        execute(token0);
    }
    // check after merging
    assertNull(dbEntity2.getAttribute(e2col2.getName()));
    assertEquals(0, dbEntity1.getRelationships().size());
    assertEquals(0, dbEntity2.getRelationships().size());
    assertEquals(0, objEntity1.getRelationships().size());
    assertEquals(0, objEntity2.getRelationships().size());
    // clear up
    dbEntity1.removeRelationship(rel1To2.getName());
    dbEntity2.removeRelationship(rel2To1.getName());
    map.removeObjEntity(objEntity1.getName(), true);
    map.removeDbEntity(dbEntity1.getName(), true);
    map.removeObjEntity(objEntity2.getName(), true);
    map.removeDbEntity(dbEntity2.getName(), true);
    resolver.refreshMappingCache();
    assertNull(map.getObjEntity(objEntity1.getName()));
    assertNull(map.getDbEntity(dbEntity1.getName()));
    assertNull(map.getObjEntity(objEntity2.getName()));
    assertNull(map.getDbEntity(dbEntity2.getName()));
    assertFalse(map.getDbEntities().contains(dbEntity1));
    assertFalse(map.getDbEntities().contains(dbEntity2));
    assertTokensAndExecute(2, 0);
    assertTokensAndExecute(0, 0);
}
Also used : ObjEntity(org.apache.cayenne.map.ObjEntity) ObjRelationship(org.apache.cayenne.map.ObjRelationship) DbEntity(org.apache.cayenne.map.DbEntity) ObjAttribute(org.apache.cayenne.map.ObjAttribute) DbRelationship(org.apache.cayenne.map.DbRelationship) DbAttribute(org.apache.cayenne.map.DbAttribute) MergerToken(org.apache.cayenne.dbsync.merge.token.MergerToken) DbJoin(org.apache.cayenne.map.DbJoin) Test(org.junit.Test)

Example 18 with DbRelationship

use of org.apache.cayenne.map.DbRelationship in project cayenne by apache.

the class DefaultObjectNameGeneratorTest method testRelationshipName_LowerCase_Underscores.

@Test
public void testRelationshipName_LowerCase_Underscores() {
    DbRelationship r1 = makeRelationship("painting", "artist_id", "artist", "artist_id", false);
    assertEquals("artist", generator.relationshipName(r1));
    DbRelationship r2 = makeRelationship("artist", "artist_id", "painting", "artist_id", true);
    assertEquals("paintings", generator.relationshipName(r2));
    DbRelationship r3 = makeRelationship("person", "mother_id", "person", "person_id", false);
    assertEquals("mother", generator.relationshipName(r3));
    DbRelationship r4 = makeRelationship("person", "person_id", "person", "mother_id", true);
    assertEquals("people", generator.relationshipName(r4));
    DbRelationship r5 = makeRelationship("person", "shipping_address_id", "address", "id", false);
    assertEquals("shippingAddress", generator.relationshipName(r5));
    DbRelationship r6 = makeRelationship("person", "id", "address", "person_id", true);
    assertEquals("addresses", generator.relationshipName(r6));
}
Also used : DbRelationship(org.apache.cayenne.map.DbRelationship) Test(org.junit.Test)

Example 19 with DbRelationship

use of org.apache.cayenne.map.DbRelationship in project cayenne by apache.

the class DefaultObjectNameGeneratorTest method testRelationshipName_UpperCase_Underscores.

@Test
public void testRelationshipName_UpperCase_Underscores() {
    DbRelationship r1 = makeRelationship("PAINTING", "ARTIST_ID", "ARTIST", "ARTIST_ID", false);
    assertEquals("artist", generator.relationshipName(r1));
    DbRelationship r2 = makeRelationship("ARTIST", "ARTIST_ID", "PAINTING", "ARTIST_ID", true);
    assertEquals("paintings", generator.relationshipName(r2));
    DbRelationship r3 = makeRelationship("PERSON", "MOTHER_ID", "PERSON", "PERSON_ID", false);
    assertEquals("mother", generator.relationshipName(r3));
    DbRelationship r4 = makeRelationship("PERSON", "PERSON_ID", "PERSON", "MOTHER_ID", true);
    assertEquals("people", generator.relationshipName(r4));
    DbRelationship r5 = makeRelationship("PERSON", "SHIPPING_ADDRESS_ID", "ADDRESS", "ID", false);
    assertEquals("shippingAddress", generator.relationshipName(r5));
    DbRelationship r6 = makeRelationship("PERSON", "ID", "ADDRESS", "PERSON_ID", true);
    assertEquals("addresses", generator.relationshipName(r6));
}
Also used : DbRelationship(org.apache.cayenne.map.DbRelationship) Test(org.junit.Test)

Example 20 with DbRelationship

use of org.apache.cayenne.map.DbRelationship in project cayenne by apache.

the class DropColumnToModel method execute.

@Override
public void execute(MergerContext mergerContext) {
    // remove relationships mapped to column. duplicate List to prevent
    // ConcurrentModificationException
    List<DbRelationship> dbRelationships = new ArrayList<>(getEntity().getRelationships());
    for (DbRelationship dbRelationship : dbRelationships) {
        for (DbJoin join : dbRelationship.getJoins()) {
            if (join.getSource() == getColumn() || join.getTarget() == getColumn()) {
                remove(mergerContext.getDelegate(), dbRelationship, true);
            }
        }
    }
    // remove ObjAttribute mapped to same column
    for (ObjEntity objEntity : getEntity().mappedObjEntities()) {
        ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(getColumn());
        if (objAttribute != null) {
            objEntity.removeAttribute(objAttribute.getName());
            mergerContext.getDelegate().objAttributeRemoved(objAttribute);
        }
    }
    // remove DbAttribute
    getEntity().removeAttribute(getColumn().getName());
    mergerContext.getDelegate().dbAttributeRemoved(getColumn());
}
Also used : ObjEntity(org.apache.cayenne.map.ObjEntity) ObjAttribute(org.apache.cayenne.map.ObjAttribute) DbRelationship(org.apache.cayenne.map.DbRelationship) ArrayList(java.util.ArrayList) DbJoin(org.apache.cayenne.map.DbJoin)

Aggregations

DbRelationship (org.apache.cayenne.map.DbRelationship)106 DbEntity (org.apache.cayenne.map.DbEntity)59 DbAttribute (org.apache.cayenne.map.DbAttribute)35 DbJoin (org.apache.cayenne.map.DbJoin)35 ObjEntity (org.apache.cayenne.map.ObjEntity)30 ObjRelationship (org.apache.cayenne.map.ObjRelationship)28 ObjAttribute (org.apache.cayenne.map.ObjAttribute)20 Test (org.junit.Test)15 ClassDescriptor (org.apache.cayenne.reflect.ClassDescriptor)13 ArrayList (java.util.ArrayList)11 CayenneRuntimeException (org.apache.cayenne.CayenneRuntimeException)10 EJBQLException (org.apache.cayenne.ejbql.EJBQLException)9 DataMap (org.apache.cayenne.map.DataMap)9 Entity (org.apache.cayenne.map.Entity)8 AttributeProperty (org.apache.cayenne.reflect.AttributeProperty)8 PropertyVisitor (org.apache.cayenne.reflect.PropertyVisitor)8 ToManyProperty (org.apache.cayenne.reflect.ToManyProperty)8 ToOneProperty (org.apache.cayenne.reflect.ToOneProperty)8 HashMap (java.util.HashMap)6 ObjectId (org.apache.cayenne.ObjectId)6