implemented _subnodes.filter to specify additional static constraints

on subnode relations in type.properties
This commit is contained in:
hns 2001-07-30 15:33:45 +00:00
parent 07fa89f251
commit 6b8424f61e
2 changed files with 24 additions and 6 deletions

View file

@ -259,6 +259,7 @@ public class Relation {
vr.groupbyorder = groupbyorder; vr.groupbyorder = groupbyorder;
vr.groupbyprototype = groupbyprototype; vr.groupbyprototype = groupbyprototype;
vr.order = order; vr.order = order;
vr.filter = filter;
vr.subnoderelation = subnoderelation; vr.subnoderelation = subnoderelation;
vr.aggressiveLoading = aggressiveLoading; vr.aggressiveLoading = aggressiveLoading;
vr.aggressiveCaching = aggressiveCaching; vr.aggressiveCaching = aggressiveCaching;
@ -276,6 +277,7 @@ public class Relation {
vr.groupbyorder = groupbyorder; vr.groupbyorder = groupbyorder;
vr.groupbyprototype = groupbyprototype; vr.groupbyprototype = groupbyprototype;
vr.order = order; vr.order = order;
vr.filter = filter;
vr.subnoderelation = subnoderelation; vr.subnoderelation = subnoderelation;
return vr; return vr;
} }
@ -293,6 +295,7 @@ public class Relation {
vr = makeClone (); vr = makeClone ();
vr.order = order; vr.order = order;
vr.prototype = groupbyprototype; vr.prototype = groupbyprototype;
vr.filter = filter;
return vr; return vr;
} }
@ -305,6 +308,7 @@ public class Relation {
Relation vr = makeClone (); Relation vr = makeClone ();
vr.order = order; vr.order = order;
vr.prototype = groupbyprototype; vr.prototype = groupbyprototype;
vr.filter = filter;
return vr; return vr;
} }

View file

@ -583,7 +583,7 @@ public final class NodeManager {
if (rel == null || rel.other == null || !rel.other.isRelational ()) { if (rel == null || rel.other == null || !rel.other.isRelational ()) {
// this should never be called for embedded nodes // this should never be called for embedded nodes
throw new RuntimeException ("NodeMgr.countNodes called for non-relational node "+home); throw new RuntimeException ("NodeMgr.getNodeIDs called for non-relational node "+home);
} else { } else {
List retval = new ArrayList (); List retval = new ArrayList ();
// if we do a groupby query (creating an intermediate layer of groupby nodes), // if we do a groupby query (creating an intermediate layer of groupby nodes),
@ -606,7 +606,10 @@ public final class NodeManager {
if (subrel.direction == Relation.BACKWARD) { if (subrel.direction == Relation.BACKWARD) {
String homeid = home.getNonVirtualHomeID (); // home.getState() == Node.VIRTUAL ? home.parentID : home.getID (); String homeid = home.getNonVirtualHomeID (); // home.getState() == Node.VIRTUAL ? home.parentID : home.getID ();
q += " WHERE "+subrel.getRemoteField()+" = '"+homeid+"'"; q += " WHERE "+subrel.getRemoteField()+" = '"+homeid+"'";
} if (subrel.filter != null)
q += " AND "+subrel.filter;
} else if (subrel.filter != null)
q += " WHERE "+subrel.filter;
// set order, if specified and if not using subnode's relation // set order, if specified and if not using subnode's relation
if (rel.groupby != null) if (rel.groupby != null)
q += " GROUP BY "+rel.groupby+" ORDER BY "+(rel.groupbyorder == null ? rel.groupby : rel.groupbyorder); q += " GROUP BY "+rel.groupby+" ORDER BY "+(rel.groupbyorder == null ? rel.groupby : rel.groupbyorder);
@ -673,12 +676,17 @@ public final class NodeManager {
tds.where (home.getSubnodeRelation().trim().substring(5)); tds.where (home.getSubnodeRelation().trim().substring(5));
} else if (subrel.direction == Relation.BACKWARD) { } else if (subrel.direction == Relation.BACKWARD) {
String homeid = home.getState() == Node.VIRTUAL ? home.parentID : home.getID (); String homeid = home.getState() == Node.VIRTUAL ? home.parentID : home.getID ();
tds.where (subrel.getRemoteField()+" = '"+homeid+"'"); if (rel.filter != null)
tds.where (subrel.getRemoteField()+" = '"+homeid+"' AND "+subrel.filter);
else
tds.where (subrel.getRemoteField()+" = '"+homeid+"'");
// set order if specified // set order if specified
if (rel.order != null) if (rel.order != null)
tds.order (rel.order); tds.order (rel.order);
} else { } else {
// don't set where clause, but set order. // don't set where clause except for static filter, but set order.
if (subrel.filter != null)
tds.where (subrel.filter);
if (rel.order != null) if (rel.order != null)
tds.order (rel.order); tds.order (rel.order);
} }
@ -736,9 +744,15 @@ public final class NodeManager {
qds = new QueryDataSet (con, "SELECT count(*) FROM "+table+" "+home.getSubnodeRelation()); qds = new QueryDataSet (con, "SELECT count(*) FROM "+table+" "+home.getSubnodeRelation());
} else if (subrel.direction == Relation.BACKWARD) { } else if (subrel.direction == Relation.BACKWARD) {
String homeid = home.getState() == Node.VIRTUAL ? home.parentID : home.getID (); String homeid = home.getState() == Node.VIRTUAL ? home.parentID : home.getID ();
qds = new QueryDataSet (con, "SELECT count(*) FROM "+table+" WHERE "+subrel.getRemoteField()+" = '"+homeid+"'"); String qstr = "SELECT count(*) FROM "+table+" WHERE "+subrel.getRemoteField()+" = '"+homeid+"'";
if (subrel.filter != null)
qstr += " AND "+subrel.filter;
qds = new QueryDataSet (con, qstr);
} else { } else {
qds = new QueryDataSet (con, "SELECT count(*) FROM "+table); String qstr = "SELECT count(*) FROM "+table;
if (subrel.filter != null)
qstr += " WHERE "+subrel.filter;
qds = new QueryDataSet (con, qstr);
} }
if (logSql) if (logSql)