adopted to changes in DbMapping and Relation.

Relation is now smart enough to generate queries
for groupby nodes.
This commit is contained in:
hns 2001-08-08 10:16:43 +00:00
parent 18e3d82166
commit ebecc37c29
2 changed files with 25 additions and 45 deletions

View file

@ -443,8 +443,8 @@ public final class Node implements INode, Serializable {
DbMapping parentmap = p.getDbMapping ();
Relation prel = parentmap.getPropertyRelation();
if (prel != null && prel.subnodesAreProperties && !prel.usesPrimaryKey ()) {
Relation localrel = dbmap.columnNameToProperty (prel.getRemoteField ());
String propvalue = getString (localrel.propname, false);
String propname = dbmap.columnNameToProperty (prel.getRemoteField ());
String propvalue = getString (propname, false);
if (propvalue != null && propvalue.length() > 0) {
setName (propvalue);
anonymous = false;
@ -769,7 +769,7 @@ public final class Node implements INode, Serializable {
if (dbmap != null && node.dbmap != null) {
Relation prel = dbmap.getPropertyRelation();
if (prel != null && prel.subnodesAreProperties && !prel.usesPrimaryKey ()) {
Relation localrel = node.dbmap.columnNameToProperty (prel.getRemoteField ());
Relation localrel = node.dbmap.columnNameToRelation (prel.getRemoteField ());
// if no relation from db column to prop name is found, assume that both are equal
String propname = localrel == null ? prel.getRemoteField() : localrel.propname;
String prop = node.getString (propname, false);
@ -779,7 +779,6 @@ public final class Node implements INode, Serializable {
unset (prop);
removeNode (old);
}
// throw new RuntimeException ("Property "+prop+" is already defined for "+this);
setNode (prop, node);
}
}
@ -816,7 +815,7 @@ public final class Node implements INode, Serializable {
if (dbmap != null) {
Relation srel = dbmap.getSubnodeRelation ();
if (srel != null && srel.direction == Relation.BACKWARD) {
Relation backlink = srel.other.columnNameToProperty (srel.getRemoteField());
Relation backlink = srel.other.columnNameToRelation (srel.getRemoteField());
if (backlink != null && backlink.propname != null) {
if (node.get (backlink.propname, false) == null) {
if (this.state == VIRTUAL)
@ -947,9 +946,8 @@ public final class Node implements INode, Serializable {
NodeHandle ghandle = new NodeHandle (new SyntheticKey (getKey(), sid));
if (subnodes.contains (ghandle) || create) try {
Relation srel = dbmap.getSubnodeRelation ();
Relation prel = dbmap.getPropertyRelation ();
boolean relational = srel.other != null && srel.other.isRelational ();
DbMapping groupbyMapping = dbmap.getGroupbyMapping ();
boolean relational = groupbyMapping.getSubnodeMapping ().isRelational ();
if (relational || create) {
Node node = relational ? new Node (this, sid, nmgr, null) : new Node ("groupby-"+sid, null, nmgr);
@ -957,33 +955,12 @@ public final class Node implements INode, Serializable {
node.setString ("groupname", sid);
if (relational) {
DbMapping dbm = new DbMapping ();
Relation gsrel = srel.getGroupbySubnodeRelation();
dbm.setSubnodeMapping (srel.other);
dbm.setSubnodeRelation (gsrel);
if (prel != null) {
dbm.setPropertyMapping (prel.other);
dbm.setPropertyRelation (prel.getGroupbyPropertyRelation());
}
node.setDbMapping (dbm);
// one day, Relation should be smart enough to generate the subnode clause
// on the fly. Until then, we prepare it statically for each groupby node.
// This has the drawback that updates in the type definition won't affect already created
// groupby objects.
String snrel = "WHERE "+srel.groupby +"='"+sid+"'";
if (gsrel.direction == Relation.BACKWARD)
snrel += " AND "+gsrel.getRemoteField()+"='"+getNonVirtualHomeID()+"'";
if (gsrel.filter != null)
snrel += " AND "+gsrel.filter;
if (gsrel.order != null)
snrel += " ORDER BY "+gsrel.order;
node.setSubnodeRelation (snrel);
// set prototype of groupby-node
node.setPrototype (gsrel.prototype);
node.setDbMapping (groupbyMapping);
} else {
setNode (sid, node);
subnodes.add (node.getHandle ());
}
node.setPrototype (groupbyMapping.getTypeName ());
nmgr.evictKey (node.getKey ());
return node;
}
@ -1041,7 +1018,7 @@ public final class Node implements INode, Serializable {
if (dbmap != null) {
Relation srel = dbmap.getSubnodeRelation ();
if (srel != null && srel.direction == Relation.BACKWARD) {
Relation backlink = srel.other.columnNameToProperty (srel.getRemoteField ());
Relation backlink = srel.other.columnNameToRelation (srel.getRemoteField ());
if (backlink != null && id.equals (node.getString (backlink.propname, false)))
node.unset (backlink.propname);
}
@ -1051,7 +1028,7 @@ public final class Node implements INode, Serializable {
if (dbmap != null && node.dbmap != null) {
Relation prel = dbmap.getPropertyRelation();
if (prel != null && prel.subnodesAreProperties && !prel.usesPrimaryKey ()) {
Relation localrel = node.dbmap.columnNameToProperty (prel.getRemoteField());
Relation localrel = node.dbmap.columnNameToRelation (prel.getRemoteField());
// if no relation from db column to prop name is found, assume that both are equal
String propname = localrel == null ? prel.getRemoteField () : localrel.propname;
String prop = node.getString (propname, false);
@ -1627,7 +1604,7 @@ public final class Node implements INode, Serializable {
if (rel != null && rel.direction == Relation.FORWARD && !rel.usesPrimaryKey ()) {
// if the relation for this property doesn't use the primary key of the value object, make a
// secondary key object with the proper db column
String kval = n.getString (rel.other.columnNameToProperty (rel.getRemoteField ()).propname, false);
String kval = n.getString (rel.other.columnNameToProperty (rel.getRemoteField ()), false);
prop.nhandle = new NodeHandle (new DbKey (n.getDbMapping (), kval, rel.getRemoteField ()));
}
@ -1643,8 +1620,6 @@ public final class Node implements INode, Serializable {
tx.visitCleanNode (secKey, n);
}
// Server.throwNodeEvent (new NodeEvent (this, NodeEvent.SUBNODE_ADDED, n));
// Server.throwNodeEvent (new NodeEvent (this, NodeEvent.PROPERTIES_CHANGED));
lastmodified = System.currentTimeMillis ();
if (state == CLEAN) markAs (MODIFIED);
if (n.state == DELETED) n.markAs (MODIFIED);

View file

@ -361,7 +361,7 @@ public final class NodeManager {
for (Enumeration e=dbm.getProp2DB ().keys(); e.hasMoreElements(); ) {
String propname = (String) e.nextElement ();
Property p = node.getProperty (propname, false);
Relation rel = dbm.propertyToColumnName (propname);
Relation rel = dbm.propertyToRelation (propname);
if (p != null && rel != null) {
switch (p.getType ()) {
@ -431,7 +431,7 @@ public final class NodeManager {
for (Enumeration e=dbm.getProp2DB ().keys(); e.hasMoreElements(); ) {
String propname = (String) e.nextElement ();
Relation rel = dbm.propertyToColumnName (propname);
Relation rel = dbm.propertyToRelation (propname);
// skip properties that don't need to be updated before fetching them
if (rel != null && (rel.readonly || rel.virtual || (rel.direction != Relation.FORWARD && rel.direction != Relation.PRIMITIVE)))
@ -620,6 +620,8 @@ public final class NodeManager {
q += " WHERE "+subrel.getRemoteField()+" = '"+homeid+"'";
if (subrel.filter != null)
q += " AND "+subrel.filter;
if (rel.dogroupby != null)
q += " AND " + rel.dogroupby + " = '" + home.getString ("groupname", false) +"'";
} else if (subrel.filter != null)
q += " WHERE "+subrel.filter;
// set order, if specified and if not using subnode's relation
@ -766,6 +768,8 @@ public final class NodeManager {
String qstr = "SELECT count(*) FROM "+table+" WHERE "+subrel.getRemoteField()+" = '"+homeid+"'";
if (subrel.filter != null)
qstr += " AND "+subrel.filter;
if (rel.dogroupby != null)
qstr += " AND " + rel.dogroupby + " = '" + home.getString ("groupname", false) +"'";
qds = new QueryDataSet (con, qstr);
} else {
String qstr = "SELECT count(*) FROM "+table;
@ -897,13 +901,7 @@ public final class NodeManager {
node.setPrototype (rel.prototype);
node.setDbMapping (app.getDbMapping (rel.prototype));
} else {
// make a db mapping good enough that the virtual node finds its subnodes
DbMapping dbm = new DbMapping ();
dbm.setSubnodeMapping (rel.other);
dbm.setSubnodeRelation (rel.getVirtualSubnodeRelation());
dbm.setPropertyMapping (rel.other);
dbm.setPropertyRelation (rel.getVirtualPropertyRelation());
node.setDbMapping (dbm);
node.setDbMapping (rel.getVirtualMapping ());
}
} else if (rel != null && rel.groupby != null) {
@ -952,6 +950,13 @@ public final class NodeManager {
where.append (homeid);
where.append ("'");
}
if (rel.dogroupby != null) {
where.append (" and ");
where.append (rel.dogroupby);
where.append (" = '");
where.append (home.getString ("groupname", false));
where.append ("'");
}
}
}
}