Author: michiel Date: 2010-03-19 18:55:45 +0100 (Fri, 19 Mar 2010) New Revision: 41543
Added: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/QueryContext.java Modified: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/ClusterQueries.java mmbase/trunk/core/src/main/java/org/mmbase/storage/search/legacy/ConstraintParser.java Log: to fix MMB-1936, factoring out core dependencies of ConstraintParser Modified: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/ClusterQueries.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/storage/search/ClusterQueries.java 2010-03-19 15:55:44 UTC (rev 41542) +++ mmbase/trunk/core/src/main/java/org/mmbase/storage/search/ClusterQueries.java 2010-03-19 17:55:45 UTC (rev 41543) @@ -18,11 +18,10 @@ import org.mmbase.util.logging.*; /** - * This g * * @author michiel * @author Rob van Maris (ClusterBuilder) - * @version $Id: $ + * @version $Id$ */ public abstract class ClusterQueries { @@ -490,6 +489,8 @@ // package visibility! public void addSortOrders(BasicSearchQuery query, List<String> fieldNames, List<String> directions, Map<String, BasicStepField> fieldsByAlias) { + final QueryContext queryContext = org.mmbase.module.core.CoreQueryContext.INSTANCE; + // Test if fieldnames are specified. if (fieldNames == null || fieldNames.size() == 0) { return; @@ -509,7 +510,7 @@ StepField field= fieldsByAlias.get(fieldName); if (field == null) { // Field has not been added. - field= ConstraintParser.getField(fieldName, query.getSteps()); + field = ConstraintParser.getField(queryContext, fieldName, query.getSteps()); } if (field == null) { throw new IllegalArgumentException("Invalid fieldname: \"" + fieldName + "\""); Property changes on: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/ClusterQueries.java ___________________________________________________________________ Name: svn:keywords + Id Added: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/QueryContext.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/storage/search/QueryContext.java (rev 0) +++ mmbase/trunk/core/src/main/java/org/mmbase/storage/search/QueryContext.java 2010-03-19 17:55:45 UTC (rev 41543) @@ -0,0 +1,45 @@ +/* + +This software is OSI Certified Open Source Software. +OSI Certified is a certification mark of the Open Source Initiative. + +The license (Mozilla version 1.0) can be read at the MMBase site. +See http://www.MMBase.org/license + +*/ +package org.mmbase.storage.search; + +import java.util.*; +import org.mmbase.bridge.*; + +/** + * How there is dealt with SearchQuery object may depend a bit on the actual implementation of the bridge and storage. + * This is collected in implemetnations of this interface + * + * + * @author Michiel Meeuwissen + * @version $Id: Step.java 36486 2009-06-29 17:33:41Z michiel $ + * @since MMBase-2.0 + */ +public interface QueryContext { + + String getStorageIdentifier(String s); + Field getField(String builder, String fieldName); + + + public static class Bridge implements QueryContext { + + protected final Cloud cloud; + public Bridge(Cloud c) { + cloud = c; + } + public String getStorageIdentifier(String s) { + return s; + } + public Field getField(String builder, String fieldName) { + return cloud.getNodeManager(builder).getField(fieldName); + } + } + + +} Modified: mmbase/trunk/core/src/main/java/org/mmbase/storage/search/legacy/ConstraintParser.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/storage/search/legacy/ConstraintParser.java 2010-03-19 15:55:44 UTC (rev 41542) +++ mmbase/trunk/core/src/main/java/org/mmbase/storage/search/legacy/ConstraintParser.java 2010-03-19 17:55:45 UTC (rev 41543) @@ -10,10 +10,7 @@ package org.mmbase.storage.search.legacy; import java.util.*; -import org.mmbase.bridge.Field; -import org.mmbase.core.CoreField; -import org.mmbase.module.core.*; -import org.mmbase.storage.StorageManagerFactory; +import org.mmbase.bridge.*; import org.mmbase.storage.search.*; import org.mmbase.storage.search.implementation.*; import org.mmbase.util.logging.*; @@ -131,8 +128,7 @@ * @return Converted constraint * @since MMBase-1.8.1 (moved from org.mmbase.bridge.util.Queries) */ - private static String convertClausePartToDBS(String constraints) { - StorageManagerFactory<?> factory = MMBase.getMMBase().getStorageManagerFactory(); + private static String convertClausePartToDBS(QueryContext queryContext, String constraints) { StringBuilder result = new StringBuilder(); int posa = constraints.indexOf('['); while (posa > -1) { @@ -143,9 +139,10 @@ String fieldName = constraints.substring(posa + 1, posb); int posc = fieldName.indexOf('.'); if (posc == -1) { - fieldName = factory != null ? factory.getStorageIdentifier(fieldName).toString() : fieldName; + fieldName = queryContext.getStorageIdentifier(fieldName); } else { - fieldName = fieldName.substring(0, posc + 1) + (factory != null ? factory.getStorageIdentifier(fieldName.substring(posc + 1)) : fieldName.substring(posc + 1)); + fieldName = fieldName.substring(0, posc + 1) + + queryContext.getStorageIdentifier(fieldName.substring(posc + 1)); } result.append(constraints.substring(0, posa)).append(fieldName); constraints = constraints.substring(posb + 1); @@ -164,7 +161,7 @@ * @return converted constraint * @since MMBase-1.8.1 (moved from org.mmbase.bridge.util.Queries) */ - public static String convertClauseToDBS(String constraints) { + public static String convertClauseToDBS(QueryContext queryContext, String constraints) { if (constraints.startsWith("MMNODE")) { // wil probably not work // @todo check @@ -194,14 +191,14 @@ String part = constraints.substring(0, quoteOpen); //append to the string buffer "part" the first part - result.append(convertClausePartToDBS(part)); + result.append(convertClausePartToDBS(queryContext, part)); result.append(constraints.substring(quoteOpen, quoteClose + 1)); constraints = constraints.substring(quoteClose + 1); quoteOpen = constraints.indexOf('\''); } - result.append(convertClausePartToDBS(constraints)); + result.append(convertClausePartToDBS(queryContext, constraints)); return result.toString(); } @@ -394,8 +391,8 @@ * @return The field. */ - public static StepField getField(String token, List<? extends Step> steps) { - return getField(token, (List<BasicStep>) steps, null); + public static StepField getField(QueryContext queryContext, String token, List<? extends Step> steps) { + return getField(queryContext, token, (List<BasicStep>) steps, null); } /** * Creates <code>StepField</code> corresponding to field indicated by @@ -416,7 +413,7 @@ * @since MMBase-1.7.1 */ - static StepField getField(String token, List<BasicStep> steps, SearchQuery query) { + static StepField getField(QueryContext queryContext, String token, List<BasicStep> steps, SearchQuery query) { BasicStep step = null; int bracketOffset = (token.startsWith("[") && token.endsWith("]")) ? 1 : 0; int idx = token.indexOf('.'); @@ -436,7 +433,8 @@ } else { step = getStep(token.substring(bracketOffset, idx), steps); } - MMObjectBuilder builder = step.getBuilder(); + + String builder = step.getTableName(); String fieldName; if (idx == -1) { fieldName = token.substring(bracketOffset, token.length() - bracketOffset); @@ -444,20 +442,20 @@ fieldName = token.substring(idx + 1, token.length() - bracketOffset); } - CoreField coreField = builder.getField(fieldName); + Field coreField = queryContext.getField(builder, fieldName); // maybe the field was already escaped with getAllowedField // otherwise it will definitely fail! if (coreField == null) { - String escapedFieldName = MMBase.getMMBase().getStorageManagerFactory().getStorageIdentifier(fieldName).toString(); + String escapedFieldName = queryContext.getStorageIdentifier(fieldName); if (! escapedFieldName.equals(fieldName)) { - coreField = builder.getField(fieldName); + coreField = queryContext.getField(builder, fieldName); if (coreField == null) { - throw new IllegalArgumentException("Unknown field (of builder " + builder.getTableName() + "): \"" + escapedFieldName + "\""); + throw new IllegalArgumentException("Unknown field (of builder " + builder + "): \"" + escapedFieldName + "\""); } } } if (coreField == null) { - throw new IllegalArgumentException("Unknown field (of builder " + builder.getTableName() + "): \"" + fieldName + "\""); + throw new IllegalArgumentException("Unknown field (of builder " + builder + "): \"" + fieldName + "\""); } BasicStepField field = new BasicStepField(step, coreField); return field; @@ -487,10 +485,12 @@ throw new IllegalArgumentException("Unknown table alias: \"" + alias + "\""); } + protected QueryContext queryContext = BRIDGE; + /** Creates a new instance of ConstraintParser * @param query */ - public ConstraintParser(SearchQuery query) { + protected ConstraintParser(SearchQuery query) { this.query = query; this.steps = query.getSteps(); } @@ -521,7 +521,7 @@ + "\n exception: " + e.getMessage() + "\nFalling back to BasicLegacyConstraint...", e); } - String escapedSqlConstraint = convertClauseToDBS(sqlConstraint); + String escapedSqlConstraint = convertClauseToDBS(queryContext, sqlConstraint); if (! validConstraints(escapedSqlConstraint)) { throw new IllegalArgumentException("Invalid constraints: " + sqlConstraint); } @@ -547,7 +547,7 @@ */ // package visibility! StepField getField(String token) { - return getField(token, (List<BasicStep>) steps, query); + return getField(queryContext, token, (List<BasicStep>) steps, query); } /** @@ -1075,4 +1075,9 @@ return result; } + + + + protected static final QueryContext BRIDGE = new QueryContext.Bridge(org.mmbase.bridge.ContextProvider.getDefaultCloudContext().getCloud("mmbase")); + } _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs