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 Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs