use of org.apache.cayenne.map.ObjAttribute in project cayenne by apache.
the class ObjRelationshipInfo method initMapKeys.
private void initMapKeys() {
this.mapKeys.clear();
mapKeys.add(DEFAULT_MAP_KEY);
/**
* Object target can be null when selected target DbEntity has no
* ObjEntities
*/
if (objectTarget == null) {
return;
}
for (ObjAttribute attribute : this.objectTarget.getAttributes()) {
mapKeys.add(attribute.getName());
}
view.mapKeysCombo.removeAllItems();
for (String s : mapKeys) view.mapKeysCombo.addItem(s);
if (mapKey != null && !mapKeys.contains(mapKey)) {
mapKey = DEFAULT_MAP_KEY;
view.mapKeysCombo.setSelectedItem(mapKey);
}
}
use of org.apache.cayenne.map.ObjAttribute in project cayenne by apache.
the class ObjEntityHandlerTest method testLoad.
@Test
public void testLoad() throws Exception {
final DataMap map = new DataMap();
assertEquals(0, map.getObjEntities().size());
parse("obj-entity", new HandlerFactory() {
@Override
public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
return new ObjEntityHandler(parent, map);
}
});
assertEquals(1, map.getObjEntities().size());
ObjEntity entity = map.getObjEntity("ArtistCallback");
assertNotNull(entity);
assertTrue(entity.isAbstract());
assertTrue(entity.isReadOnly());
assertTrue(entity.isServerOnly());
assertFalse(entity.isClientAllowed());
assertEquals(3, entity.getAttributes().size());
assertEquals(8, entity.getCallbackMethods().size());
assertEquals(ObjEntity.LOCK_TYPE_OPTIMISTIC, entity.getDeclaredLockType());
assertEquals("org.apache.cayenne.testdo.testmap.ArtistCallback", entity.getClassName());
assertNull("super.class should be suppressed by super entity", entity.getSuperClassName());
assertEquals("Artist", entity.getSuperEntityName());
assertEquals("client.class", entity.getClientClassName());
assertNull("client.super.class should be suppressed by super entity", entity.getClientSuperClassName());
assertEquals("ARTIST_CT", entity.getDbEntityName());
ObjAttribute attribute = entity.getAttribute("artistName");
assertNotNull(attribute);
assertEquals("NAME", attribute.getDbAttributeName());
assertEquals("java.lang.String", attribute.getType());
assertTrue(attribute.isUsedForLocking());
attribute = entity.getAttribute("dateOfBirth");
assertNotNull(attribute);
assertNull(attribute.getDbAttributeName());
assertEquals("java.util.Date", attribute.getType());
assertFalse(attribute.isUsedForLocking());
attribute = entity.getAttribute("embeddable1");
assertNotNull(attribute);
assertNull(attribute.getDbAttributeName());
assertEquals("org.apache.cayenne.testdo.embeddable.Embeddable1", attribute.getType());
assertFalse(attribute.isUsedForLocking());
String override = entity.getDeclaredAttributeOverrides().get("name");
assertEquals("parent.child.name", override);
}
use of org.apache.cayenne.map.ObjAttribute in project cayenne by apache.
the class ASTObjPathIT method testEvaluate_ObjEntity.
@Test
public void testEvaluate_ObjEntity() {
ASTObjPath node = new ASTObjPath("paintingArray.paintingTitle");
ObjEntity ae = context.getEntityResolver().getObjEntity(Artist.class);
Object target = node.evaluate(ae);
assertTrue(target instanceof ObjAttribute);
}
use of org.apache.cayenne.map.ObjAttribute in project cayenne by apache.
the class DefaultSelectTranslator method appendQueryColumns.
/**
* Appends columns needed for object SelectQuery to the provided columns
* list.
*/
<T> List<ColumnDescriptor> appendQueryColumns(final List<ColumnDescriptor> columns, SelectQuery<T> query, ClassDescriptor descriptor, final String tableAlias) {
final Set<ColumnTracker> attributes = new HashSet<>();
// fetched attributes include attributes that are either:
//
// * class properties
// * PK
// * FK used in relationship
// * joined prefetch PK
ObjEntity oe = descriptor.getEntity();
PropertyVisitor visitor = new PropertyVisitor() {
public boolean visitAttribute(AttributeProperty property) {
ObjAttribute oa = property.getAttribute();
resetJoinStack();
Iterator<CayenneMapEntry> dbPathIterator = oa.getDbPathIterator();
while (dbPathIterator.hasNext()) {
Object pathPart = dbPathIterator.next();
if (pathPart == null) {
throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName());
} else if (pathPart instanceof DbRelationship) {
DbRelationship rel = (DbRelationship) pathPart;
dbRelationshipAdded(rel, JoinType.LEFT_OUTER, null);
} else if (pathPart instanceof DbAttribute) {
DbAttribute dbAttr = (DbAttribute) pathPart;
appendColumn(columns, oa, dbAttr, attributes, null, tableAlias);
}
}
return true;
}
public boolean visitToMany(ToManyProperty property) {
visitRelationship(property);
return true;
}
public boolean visitToOne(ToOneProperty property) {
visitRelationship(property);
return true;
}
private void visitRelationship(ArcProperty property) {
resetJoinStack();
ObjRelationship rel = property.getRelationship();
DbRelationship dbRel = rel.getDbRelationships().get(0);
List<DbJoin> joins = dbRel.getJoins();
for (DbJoin join : joins) {
DbAttribute src = join.getSource();
appendColumn(columns, null, src, attributes, null, tableAlias);
}
}
};
descriptor.visitAllProperties(visitor);
// stack should be reset, because all root table attributes go with "t0"
// table alias
resetJoinStack();
// add remaining needed attrs from DbEntity
DbEntity table = oe.getDbEntity();
for (DbAttribute dba : table.getPrimaryKeys()) {
appendColumn(columns, null, dba, attributes, null, tableAlias);
}
if (query instanceof PrefetchSelectQuery) {
// for each relationship path add PK of the target entity...
for (String path : ((PrefetchSelectQuery) query).getResultPaths()) {
ASTDbPath pathExp = (ASTDbPath) oe.translateToDbPath(ExpressionFactory.exp(path));
// add joins and find terminating element
resetJoinStack();
PathComponent<DbAttribute, DbRelationship> lastComponent = null;
for (PathComponent<DbAttribute, DbRelationship> component : table.resolvePath(pathExp, getPathAliases())) {
if (component.getRelationship() != null) {
// do not invoke dbRelationshipAdded(), invoke
// pushJoin() instead. This is to prevent
// 'forcingDistinct' flipping to true, that will result
// in unneeded extra processing and sometimes in invalid
// results (see CAY-1979). Distinctness of each row is
// guaranteed by the prefetch query semantics - we
// include target ID in the result columns
getJoinStack().pushJoin(component.getRelationship(), component.getJoinType(), null);
}
lastComponent = component;
}
// process terminating element
if (lastComponent != null) {
DbRelationship relationship = lastComponent.getRelationship();
if (relationship != null) {
String labelPrefix = pathExp.getPath();
DbEntity targetEntity = relationship.getTargetEntity();
for (DbAttribute pk : targetEntity.getPrimaryKeys()) {
// note that we my select a source attribute, but
// label it as
// target for simplified snapshot processing
appendColumn(columns, null, pk, attributes, labelPrefix + '.' + pk.getName());
}
}
}
}
}
// handle joint prefetches directly attached to this query...
if (query.getPrefetchTree() != null) {
// perform some sort of union or sub-queries.
for (PrefetchTreeNode prefetch : query.getPrefetchTree().getChildren()) {
prefetch.setEntityName(oe.getName());
}
for (PrefetchTreeNode prefetch : query.getPrefetchTree().adjacentJointNodes()) {
// for each prefetch add all joins plus columns from the target
// entity
Expression prefetchExp = ExpressionFactory.exp(prefetch.getPath());
ASTDbPath dbPrefetch = (ASTDbPath) oe.translateToDbPath(prefetchExp);
resetJoinStack();
DbRelationship r = null;
for (PathComponent<DbAttribute, DbRelationship> component : table.resolvePath(dbPrefetch, getPathAliases())) {
r = component.getRelationship();
dbRelationshipAdded(r, JoinType.LEFT_OUTER, null);
}
if (r == null) {
throw new CayenneRuntimeException("Invalid joint prefetch '%s' for entity: %s", prefetch, oe.getName());
}
// add columns from the target entity, including those that are matched
// against the FK of the source entity.
// This is needed to determine whether optional relationships are null
// go via target OE to make sure that Java types are mapped correctly...
ObjRelationship targetRel = (ObjRelationship) prefetchExp.evaluate(oe);
ObjEntity targetEntity = targetRel.getTargetEntity();
String labelPrefix = dbPrefetch.getPath();
PropertyVisitor prefetchVisitor = new PropertyVisitor() {
public boolean visitAttribute(AttributeProperty property) {
ObjAttribute oa = property.getAttribute();
Iterator<CayenneMapEntry> dbPathIterator = oa.getDbPathIterator();
while (dbPathIterator.hasNext()) {
Object pathPart = dbPathIterator.next();
if (pathPart == null) {
throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName());
} else if (pathPart instanceof DbRelationship) {
DbRelationship rel = (DbRelationship) pathPart;
dbRelationshipAdded(rel, JoinType.INNER, null);
} else if (pathPart instanceof DbAttribute) {
DbAttribute dbAttr = (DbAttribute) pathPart;
appendColumn(columns, oa, dbAttr, attributes, labelPrefix + '.' + dbAttr.getName());
}
}
return true;
}
public boolean visitToMany(ToManyProperty property) {
return true;
}
public boolean visitToOne(ToOneProperty property) {
return true;
}
};
ClassDescriptor prefetchClassDescriptor = entityResolver.getClassDescriptor(targetEntity.getName());
prefetchClassDescriptor.visitAllProperties(prefetchVisitor);
// append remaining target attributes such as keys
DbEntity targetDbEntity = r.getTargetEntity();
for (DbAttribute attribute : targetDbEntity.getAttributes()) {
appendColumn(columns, null, attribute, attributes, labelPrefix + '.' + attribute.getName());
}
}
}
return columns;
}
use of org.apache.cayenne.map.ObjAttribute in project cayenne by apache.
the class HybridDataObjectIT method addRuntimeAttribute.
private void addRuntimeAttribute(Class<?> entityClass, String attributeName, String attributeType) {
ObjEntity entity = runtime.getDataDomain().getEntityResolver().getObjEntity(entityClass);
ObjAttribute attribute = new ObjAttribute();
attribute.setName(attributeName);
attribute.setDbAttributePath(attributeName);
attribute.setType(attributeType);
entity.addAttribute(attribute);
}
Aggregations