Author: michiel
Date: 2010-05-17 13:40:31 +0200 (Mon, 17 May 2010)
New Revision: 42178
Modified:
mmbase/trunk/bridge/src/main/java/org/mmbase/bridge/util/Queries.java
Log:
ported getSubQuery from 1.9
Modified: mmbase/trunk/bridge/src/main/java/org/mmbase/bridge/util/Queries.java
===================================================================
--- mmbase/trunk/bridge/src/main/java/org/mmbase/bridge/util/Queries.java
2010-05-17 11:37:02 UTC (rev 42177)
+++ mmbase/trunk/bridge/src/main/java/org/mmbase/bridge/util/Queries.java
2010-05-17 11:40:31 UTC (rev 42178)
@@ -906,11 +906,11 @@
String resultName;
if (query instanceof NodeQuery) {
+ NodeQuery nq = (NodeQuery) query;
// all fields are present of the node-step, so, we could use the
number field simply.
- resultName = "number";
- NodeQuery nq = (NodeQuery) query;
- //resultName = nq.getFields().get(0).getFieldName();
- count.addAggregatedField(nq.getNodeStep(),
nq.getNodeManager().getField(resultName), type);
+ Field firstField =
nq.getNodeManager().getFields(NodeManager.ORDER_CREATE).get(0);
+ resultName = firstField.getName(); // probably "number";
+ count.addAggregatedField(nq.getNodeStep(), firstField, type);
} else {
List<StepField> fields = query.getFields();
if (fields.size() == 0) { // for non-distinct queries always the
number fields would be available
@@ -1517,30 +1517,31 @@
/**
* @since MMBase-1.9
*/
- protected static int getDayMark(int age) {
+ protected static int getDayMark(Cloud cloud, int age) {
log.debug("finding day mark for " + age + " days ago");
- Cloud cloud =
ContextProvider.getDefaultCloudContext().getCloud("mmbase");
- NodeManager dayMarks = cloud.getNodeManager("daymarks");
- NodeQuery query = dayMarks.createQuery();
- StepField step = query.createStepField("daycount");
- int currentDay = (int) (System.currentTimeMillis()/(1000*60*60*24));
- Integer day = new Integer(currentDay - age);
- if (log.isDebugEnabled()) {
- log.debug("today : " + currentDay + " requested " + day);
- }
- Constraint constraint = query.createConstraint(step,
FieldCompareConstraint.LESS_EQUAL, day);
- query.setConstraint(constraint);
- query.addSortOrder(query.createStepField("daycount"),
SortOrder.ORDER_DESCENDING);
- query.setMaxNumber(1);
-
- NodeList result = dayMarks.getList(query);
- if (result.size() == 0) {
+ if (! cloud.hasNodeManager("daymarks")) {
return -1;
} else {
- return result.getNode(0).getIntValue("mark");
+ NodeManager dayMarks = cloud.getNodeManager("daymarks");
+ NodeQuery query = dayMarks.createQuery();
+ StepField step = query.createStepField("daycount");
+ int currentDay = (int)
(System.currentTimeMillis()/(1000*60*60*24));
+ Integer day = new Integer(currentDay - age);
+ if (log.isDebugEnabled()) {
+ log.debug("today : " + currentDay + " requested " + day);
+ }
+ Constraint constraint = query.createConstraint(step,
FieldCompareConstraint.LESS_EQUAL, day);
+ query.setConstraint(constraint);
+ query.addSortOrder(query.createStepField("daycount"),
SortOrder.ORDER_DESCENDING);
+ query.setMaxNumber(1);
+
+ NodeList result = dayMarks.getList(query);
+ if (result.size() == 0) {
+ return -1;
+ } else {
+ return result.getNode(0).getIntValue("mark");
+ }
}
-
-
}
@@ -1561,24 +1562,29 @@
* @since MMBase-1.9
*/
public static Constraint createAgeConstraint(Query query, Step step, int
minAge, int maxAge) {
+ Cloud cloud = query.getCloud();
+ if (! cloud.hasNodeManager("daymarks")) {
+ log.warn("No nodemanager 'frdaymarks'");
+ return null;
+ }
StepField stepField = query.createStepField(step, "number");
if (maxAge != -1 && minAge > 0) {
- int maxMarker = getDayMark(maxAge);
+ int maxMarker = getDayMark(cloud, maxAge);
if (maxMarker > 0) {
// BETWEEN constraint
- return query.createConstraint(stepField, maxMarker + 1,
Integer.valueOf(getDayMark(minAge - 1)));
+ return query.createConstraint(stepField, maxMarker + 1,
Integer.valueOf(getDayMark(cloud, minAge - 1)));
} else {
- return query.createConstraint(stepField,
FieldCompareConstraint.LESS_EQUAL, Integer.valueOf(getDayMark(minAge - 1)));
+ return query.createConstraint(stepField,
FieldCompareConstraint.LESS_EQUAL, Integer.valueOf(getDayMark(cloud, minAge -
1)));
}
} else if (maxAge != -1) { // only on max
- int maxMarker = getDayMark(maxAge);
+ int maxMarker = getDayMark(cloud, maxAge);
if (maxMarker > 0) {
return query.createConstraint(stepField,
FieldCompareConstraint.GREATER_EQUAL, Integer.valueOf(maxMarker + 1));
} else {
return null;
}
} else if (minAge > 0) {
- return query.createConstraint(stepField,
FieldCompareConstraint.LESS_EQUAL, Integer.valueOf(getDayMark(minAge - 1)));
+ return query.createConstraint(stepField,
FieldCompareConstraint.LESS_EQUAL, Integer.valueOf(getDayMark(cloud, minAge -
1)));
} else {
// both unspecified
return null;
@@ -2021,6 +2027,91 @@
}
+ /**
+ * Given a Query, and Node, produces a new query, where the first part of
the query is replaced by the Node.
+ * So, e.g. if you have a query mags,posrel,news,posrel,images and a news
node, you can feed this query, and
+ * the node into this method (with step is 2), to produce a query
news,posrel,images, where the start node is the given news node. All
+ * constraints, nodes, and aliases on the remainings steps are copied.
+ *
+ * The query is a NodeQuery, where the NodeStep is the (normal) step after
the node.
+ *
+ * @param q The query to base the new query
+ * @param node The node to start the query with. If this is
<code>null</code> then step must be 0, and the original query will be
+ * returned, only converted to a NodeQuery for the first step.
+ * @param The element step. The first non-relation step after the first
step where the node is fixed.
+ * @exception ClassCastException if step+1 is not a relationstep. (This
restriction may perhaps be removed).
+ * @since MMBase-1.9.3
+ */
+ public static NodeQuery getSubQuery(final Query q, final Node node, int
step) {
+ Cloud cloud = q.getCloud();
+ NodeQuery subQuery = cloud.createNodeQuery();
+ if (step % 2 != 0) {
+ throw new UnsupportedOperationException("Only non-relation steps
are supported, so step must be even (now " + step + ")");
+ }
+ if (node != null) {
+ Step firstStep = q.getSteps().get(step - 2);
+ Step copyFirstStep =
subQuery.addStep(cloud.getNodeManager(firstStep.getTableName()));
+ subQuery.addNode(copyFirstStep, node);
+ addConstraint(subQuery, copyConstraint(q.getConstraint(),
firstStep, subQuery, copyFirstStep));
+ } else {
+ if (step == 0) {
+ Step sourceStep = q.getSteps().get(0);
+ Step destStep =
subQuery.addStep(cloud.getNodeManager(sourceStep.getTableName()));
+ addConstraint(subQuery, copyConstraint(q.getConstraint(),
sourceStep, subQuery, destStep));
+ subQuery.setAlias(destStep, sourceStep.getAlias());
+ addConstraint(subQuery, copyConstraint(q.getConstraint(),
sourceStep, subQuery, destStep));
+ step += 2;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+ for (int i = step - 1; i < q.getSteps().size(); i+=2) {
+ RelationStep sourceRelStep = (RelationStep) q.getSteps().get(i);
+
+ // Seems a bit cumbersome...
+ Integer role = sourceRelStep.getRole();
+ log.debug("Found role " + role);
+ String roleAsString = role == null ? null :
cloud.getNode(role).getStringValue("sname");
+
+ RelationStep destRelStep =
subQuery.addRelationStep(cloud.getNodeManager(sourceRelStep.getNext().getTableName()),
+ roleAsString,
+
RelationStep.DIRECTIONALITY_DESCRIPTIONS[sourceRelStep.getDirectionality()]);
+
+ addConstraint(subQuery, copyConstraint(q.getConstraint(),
sourceRelStep, subQuery, destRelStep));
+ if (sourceRelStep.getNodes() != null) {
+ for (int n : sourceRelStep.getNodes()) {
+ subQuery.addNode(destRelStep, n);
+ }
+ }
+ subQuery.setAlias(destRelStep, sourceRelStep.getAlias());
+
+
+ Step sourceStep = sourceRelStep.getNext();
+ Step destStep = destRelStep.getNext();
+ addConstraint(subQuery, copyConstraint(q.getConstraint(),
sourceStep, subQuery, destStep));
+
+ if (sourceStep.getNodes() != null) {
+ for (int n : sourceStep.getNodes()) {
+ subQuery.addNode(destStep, n);
+ }
+ }
+ subQuery.setAlias(destStep, sourceStep.getAlias());
+ copySortOrders(q.getSortOrders(), sourceRelStep, subQuery,
destRelStep);
+ copySortOrders(q.getSortOrders(), sourceStep, subQuery,
destStep);
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Setting nodeStep to " + subQuery.getSteps().get(2));
+ }
+ if (node != null) {
+ subQuery.setNodeStep(subQuery.getSteps().get(2));
+ } else {
+ subQuery.setNodeStep(subQuery.getSteps().get(0));
+ }
+ subQuery.setDistinct(true);
+ return subQuery;
+ }
+
+
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs