From 6a20eda27f5ca70780064e2f08308772cbe2b6e5 Mon Sep 17 00:00:00 2001 From: Andrew Hind Date: Wed, 15 Apr 2009 12:25:53 +0000 Subject: [PATCH] Final parts of FTS and CMIS split (MOB-570, MOB-573). Started adding FTS as a query language (MOB-574) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13955 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/cmis-api-context.xml | 27 +- config/alfresco/core-services-context.xml | 45 +- .../alfresco/cmis/search/CMISQueryParser.java | 165 ++++--- .../cmis/search/CMISQueryServiceImpl.java | 7 +- .../search/CMISResultSetMetaDataImpl.java | 4 +- .../search/CmisFunctionEvaluationContext.java | 85 +++- .../org/alfresco/cmis/search/QueryTest.java | 1 + .../ADMLuceneIndexerAndSearcherFactory.java | 11 + .../impl/lucene/ADMLuceneSearcherImpl.java | 48 ++- .../AVMLuceneIndexerAndSearcherFactory.java | 10 + .../alfresco/repo/search/impl/parsers/FTS.g | 4 +- .../repo/search/impl/parsers/FTSLexer.java | 402 ++++++++++-------- .../repo/search/impl/parsers/FTSParser.java | 8 +- .../search/impl/parsers/FTSQueryParser.java | 96 +++-- .../repo/search/impl/parsers/fts_test.gunit | 1 + .../querymodel/FunctionEvaluationContext.java | 28 +- .../impl/querymodel/PropertyArgument.java | 2 +- .../impl/querymodel/QueryModelFactory.java | 2 +- .../repo/search/impl/querymodel/Source.java | 2 +- .../search/impl/querymodel/impl/BaseJoin.java | 20 +- .../querymodel/impl/BasePropertyArgument.java | 6 +- .../impl/querymodel/impl/BaseSelector.java | 6 +- .../impl/lucene/LucenePropertyArgument.java | 2 +- .../querymodel/impl/lucene/LuceneQuery.java | 4 +- .../impl/lucene/LuceneQueryEngine.java | 2 +- .../impl/lucene/LuceneQueryModelFactory.java | 2 +- .../service/cmr/search/SearchService.java | 6 + 27 files changed, 607 insertions(+), 389 deletions(-) diff --git a/config/alfresco/cmis-api-context.xml b/config/alfresco/cmis-api-context.xml index 9b21054b2d..a3e47e9b4d 100644 --- a/config/alfresco/cmis-api-context.xml +++ b/config/alfresco/cmis-api-context.xml @@ -49,46 +49,29 @@ - + - - - - - - - - - - - - - - - - - - + org.alfresco.repo.search.impl.querymodel.QueryEngine - + - + - + diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index 82aeb287c4..8b17960576 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -489,6 +489,9 @@ + + + ${lucene.maxAtomicTransformationTime} @@ -532,7 +535,24 @@ - + + + + + + + + + + + + + + + + + + @@ -556,6 +576,9 @@ + + + ${lucene.maxAtomicTransformationTime} @@ -624,6 +647,9 @@ + + + ${lucene.maxAtomicTransformationTime} @@ -664,6 +690,23 @@ + + + + + + + + + + + + + + + + + diff --git a/source/java/org/alfresco/cmis/search/CMISQueryParser.java b/source/java/org/alfresco/cmis/search/CMISQueryParser.java index dd400c2d18..138bc0e512 100644 --- a/source/java/org/alfresco/cmis/search/CMISQueryParser.java +++ b/source/java/org/alfresco/cmis/search/CMISQueryParser.java @@ -43,8 +43,6 @@ import org.alfresco.cmis.CMISTypeDefinition; import org.alfresco.cmis.CMISQueryOptions.CMISQueryMode; import org.alfresco.repo.search.impl.parsers.CMISLexer; import org.alfresco.repo.search.impl.parsers.CMISParser; -import org.alfresco.repo.search.impl.parsers.FTSLexer; -import org.alfresco.repo.search.impl.parsers.FTSParser; import org.alfresco.repo.search.impl.parsers.FTSQueryParser; import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.ArgumentDefinition; @@ -52,6 +50,7 @@ import org.alfresco.repo.search.impl.querymodel.Column; import org.alfresco.repo.search.impl.querymodel.Constraint; import org.alfresco.repo.search.impl.querymodel.Function; import org.alfresco.repo.search.impl.querymodel.FunctionArgument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.JoinType; import org.alfresco.repo.search.impl.querymodel.ListArgument; import org.alfresco.repo.search.impl.querymodel.LiteralArgument; @@ -69,9 +68,6 @@ import org.alfresco.repo.search.impl.querymodel.impl.functions.Child; import org.alfresco.repo.search.impl.querymodel.impl.functions.Descendant; import org.alfresco.repo.search.impl.querymodel.impl.functions.Equals; import org.alfresco.repo.search.impl.querymodel.impl.functions.Exists; -import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSExactTerm; -import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSPhrase; -import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSTerm; import org.alfresco.repo.search.impl.querymodel.impl.functions.GreaterThan; import org.alfresco.repo.search.impl.querymodel.impl.functions.GreaterThanOrEquals; import org.alfresco.repo.search.impl.querymodel.impl.functions.In; @@ -101,22 +97,22 @@ public class CMISQueryParser private CMISDictionaryService cmisDictionaryService; private CMISJoinEnum joinSupport; - + private CMISScope[] validScopes; - - private static CMISScope[] STRICT_SCOPES = new CMISScope[] {CMISScope.DOCUMENT, CMISScope.FOLDER}; - private static CMISScope[] ALFRESCO_SCOPES = new CMISScope[] {CMISScope.DOCUMENT, CMISScope.FOLDER, CMISScope.POLICY}; - + + private static CMISScope[] STRICT_SCOPES = new CMISScope[] { CMISScope.DOCUMENT, CMISScope.FOLDER }; + + private static CMISScope[] ALFRESCO_SCOPES = new CMISScope[] { CMISScope.DOCUMENT, CMISScope.FOLDER, CMISScope.POLICY }; public CMISQueryParser(CMISQueryOptions options, CMISDictionaryService cmisDictionaryService, CMISJoinEnum joinSupport) { this.options = options; this.cmisDictionaryService = cmisDictionaryService; this.joinSupport = joinSupport; - this.validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? STRICT_SCOPES : ALFRESCO_SCOPES; + this.validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? STRICT_SCOPES : ALFRESCO_SCOPES; } - public Query parse(QueryModelFactory factory) + public Query parse(QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext) { CMISParser parser = null; try @@ -147,7 +143,7 @@ public class CMISQueryParser CommonTree orNode = (CommonTree) queryNode.getFirstChildWithType(CMISParser.DISJUNCTION); if (orNode != null) { - constraint = buildDisjunction(orNode, factory, selectors, columns); + constraint = buildDisjunction(orNode, factory, functionEvaluationContext, selectors, columns); } Query query = factory.createQuery(columns, source, constraint, orderings); @@ -176,13 +172,14 @@ public class CMISQueryParser * @param columns * @return */ - private Constraint buildDisjunction(CommonTree orNode, QueryModelFactory factory, Map selectors, ArrayList columns) + private Constraint buildDisjunction(CommonTree orNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Map selectors, + ArrayList columns) { List constraints = new ArrayList(orNode.getChildCount()); for (int i = 0; i < orNode.getChildCount(); i++) { CommonTree andNode = (CommonTree) orNode.getChild(i); - Constraint constraint = buildConjunction(andNode, factory, selectors, columns); + Constraint constraint = buildConjunction(andNode, factory, functionEvaluationContext, selectors, columns); constraints.add(constraint); } if (constraints.size() == 1) @@ -202,13 +199,14 @@ public class CMISQueryParser * @param columns * @return */ - private Constraint buildConjunction(CommonTree andNode, QueryModelFactory factory, Map selectors, ArrayList columns) + private Constraint buildConjunction(CommonTree andNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Map selectors, + ArrayList columns) { List constraints = new ArrayList(andNode.getChildCount()); for (int i = 0; i < andNode.getChildCount(); i++) { CommonTree notNode = (CommonTree) andNode.getChild(i); - Constraint constraint = buildNegation(notNode, factory, selectors, columns); + Constraint constraint = buildNegation(notNode, factory, functionEvaluationContext, selectors, columns); constraints.add(constraint); } if (constraints.size() == 1) @@ -228,16 +226,17 @@ public class CMISQueryParser * @param columns * @return */ - private Constraint buildNegation(CommonTree notNode, QueryModelFactory factory, Map selectors, ArrayList columns) + private Constraint buildNegation(CommonTree notNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Map selectors, + ArrayList columns) { if (notNode.getType() == CMISParser.NEGATION) { - Constraint constraint = buildTest((CommonTree) notNode.getChild(0), factory, selectors, columns); + Constraint constraint = buildTest((CommonTree) notNode.getChild(0), factory, functionEvaluationContext, selectors, columns); return factory.createNegation(constraint); } else { - return buildTest(notNode, factory, selectors, columns); + return buildTest(notNode, factory, functionEvaluationContext, selectors, columns); } } @@ -248,15 +247,16 @@ public class CMISQueryParser * @param columns * @return */ - private Constraint buildTest(CommonTree testNode, QueryModelFactory factory, Map selectors, ArrayList columns) + private Constraint buildTest(CommonTree testNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Map selectors, + ArrayList columns) { if (testNode.getType() == CMISParser.DISJUNCTION) { - return buildDisjunction(testNode, factory, selectors, columns); + return buildDisjunction(testNode, factory, functionEvaluationContext, selectors, columns); } else { - return buildPredicate(testNode, factory, selectors, columns); + return buildPredicate(testNode, factory, functionEvaluationContext, selectors, columns); } } @@ -267,7 +267,8 @@ public class CMISQueryParser * @param columns * @return */ - private Constraint buildPredicate(CommonTree predicateNode, QueryModelFactory factory, Map selectors, ArrayList columns) + private Constraint buildPredicate(CommonTree predicateNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Map selectors, + ArrayList columns) { String functionName; Function function; @@ -286,9 +287,9 @@ public class CMISQueryParser if (predicateNode.getChildCount() > 1) { arg = getFunctionArgument(argNode, function.getArgumentDefinition(Child.ARG_SELECTOR), factory, selectors); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { - throw new CMISQueryException("The property is not queryable: "+argNode.getText()); + throw new CMISQueryException("The property is not queryable: " + argNode.getText()); } functionArguments.put(arg.getName(), arg); } @@ -356,9 +357,9 @@ public class CMISQueryParser return factory.createFunctionalConstraint(function, functionArguments); case CMISParser.PRED_FTS: String ftsExpression = predicateNode.getChild(0).getText(); - FTSQueryParser ftsQueryParser = new FTSQueryParser(cmisDictionaryService); + FTSQueryParser ftsQueryParser = new FTSQueryParser(); Selector selector; - if(predicateNode.getChildCount() > 1) + if (predicateNode.getChildCount() > 1) { String qualifier = predicateNode.getChild(1).getText(); selector = selectors.get(qualifier); @@ -369,7 +370,7 @@ public class CMISQueryParser } else { - if(selectors.size() == 1) + if (selectors.size() == 1) { selector = selectors.get(selectors.keySet().iterator().next()); } @@ -378,7 +379,7 @@ public class CMISQueryParser throw new CMISQueryException("A selector must be specified when there are two or more selectors"); } } - return ftsQueryParser.buildFTS(ftsExpression.substring(1, ftsExpression.length()-1), factory, selector, columns); + return ftsQueryParser.buildFTS(ftsExpression.substring(1, ftsExpression.length() - 1), factory, functionEvaluationContext, selector, columns); case CMISParser.PRED_IN: functionName = In.NAME; function = factory.getFunction(functionName); @@ -413,9 +414,6 @@ public class CMISQueryParser } } - - - /** * @param queryNode * @param factory @@ -468,9 +466,16 @@ public class CMISQueryParser Selector selector = selectors.get(qualifier); if (selector == null) { - throw new CMISQueryException("No selector for " + qualifier); + if ((qualifier.equals("")) && (selectors.size() == 1)) + { + selector = selectors.get(selectors.keySet().iterator().next()); + } + else + { + throw new CMISQueryException("No selector for " + qualifier); + } } - + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForClass(selector.getType(), CMISScope.DOCUMENT, CMISScope.FOLDER); if (typeDef == null) { @@ -483,8 +488,8 @@ public class CMISQueryParser } Function function = factory.getFunction(PropertyAccessor.NAME); - Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), - propDef.getPropertyId().getQName()); + Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef + .getPropertyId().getName()); Map functionArguments = new LinkedHashMap(); functionArguments.put(arg.getName(), arg); @@ -500,9 +505,16 @@ public class CMISQueryParser Selector selector = selectors.get(qualifier); if (selector == null) { - throw new CMISQueryException("No selector for " + qualifier); + if ((qualifier.equals("")) && (selectors.size() == 1)) + { + selector = selectors.get(selectors.keySet().iterator().next()); + } + else + { + throw new CMISQueryException("No selector for " + qualifier); + } } - + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForClass(selector.getType(), CMISScope.DOCUMENT, CMISScope.FOLDER); if (typeDef == null) { @@ -513,10 +525,10 @@ public class CMISQueryParser { throw new CMISQueryException("Invalid column for " + typeDef.getQueryName() + "." + columnName + " selector alias " + selector.getAlias()); } - + Function function = factory.getFunction(PropertyAccessor.NAME); - Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), - propDef.getPropertyId().getQName()); + Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef + .getPropertyId().getName()); Map functionArguments = new LinkedHashMap(); functionArguments.put(arg.getName(), arg); @@ -560,7 +572,7 @@ public class CMISQueryParser { Function function = factory.getFunction(PropertyAccessor.NAME); Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, definition.isQueryable(), definition.isOrderable(), selector.getAlias(), - definition.getPropertyId().getQName()); + definition.getPropertyId().getName()); Map functionArguments = new LinkedHashMap(); functionArguments.put(arg.getName(), arg); String alias = (selector.getAlias().length() > 0) ? selector.getAlias() + "." + definition.getPropertyId().getName() : definition.getPropertyId().getName(); @@ -582,9 +594,16 @@ public class CMISQueryParser Selector selector = selectors.get(qualifier); if (selector == null) { - throw new CMISQueryException("No selector for " + qualifier + " in " + qualifier + ".*"); + if ((qualifier.equals("")) && (selectors.size() == 1)) + { + selector = selectors.get(selectors.keySet().iterator().next()); + } + else + { + throw new CMISQueryException("No selector for " + qualifier + " in " + qualifier + ".*"); + } } - + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForClass(selector.getType(), validScopes); if (typeDef == null) { @@ -597,10 +616,11 @@ public class CMISQueryParser { Function function = factory.getFunction(PropertyAccessor.NAME); Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, definition.isQueryable(), definition.isOrderable(), selector.getAlias(), - definition.getPropertyId().getQName()); + definition.getPropertyId().getName()); Map functionArguments = new LinkedHashMap(); functionArguments.put(arg.getName(), arg); - String alias = (selector.getAlias().length() > 0) ? selector.getAlias() + "." + definition.getPropertyId().getName() : definition.getPropertyId().getName(); + String alias = (selector.getAlias().length() > 0) ? selector.getAlias() + "." + definition.getPropertyId().getName() : definition.getPropertyId() + .getName(); Column column = factory.createColumn(function, functionArguments, alias); columns.add(column); } @@ -621,9 +641,16 @@ public class CMISQueryParser Selector selector = selectors.get(qualifier); if (selector == null) { - throw new CMISQueryException("No selector for " + qualifier); + if ((qualifier.equals("")) && (selectors.size() == 1)) + { + selector = selectors.get(selectors.keySet().iterator().next()); + } + else + { + throw new CMISQueryException("No selector for " + qualifier); + } } - + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForClass(selector.getType(), validScopes); if (typeDef == null) { @@ -636,8 +663,8 @@ public class CMISQueryParser } Function function = factory.getFunction(PropertyAccessor.NAME); - Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), - propDef.getPropertyId().getQName()); + Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef + .getPropertyId().getName()); Map functionArguments = new LinkedHashMap(); functionArguments.put(arg.getName(), arg); @@ -736,13 +763,13 @@ public class CMISQueryParser if (argNode.getType() == CMISParser.COLUMN_REF) { PropertyArgument arg = buildColumnReference(definition.getName(), argNode, factory); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { - throw new CMISQueryException("Column refers to unqueryable property "+arg.getPropertyName()); + throw new CMISQueryException("Column refers to unqueryable property " + arg.getPropertyName()); } - if(!selectors.containsKey(arg.getSelector())) + if (!selectors.containsKey(arg.getSelector())) { - throw new CMISQueryException("No table with alias "+arg.getSelector()); + throw new CMISQueryException("No table with alias " + arg.getSelector()); } return arg; } @@ -752,9 +779,9 @@ public class CMISQueryParser if (selectors.containsKey(id)) { SelectorArgument arg = factory.createSelectorArgument(definition.getName(), id); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { - throw new CMISQueryException("Selector is not queryable "+arg.getSelector()); + throw new CMISQueryException("Selector is not queryable " + arg.getSelector()); } return arg; } @@ -765,16 +792,16 @@ public class CMISQueryParser { throw new CMISQueryException("Column refers to unqueryable property " + definition.getName()); } - PropertyArgument arg = factory.createPropertyArgument(definition.getName(), propDef.isQueryable(), propDef.isOrderable(), "", propDef.getPropertyId().getQName()); + PropertyArgument arg = factory.createPropertyArgument(definition.getName(), propDef.isQueryable(), propDef.isOrderable(), "", propDef.getPropertyId().getName()); return arg; } } else if (argNode.getType() == CMISParser.PARAMETER) { ParameterArgument arg = factory.createParameterArgument(definition.getName(), argNode.getText()); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { - throw new CMISQueryException("Parameter is not queryable "+arg.getParameterName()); + throw new CMISQueryException("Parameter is not queryable " + arg.getParameterName()); } return arg; } @@ -826,7 +853,7 @@ public class CMISQueryParser arguments.add(getFunctionArgument(arg, definition, factory, selectors)); } ListArgument arg = factory.createListArgument(definition.getName(), arguments); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { throw new CMISQueryException("Not all members of the list are queryable"); } @@ -873,9 +900,9 @@ public class CMISQueryParser } } FunctionArgument arg = factory.createFunctionArgument(definition.getName(), function, functionArguments); - if(!arg.isQueryable()) + if (!arg.isQueryable()) { - throw new CMISQueryException("Not all function arguments refer to orderable arguments: "+arg.getFunction().getName()); + throw new CMISQueryException("Not all function arguments refer to orderable arguments: " + arg.getFunction().getName()); } return arg; } @@ -912,7 +939,7 @@ public class CMISQueryParser { alias = singleTableNode.getChild(1).getText(); } - + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForTable(tableName); if (typeDef == null) { @@ -983,15 +1010,15 @@ public class CMISQueryParser if (joinConditionNode != null) { PropertyArgument arg1 = buildColumnReference(Equals.ARG_LHS, (CommonTree) joinConditionNode.getChild(0), factory); - if(!lhs.getSelectors().containsKey(arg1.getSelector()) && !rhs.getSelectors().containsKey(arg1.getSelector())) + if (!lhs.getSelectors().containsKey(arg1.getSelector()) && !rhs.getSelectors().containsKey(arg1.getSelector())) { - throw new CMISQueryException("No table with alias "+arg1.getSelector()); + throw new CMISQueryException("No table with alias " + arg1.getSelector()); } String functionName = getFunctionName((CommonTree) joinConditionNode.getChild(1)); PropertyArgument arg2 = buildColumnReference(Equals.ARG_RHS, (CommonTree) joinConditionNode.getChild(2), factory); - if(!lhs.getSelectors().containsKey(arg2.getSelector()) && !rhs.getSelectors().containsKey(arg2.getSelector())) + if (!lhs.getSelectors().containsKey(arg2.getSelector()) && !rhs.getSelectors().containsKey(arg2.getSelector())) { - throw new CMISQueryException("No table with alias "+arg2.getSelector()); + throw new CMISQueryException("No table with alias " + arg2.getSelector()); } Function function = factory.getFunction(functionName); Map functionArguments = new LinkedHashMap(); @@ -1019,7 +1046,7 @@ public class CMISQueryParser qualifer = columnReferenceNode.getChild(1).getText(); } CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(cmisPropertyName, null); - return factory.createPropertyArgument(argumentName, propDef.isQueryable(), propDef.isOrderable(), qualifer, propDef.getPropertyId().getQName()); + return factory.createPropertyArgument(argumentName, propDef.isQueryable(), propDef.isOrderable(), qualifer, propDef.getPropertyId().getName()); } public String getFunctionName(CommonTree functionNameNode) diff --git a/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java b/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java index dfb17a45e4..5d9319dcf1 100644 --- a/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java @@ -103,12 +103,13 @@ public class CMISQueryServiceImpl implements CMISQueryService { joinSupport = CMISJoinEnum.INNER_JOIN_SUPPORT; } - CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport); - Query query = parser.parse(queryEngine.getQueryModelFactory()); - + CmisFunctionEvaluationContext functionContext = new CmisFunctionEvaluationContext(); functionContext.setCmisDictionaryService(cmisDictionaryService); functionContext.setNodeService(nodeService); + + CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport); + Query query = parser.parse(queryEngine.getQueryModelFactory(), functionContext); QueryEngineResults results = queryEngine.executeQuery(query, options, functionContext); Map wrapped = new HashMap(); diff --git a/source/java/org/alfresco/cmis/search/CMISResultSetMetaDataImpl.java b/source/java/org/alfresco/cmis/search/CMISResultSetMetaDataImpl.java index 2e34066b8e..6cc10168da 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSetMetaDataImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSetMetaDataImpl.java @@ -74,8 +74,8 @@ public class CMISResultSetMetaDataImpl implements CMISResultSetMetaData if (column.getFunction().getName().equals(PropertyAccessor.NAME)) { PropertyArgument arg = (PropertyArgument) column.getFunctionArguments().get(PropertyAccessor.ARG_PROPERTY); - QName propertyQName = arg.getPropertyName(); - propertyDefinition = cmisDictionaryService.findProperty(propertyQName, null); + String propertyName = arg.getPropertyName(); + propertyDefinition = cmisDictionaryService.findProperty(propertyName, null); type = propertyDefinition.getDataType(); } if (type == null) diff --git a/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java b/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java index 5afe0d5af1..c7339934f2 100644 --- a/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java +++ b/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java @@ -28,8 +28,10 @@ import java.io.Serializable; import java.util.Collection; import java.util.Map; +import org.alfresco.cmis.CMISDictionaryModel; import org.alfresco.cmis.CMISDictionaryService; import org.alfresco.cmis.CMISPropertyDefinition; +import org.alfresco.cmis.mapping.CMISMapping; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.PredicateMode; @@ -116,9 +118,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#getProperty(org.alfresco.service.cmr.repository.NodeRef, * org.alfresco.service.namespace.QName) */ - public Serializable getProperty(NodeRef nodeRef, QName propertyQName) + public Serializable getProperty(NodeRef nodeRef, String propertyName) { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyAccessor().getValue(nodeRef); } @@ -149,9 +151,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext this.score = score; } - public Query buildLuceneEquality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneEquality(lqp, value, mode); } @@ -161,9 +163,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, * org.alfresco.service.namespace.QName, java.lang.Boolean) */ - public Query buildLuceneExists(LuceneQueryParser lqp, QName propertyQName, Boolean not) throws ParseException + public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneExists(lqp, not); } @@ -174,9 +176,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.io.Serializable, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneGreaterThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneGreaterThan(lqp, value, mode); } @@ -187,9 +189,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.io.Serializable, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneGreaterThanOrEquals(lqp, value, mode); } @@ -200,9 +202,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.util.Collection, java.lang.Boolean, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneIn(LuceneQueryParser lqp, QName propertyQName, Collection values, Boolean not, PredicateMode mode) throws ParseException + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneIn(lqp, values, not, mode); } @@ -213,9 +215,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.io.Serializable, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneInequality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneInequality(lqp, value, mode); } @@ -226,9 +228,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.io.Serializable, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneLessThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneLessThan(lqp, value, mode); } @@ -239,9 +241,9 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * org.alfresco.service.namespace.QName, java.io.Serializable, * org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneLessThanOrEquals(lqp, value, mode); } @@ -251,19 +253,58 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, * org.alfresco.service.namespace.QName, java.io.Serializable, java.lang.Boolean) */ - public Query buildLuceneLike(LuceneQueryParser lqp, QName propertyQName, Serializable value, Boolean not) throws ParseException + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().buildLuceneLike(lqp, value, not); } /* (non-Javadoc) * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#getLuceneSortField(org.alfresco.service.namespace.QName) */ - public String getLuceneSortField(QName propertyQName) + public String getLuceneSortField(String propertyName) { - CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyQName, null); + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); return propertyDef.getPropertyLuceneBuilder().getLuceneSortField(); } + + public boolean isObjectId(String propertyName) + { + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(propertyName, null); + if(propertyDef == null) + { + return false; + } + else + { + return CMISMapping.PROP_OBJECT_ID_QNAME.equals(propertyDef.getPropertyId().getQName()); + } + } + + public boolean isOrderable(String fieldName) + { + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(fieldName, null); + if(propertyDef == null) + { + return false; + } + else + { + return propertyDef.isOrderable(); + } + } + + public boolean isQueryable(String fieldName) + { + CMISPropertyDefinition propertyDef = cmisDictionaryService.findProperty(fieldName, null); + if(propertyDef == null) + { + return true; + } + else + { + return propertyDef.isQueryable(); + } + } } diff --git a/source/java/org/alfresco/cmis/search/QueryTest.java b/source/java/org/alfresco/cmis/search/QueryTest.java index 65e641ff0a..33a0faf25d 100644 --- a/source/java/org/alfresco/cmis/search/QueryTest.java +++ b/source/java/org/alfresco/cmis/search/QueryTest.java @@ -1537,6 +1537,7 @@ public class QueryTest extends BaseCMISTest testQuery("SELECT * FROM Document WHERE CONTAINS('\"zebra\"')", 9, false, "ObjectId", new String(), false); testQuery("SELECT * FROM Document WHERE CONTAINS('\"quick\"')", 1, false, "ObjectId", new String(), false); testQuery("SELECT * FROM Document D WHERE CONTAINS(D, 'Name:\"quick\"')", 1, false, "ObjectId", new String(), false); + testQuery("SELECT Name as BOO FROM Document D WHERE CONTAINS('BOO:\"quick\"')", 1, false, "ObjectId", new String(), false); } public void testBasicSelectAsGuest() diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java index 25576b16fb..29c69ee160 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java @@ -29,6 +29,7 @@ import java.util.List; import org.alfresco.repo.search.SearcherException; import org.alfresco.repo.search.SupportsBackgroundIndexing; import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; +import org.alfresco.repo.search.impl.querymodel.QueryEngine; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.NodeService; @@ -51,6 +52,8 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd protected FullTextSearchIndexer fullTextSearchIndexer; protected ContentService contentService; + + private QueryEngine queryEngine; /** * Set the dictinary service @@ -94,6 +97,13 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd this.contentService = contentService; } + + + public void setQueryEngine(QueryEngine queryEngine) + { + this.queryEngine = queryEngine; + } + protected LuceneIndexer createIndexer(StoreRef storeRef, String deltaId) { storeRef = tenantService.getName(storeRef); @@ -120,6 +130,7 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd searcher.setTenantService(tenantService); searcher.setDictionaryService(dictionaryService); searcher.setQueryRegister(getQueryRegister()); + searcher.setQueryEngine(queryEngine); return searcher; } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneSearcherImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneSearcherImpl.java index 9efa301bac..92669f0d47 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneSearcherImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneSearcherImpl.java @@ -37,6 +37,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import org.alfresco.cmis.CMISQueryException; import org.alfresco.i18n.I18NUtil; import org.alfresco.repo.search.CannedQueryDef; import org.alfresco.repo.search.EmptyResultSet; @@ -45,6 +46,13 @@ import org.alfresco.repo.search.QueryRegisterComponent; import org.alfresco.repo.search.SearcherException; import org.alfresco.repo.search.impl.NodeSearcher; import org.alfresco.repo.search.impl.lucene.analysis.DateTimeAnalyser; +import org.alfresco.repo.search.impl.parsers.FTSQueryParser; +import org.alfresco.repo.search.impl.querymodel.Constraint; +import org.alfresco.repo.search.impl.querymodel.QueryEngine; +import org.alfresco.repo.search.impl.querymodel.QueryEngineResults; +import org.alfresco.repo.search.impl.querymodel.QueryModelFactory; +import org.alfresco.repo.search.impl.querymodel.QueryOptions; +import org.alfresco.repo.search.impl.querymodel.Selector; import org.alfresco.repo.search.results.SortedResultSet; import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -56,6 +64,7 @@ import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.XPathException; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.QueryParameter; import org.alfresco.service.cmr.search.QueryParameterDefinition; import org.alfresco.service.cmr.search.ResultSet; @@ -108,6 +117,8 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS private LuceneIndexer indexer; + private QueryEngine queryEngine; + /* * Searcher implementation */ @@ -170,6 +181,11 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS this.tenantService = tenantService; } + public void setQueryEngine(QueryEngine queryEngine) + { + this.queryEngine = queryEngine; + } + /** * Set the query register * @@ -286,7 +302,8 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS { throw new SearcherException("Order on content properties is not curently supported"); } - else if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT)) || (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT))) + else if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT)) + || (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT))) { List locales = searchParameters.getLocales(); if (((locales == null) || (locales.size() == 0))) @@ -298,7 +315,7 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS { throw new SearcherException("Order on text/mltext properties with more than one locale is not curently supported"); } - + sortLocale = locales.get(0); // find best field match @@ -388,7 +405,7 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS Path[] paths = searchParameters.getAttributePaths().toArray(new Path[0]); ResultSet rs = new LuceneResultSet(hits, searcher, nodeService, tenantService, paths, searchParameters, getLuceneConfig()); - if(getLuceneConfig().getPostSortDateTime() && requiresPostSort) + if (getLuceneConfig().getPostSortDateTime() && requiresPostSort) { ResultSet sorted = new SortedResultSet(rs, nodeService, searchParameters, namespacePrefixResolver); return sorted; @@ -441,6 +458,31 @@ public class ADMLuceneSearcherImpl extends AbstractLuceneBase implements LuceneS throw new SearcherException("IO exception during search", e); } } + else if (searchParameters.getLanguage().equalsIgnoreCase(SearchService.LANGUAGE_FTS_ALFRESCO)) + { + String ftsExpression = searchParameters.getQuery(); + FTSQueryParser ftsQueryParser = new FTSQueryParser(); + QueryModelFactory factory = queryEngine.getQueryModelFactory(); + Constraint constraint = ftsQueryParser.buildFTS(ftsExpression.substring(1, ftsExpression.length() - 1), factory, null, null, null); + org.alfresco.repo.search.impl.querymodel.Query query = factory.createQuery(null, null, constraint, null); + QueryOptions options = new QueryOptions(searchParameters.getQuery(), null); + options.setFetchSize(searchParameters.getBulkFecthSize()); + options.setIncludeInTransactionData(!searchParameters.excludeDataInTheCurrentTransaction()); + if(searchParameters.getLimitBy() == LimitBy.FINAL_SIZE) + { + options.setMaxItems(searchParameters.getLimit()); + } + else + { + options.setMaxItems(-1); + } + options.setMlAnalaysisMode(searchParameters.getMlAnalaysisMode()); + options.setLocales(searchParameters.getLocales()); + options.setStores(searchParameters.getStores()); + + QueryEngineResults results = queryEngine.executeQuery(query, options, null); + return results.getResults().values().iterator().next(); + } else { throw new SearcherException("Unknown query language: " + searchParameters.getLanguage()); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java index df94e0aef1..9efde0922b 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java @@ -32,6 +32,7 @@ import org.alfresco.repo.content.ContentStore; import org.alfresco.repo.search.SearcherException; import org.alfresco.repo.search.SupportsBackgroundIndexing; import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; +import org.alfresco.repo.search.impl.querymodel.QueryEngine; import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avmsync.AVMSyncService; @@ -68,6 +69,8 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd private ContentStore contentStore; private FullTextSearchIndexer fullTextSearchIndexer; + + private QueryEngine queryEngine; public AVMLuceneIndexerAndSearcherFactory() { @@ -139,6 +142,12 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd this.contentStore = contentStore; } + + public void setQueryEngine(QueryEngine queryEngine) + { + this.queryEngine = queryEngine; + } + @Override protected LuceneIndexer createIndexer(StoreRef storeRef, String deltaId) { @@ -177,6 +186,7 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd searcher.setTenantService(tenantService); searcher.setDictionaryService(dictionaryService); searcher.setQueryRegister(getQueryRegister()); + searcher.setQueryEngine(queryEngine); return searcher; } diff --git a/source/java/org/alfresco/repo/search/impl/parsers/FTS.g b/source/java/org/alfresco/repo/search/impl/parsers/FTS.g index 4b1ca8b07f..737e321fec 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/FTS.g +++ b/source/java/org/alfresco/repo/search/impl/parsers/FTS.g @@ -457,9 +457,7 @@ LT : '<'; */ ID : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$'|'#')* ; -FTSWORD : (F_ESC | INWORD)+; - - +FTSWORD : (F_ESC | INWORD | STAR | QUESTION_MARK)+; fragment F_ESC : '\\' diff --git a/source/java/org/alfresco/repo/search/impl/parsers/FTSLexer.java b/source/java/org/alfresco/repo/search/impl/parsers/FTSLexer.java index d08ed3ffac..d4312fb895 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/FTSLexer.java +++ b/source/java/org/alfresco/repo/search/impl/parsers/FTSLexer.java @@ -1,4 +1,4 @@ -// $ANTLR !Unknown version! W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g 2009-04-14 14:56:06 +// $ANTLR !Unknown version! W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g 2009-04-14 15:35:36 package org.alfresco.repo.search.impl.parsers; import org.antlr.runtime.*; @@ -1261,14 +1261,14 @@ public class FTSLexer extends Lexer { try { int _type = FTSWORD; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:9: ( ( F_ESC | INWORD )+ ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:12: ( F_ESC | INWORD )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:9: ( ( F_ESC | INWORD | STAR | QUESTION_MARK )+ ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:12: ( F_ESC | INWORD | STAR | QUESTION_MARK )+ { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:12: ( F_ESC | INWORD )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:12: ( F_ESC | INWORD | STAR | QUESTION_MARK )+ int cnt12=0; loop12: do { - int alt12=3; + int alt12=5; int LA12_0 = input.LA(1); if ( (LA12_0=='\\') ) { @@ -1277,6 +1277,12 @@ public class FTSLexer extends Lexer { else if ( ((LA12_0>='0' && LA12_0<='9')||(LA12_0>='A' && LA12_0<='Z')||(LA12_0>='a' && LA12_0<='z')||(LA12_0>='\u00C0' && LA12_0<='\u00D6')||(LA12_0>='\u00D8' && LA12_0<='\u00F6')||(LA12_0>='\u00F8' && LA12_0<='\u1FFF')||(LA12_0>='\u3040' && LA12_0<='\u318F')||(LA12_0>='\u3300' && LA12_0<='\u337F')||(LA12_0>='\u3400' && LA12_0<='\u3D2D')||(LA12_0>='\u4E00' && LA12_0<='\u9FFF')||(LA12_0>='\uAC00' && LA12_0<='\uD7AF')||(LA12_0>='\uF900' && LA12_0<='\uFAFF')) ) { alt12=2; } + else if ( (LA12_0=='*') ) { + alt12=3; + } + else if ( (LA12_0=='?') ) { + alt12=4; + } switch (alt12) { @@ -1292,6 +1298,20 @@ public class FTSLexer extends Lexer { { mINWORD(); if (state.failed) return ; + } + break; + case 3 : + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:30: STAR + { + mSTAR(); if (state.failed) return ; + + } + break; + case 4 : + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:460:37: QUESTION_MARK + { + mQUESTION_MARK(); if (state.failed) return ; + } break; @@ -1319,11 +1339,11 @@ public class FTSLexer extends Lexer { // $ANTLR start "F_ESC" public final void mF_ESC() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:465:9: ( '\\\\' ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:465:11: '\\\\' ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:463:9: ( '\\\\' ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:463:11: '\\\\' ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) { match('\\'); if (state.failed) return ; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:466:5: ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:464:5: ( 'u' F_HEX F_HEX F_HEX F_HEX | . ) int alt13=2; int LA13_0 = input.LA(1); @@ -1348,7 +1368,7 @@ public class FTSLexer extends Lexer { } switch (alt13) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:466:7: 'u' F_HEX F_HEX F_HEX F_HEX + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:464:7: 'u' F_HEX F_HEX F_HEX F_HEX { match('u'); if (state.failed) return ; mF_HEX(); if (state.failed) return ; @@ -1359,7 +1379,7 @@ public class FTSLexer extends Lexer { } break; case 2 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:467:7: . + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:465:7: . { matchAny(); if (state.failed) return ; @@ -1380,7 +1400,7 @@ public class FTSLexer extends Lexer { // $ANTLR start "F_HEX" public final void mF_HEX() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:472:7: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:470:7: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g: { if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) { @@ -1405,7 +1425,7 @@ public class FTSLexer extends Lexer { // $ANTLR start "INWORD" public final void mINWORD() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:479:8: ( '\\u0041' .. '\\u005A' | '\\u0061' .. '\\u007A' | '\\u00C0' .. '\\u00D6' | '\\u00D8' .. '\\u00F6' | '\\u00F8' .. '\\u00FF' | '\\u0100' .. '\\u1FFF' | '\\u3040' .. '\\u318F' | '\\u3300' .. '\\u337F' | '\\u3400' .. '\\u3D2D' | '\\u4E00' .. '\\u9FFF' | '\\uF900' .. '\\uFAFF' | '\\uAC00' .. '\\uD7AF' | '\\u0030' .. '\\u0039' | '\\u0660' .. '\\u0669' | '\\u06F0' .. '\\u06F9' | '\\u0966' .. '\\u096F' | '\\u09E6' .. '\\u09EF' | '\\u0A66' .. '\\u0A6F' | '\\u0AE6' .. '\\u0AEF' | '\\u0B66' .. '\\u0B6F' | '\\u0BE7' .. '\\u0BEF' | '\\u0C66' .. '\\u0C6F' | '\\u0CE6' .. '\\u0CEF' | '\\u0D66' .. '\\u0D6F' | '\\u0E50' .. '\\u0E59' | '\\u0ED0' .. '\\u0ED9' | '\\u1040' .. '\\u1049' ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:477:8: ( '\\u0041' .. '\\u005A' | '\\u0061' .. '\\u007A' | '\\u00C0' .. '\\u00D6' | '\\u00D8' .. '\\u00F6' | '\\u00F8' .. '\\u00FF' | '\\u0100' .. '\\u1FFF' | '\\u3040' .. '\\u318F' | '\\u3300' .. '\\u337F' | '\\u3400' .. '\\u3D2D' | '\\u4E00' .. '\\u9FFF' | '\\uF900' .. '\\uFAFF' | '\\uAC00' .. '\\uD7AF' | '\\u0030' .. '\\u0039' | '\\u0660' .. '\\u0669' | '\\u06F0' .. '\\u06F9' | '\\u0966' .. '\\u096F' | '\\u09E6' .. '\\u09EF' | '\\u0A66' .. '\\u0A6F' | '\\u0AE6' .. '\\u0AEF' | '\\u0B66' .. '\\u0B6F' | '\\u0BE7' .. '\\u0BEF' | '\\u0C66' .. '\\u0C6F' | '\\u0CE6' .. '\\u0CEF' | '\\u0D66' .. '\\u0D6F' | '\\u0E50' .. '\\u0E59' | '\\u0ED0' .. '\\u0ED9' | '\\u1040' .. '\\u1049' ) // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g: { if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00D6')||(input.LA(1)>='\u00D8' && input.LA(1)<='\u00F6')||(input.LA(1)>='\u00F8' && input.LA(1)<='\u1FFF')||(input.LA(1)>='\u3040' && input.LA(1)<='\u318F')||(input.LA(1)>='\u3300' && input.LA(1)<='\u337F')||(input.LA(1)>='\u3400' && input.LA(1)<='\u3D2D')||(input.LA(1)>='\u4E00' && input.LA(1)<='\u9FFF')||(input.LA(1)>='\uAC00' && input.LA(1)<='\uD7AF')||(input.LA(1)>='\uF900' && input.LA(1)<='\uFAFF') ) { @@ -1432,10 +1452,10 @@ public class FTSLexer extends Lexer { try { int _type = DECIMAL_INTEGER_LITERAL; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:509:9: ( ( PLUS | MINUS )? DECIMAL_NUMERAL ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:509:11: ( PLUS | MINUS )? DECIMAL_NUMERAL + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:507:9: ( ( PLUS | MINUS )? DECIMAL_NUMERAL ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:507:11: ( PLUS | MINUS )? DECIMAL_NUMERAL { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:509:11: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:507:11: ( PLUS | MINUS )? int alt14=2; int LA14_0 = input.LA(1); @@ -1482,19 +1502,19 @@ public class FTSLexer extends Lexer { Token d=null; Token r=null; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:516:3: (d= START_RANGE_I r= DOTDOT | d= START_RANGE_F r= DOTDOT | ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? | ( PLUS | MINUS )? ( DIGIT )+ EXPONENT ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:514:3: (d= START_RANGE_I r= DOTDOT | d= START_RANGE_F r= DOTDOT | ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? | ( PLUS | MINUS )? ( DIGIT )+ EXPONENT ) int alt24=5; alt24 = dfa24.predict(input); switch (alt24) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:516:5: d= START_RANGE_I r= DOTDOT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:514:5: d= START_RANGE_I r= DOTDOT { - int dStart1073 = getCharIndex(); + int dStart1078 = getCharIndex(); mSTART_RANGE_I(); if (state.failed) return ; - d = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, dStart1073, getCharIndex()-1); - int rStart1077 = getCharIndex(); + d = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, dStart1078, getCharIndex()-1); + int rStart1082 = getCharIndex(); mDOTDOT(); if (state.failed) return ; - r = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, rStart1077, getCharIndex()-1); + r = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, rStart1082, getCharIndex()-1); if ( state.backtracking==0 ) { d.setType(DECIMAL_INTEGER_LITERAL); @@ -1507,14 +1527,14 @@ public class FTSLexer extends Lexer { } break; case 2 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:523:5: d= START_RANGE_F r= DOTDOT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:521:5: d= START_RANGE_F r= DOTDOT { - int dStart1091 = getCharIndex(); + int dStart1096 = getCharIndex(); mSTART_RANGE_F(); if (state.failed) return ; - d = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, dStart1091, getCharIndex()-1); - int rStart1095 = getCharIndex(); + d = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, dStart1096, getCharIndex()-1); + int rStart1100 = getCharIndex(); mDOTDOT(); if (state.failed) return ; - r = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, rStart1095, getCharIndex()-1); + r = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, rStart1100, getCharIndex()-1); if ( state.backtracking==0 ) { d.setType(FLOATING_POINT_LITERAL); @@ -1527,9 +1547,9 @@ public class FTSLexer extends Lexer { } break; case 3 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:5: ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:5: ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:5: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:5: ( PLUS | MINUS )? int alt15=2; int LA15_0 = input.LA(1); @@ -1556,7 +1576,7 @@ public class FTSLexer extends Lexer { } - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:21: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:21: ( DIGIT )+ int cnt16=0; loop16: do { @@ -1570,7 +1590,7 @@ public class FTSLexer extends Lexer { switch (alt16) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:21: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:21: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1588,7 +1608,7 @@ public class FTSLexer extends Lexer { } while (true); mDOT(); if (state.failed) return ; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:32: ( DIGIT )* + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:32: ( DIGIT )* loop17: do { int alt17=2; @@ -1601,7 +1621,7 @@ public class FTSLexer extends Lexer { switch (alt17) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:32: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:32: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1613,7 +1633,7 @@ public class FTSLexer extends Lexer { } } while (true); - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:39: ( EXPONENT )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:39: ( EXPONENT )? int alt18=2; int LA18_0 = input.LA(1); @@ -1622,7 +1642,7 @@ public class FTSLexer extends Lexer { } switch (alt18) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:39: EXPONENT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:528:39: EXPONENT { mEXPONENT(); if (state.failed) return ; @@ -1635,9 +1655,9 @@ public class FTSLexer extends Lexer { } break; case 4 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:5: ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:5: ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:5: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:5: ( PLUS | MINUS )? int alt19=2; int LA19_0 = input.LA(1); @@ -1665,7 +1685,7 @@ public class FTSLexer extends Lexer { } mDOT(); if (state.failed) return ; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:25: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:25: ( DIGIT )+ int cnt20=0; loop20: do { @@ -1679,7 +1699,7 @@ public class FTSLexer extends Lexer { switch (alt20) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:25: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:25: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1696,7 +1716,7 @@ public class FTSLexer extends Lexer { cnt20++; } while (true); - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:32: ( EXPONENT )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:32: ( EXPONENT )? int alt21=2; int LA21_0 = input.LA(1); @@ -1705,7 +1725,7 @@ public class FTSLexer extends Lexer { } switch (alt21) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:531:32: EXPONENT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:529:32: EXPONENT { mEXPONENT(); if (state.failed) return ; @@ -1718,9 +1738,9 @@ public class FTSLexer extends Lexer { } break; case 5 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:532:5: ( PLUS | MINUS )? ( DIGIT )+ EXPONENT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:5: ( PLUS | MINUS )? ( DIGIT )+ EXPONENT { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:532:5: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:5: ( PLUS | MINUS )? int alt22=2; int LA22_0 = input.LA(1); @@ -1747,7 +1767,7 @@ public class FTSLexer extends Lexer { } - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:532:21: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:21: ( DIGIT )+ int cnt23=0; loop23: do { @@ -1761,7 +1781,7 @@ public class FTSLexer extends Lexer { switch (alt23) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:532:21: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:530:21: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1795,10 +1815,10 @@ public class FTSLexer extends Lexer { // $ANTLR start "START_RANGE_I" public final void mSTART_RANGE_I() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:536:14: ( ( PLUS | MINUS )? ( DIGIT )+ ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:536:16: ( PLUS | MINUS )? ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:534:14: ( ( PLUS | MINUS )? ( DIGIT )+ ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:534:16: ( PLUS | MINUS )? ( DIGIT )+ { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:536:16: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:534:16: ( PLUS | MINUS )? int alt25=2; int LA25_0 = input.LA(1); @@ -1825,7 +1845,7 @@ public class FTSLexer extends Lexer { } - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:536:32: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:534:32: ( DIGIT )+ int cnt26=0; loop26: do { @@ -1839,7 +1859,7 @@ public class FTSLexer extends Lexer { switch (alt26) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:536:32: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:534:32: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1868,10 +1888,10 @@ public class FTSLexer extends Lexer { // $ANTLR start "START_RANGE_F" public final void mSTART_RANGE_F() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:540:14: ( ( PLUS | MINUS )? ( DIGIT )+ DOT ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:540:16: ( PLUS | MINUS )? ( DIGIT )+ DOT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:538:14: ( ( PLUS | MINUS )? ( DIGIT )+ DOT ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:538:16: ( PLUS | MINUS )? ( DIGIT )+ DOT { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:540:16: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:538:16: ( PLUS | MINUS )? int alt27=2; int LA27_0 = input.LA(1); @@ -1898,7 +1918,7 @@ public class FTSLexer extends Lexer { } - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:540:32: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:538:32: ( DIGIT )+ int cnt28=0; loop28: do { @@ -1912,7 +1932,7 @@ public class FTSLexer extends Lexer { switch (alt28) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:540:32: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:538:32: DIGIT { mDIGIT(); if (state.failed) return ; @@ -1942,7 +1962,7 @@ public class FTSLexer extends Lexer { // $ANTLR start "DECIMAL_NUMERAL" public final void mDECIMAL_NUMERAL() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:549:3: ( ZERO_DIGIT | NON_ZERO_DIGIT ( DIGIT )* ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:547:3: ( ZERO_DIGIT | NON_ZERO_DIGIT ( DIGIT )* ) int alt30=2; int LA30_0 = input.LA(1); @@ -1961,17 +1981,17 @@ public class FTSLexer extends Lexer { } switch (alt30) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:549:5: ZERO_DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:547:5: ZERO_DIGIT { mZERO_DIGIT(); if (state.failed) return ; } break; case 2 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:550:5: NON_ZERO_DIGIT ( DIGIT )* + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:548:5: NON_ZERO_DIGIT ( DIGIT )* { mNON_ZERO_DIGIT(); if (state.failed) return ; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:550:20: ( DIGIT )* + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:548:20: ( DIGIT )* loop29: do { int alt29=2; @@ -1984,7 +2004,7 @@ public class FTSLexer extends Lexer { switch (alt29) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:550:20: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:548:20: DIGIT { mDIGIT(); if (state.failed) return ; @@ -2010,7 +2030,7 @@ public class FTSLexer extends Lexer { // $ANTLR start "DIGIT" public final void mDIGIT() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:553:7: ( ZERO_DIGIT | NON_ZERO_DIGIT ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:551:7: ( ZERO_DIGIT | NON_ZERO_DIGIT ) // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g: { if ( (input.LA(1)>='0' && input.LA(1)<='9') ) { @@ -2035,8 +2055,8 @@ public class FTSLexer extends Lexer { // $ANTLR start "ZERO_DIGIT" public final void mZERO_DIGIT() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:556:3: ( '0' ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:556:5: '0' + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:554:3: ( '0' ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:554:5: '0' { match('0'); if (state.failed) return ; @@ -2051,8 +2071,8 @@ public class FTSLexer extends Lexer { // $ANTLR start "NON_ZERO_DIGIT" public final void mNON_ZERO_DIGIT() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:559:3: ( '1' .. '9' ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:559:5: '1' .. '9' + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:557:3: ( '1' .. '9' ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:557:5: '1' .. '9' { matchRange('1','9'); if (state.failed) return ; @@ -2067,8 +2087,8 @@ public class FTSLexer extends Lexer { // $ANTLR start "E" public final void mE() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:562:3: ( ( 'e' | 'E' ) ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:562:5: ( 'e' | 'E' ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:560:3: ( ( 'e' | 'E' ) ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:560:5: ( 'e' | 'E' ) { if ( input.LA(1)=='E'||input.LA(1)=='e' ) { input.consume(); @@ -2092,8 +2112,8 @@ public class FTSLexer extends Lexer { // $ANTLR start "EXPONENT" public final void mEXPONENT() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:566:3: ( E SIGNED_INTEGER ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:566:5: E SIGNED_INTEGER + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:564:3: ( E SIGNED_INTEGER ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:564:5: E SIGNED_INTEGER { mE(); if (state.failed) return ; mSIGNED_INTEGER(); if (state.failed) return ; @@ -2109,10 +2129,10 @@ public class FTSLexer extends Lexer { // $ANTLR start "SIGNED_INTEGER" public final void mSIGNED_INTEGER() throws RecognitionException { try { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:570:3: ( ( PLUS | MINUS )? ( DIGIT )+ ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:570:5: ( PLUS | MINUS )? ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:568:3: ( ( PLUS | MINUS )? ( DIGIT )+ ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:568:5: ( PLUS | MINUS )? ( DIGIT )+ { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:570:5: ( PLUS | MINUS )? + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:568:5: ( PLUS | MINUS )? int alt31=2; int LA31_0 = input.LA(1); @@ -2139,7 +2159,7 @@ public class FTSLexer extends Lexer { } - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:570:21: ( DIGIT )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:568:21: ( DIGIT )+ int cnt32=0; loop32: do { @@ -2153,7 +2173,7 @@ public class FTSLexer extends Lexer { switch (alt32) { case 1 : - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:570:21: DIGIT + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:568:21: DIGIT { mDIGIT(); if (state.failed) return ; @@ -2184,10 +2204,10 @@ public class FTSLexer extends Lexer { try { int _type = WS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:574:4: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:574:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:572:4: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:572:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ { - // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:574:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ + // W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g:572:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ int cnt33=0; loop33: do { @@ -2672,24 +2692,24 @@ public class FTSLexer extends Lexer { } } static final String DFA24_eotS = - "\5\uffff\1\7\1\11\3\uffff"; + "\4\uffff\1\7\1\uffff\1\11\3\uffff"; static final String DFA24_eofS = "\12\uffff"; static final String DFA24_minS = - "\1\53\2\56\2\uffff\2\56\3\uffff"; + "\1\53\2\56\1\uffff\1\56\1\uffff\1\56\3\uffff"; static final String DFA24_maxS = - "\2\71\1\145\2\uffff\2\56\3\uffff"; + "\2\71\1\145\1\uffff\1\56\1\uffff\1\56\3\uffff"; static final String DFA24_acceptS = - "\3\uffff\1\4\1\5\2\uffff\1\3\1\2\1\1"; + "\3\uffff\1\4\1\uffff\1\5\1\uffff\1\3\1\2\1\1"; static final String DFA24_specialS = "\12\uffff}>"; static final String[] DFA24_transitionS = { "\1\1\1\uffff\1\1\1\3\1\uffff\12\2", "\1\3\1\uffff\12\2", - "\1\5\1\uffff\12\2\13\uffff\1\4\37\uffff\1\4", - "", + "\1\4\1\uffff\12\2\13\uffff\1\5\37\uffff\1\5", "", "\1\6", + "", "\1\10", "", "", @@ -2726,32 +2746,34 @@ public class FTSLexer extends Lexer { this.transition = DFA24_transition; } public String getDescription() { - return "515:1: FLOATING_POINT_LITERAL : (d= START_RANGE_I r= DOTDOT | d= START_RANGE_F r= DOTDOT | ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? | ( PLUS | MINUS )? ( DIGIT )+ EXPONENT );"; + return "513:1: FLOATING_POINT_LITERAL : (d= START_RANGE_I r= DOTDOT | d= START_RANGE_F r= DOTDOT | ( PLUS | MINUS )? ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | ( PLUS | MINUS )? DOT ( DIGIT )+ ( EXPONENT )? | ( PLUS | MINUS )? ( DIGIT )+ EXPONENT );"; } } static final String DFA34_eotS = - "\2\uffff\1\42\3\36\3\uffff\1\53\1\54\2\uffff\1\56\10\uffff\1\36"+ - "\5\uffff\1\36\2\uffff\2\35\3\uffff\1\63\3\36\2\66\5\uffff\1\70\3"+ - "\35\1\uffff\1\72\1\73\1\uffff\1\66\1\uffff\1\35\2\uffff"; + "\2\uffff\1\42\3\36\3\uffff\1\53\1\54\1\uffff\1\55\1\57\4\uffff"+ + "\1\60\3\uffff\1\36\5\uffff\1\36\2\uffff\2\35\3\uffff\1\65\3\36\1"+ + "\70\1\uffff\1\70\6\uffff\1\72\3\35\1\uffff\1\74\1\75\1\uffff\1\70"+ + "\1\uffff\1\35\2\uffff"; static final String DFA34_eofS = - "\74\uffff"; + "\76\uffff"; static final String DFA34_minS = - "\1\11\1\uffff\1\41\3\60\3\uffff\2\56\2\uffff\1\56\10\uffff\1\60"+ - "\5\uffff\1\60\2\uffff\2\56\3\uffff\1\43\3\60\2\56\5\uffff\1\43\1"+ - "\56\1\53\1\56\1\uffff\2\43\1\uffff\1\56\1\uffff\1\60\2\uffff"; + "\1\11\1\uffff\1\41\3\52\3\uffff\2\56\1\uffff\1\52\1\56\4\uffff"+ + "\1\52\3\uffff\1\52\5\uffff\1\52\2\uffff\2\56\3\uffff\1\43\3\52\1"+ + "\56\1\uffff\1\56\6\uffff\1\43\1\56\1\53\1\56\1\uffff\2\43\1\uffff"+ + "\1\56\1\uffff\1\60\2\uffff"; static final String DFA34_maxS = - "\1\ufaff\1\uffff\1\176\3\ufaff\3\uffff\2\71\2\uffff\1\71\10\uffff"+ - "\1\ufaff\5\uffff\1\ufaff\2\uffff\2\145\3\uffff\4\ufaff\2\145\5\uffff"+ - "\1\ufaff\1\145\1\71\1\145\1\uffff\2\ufaff\1\uffff\1\145\1\uffff"+ - "\1\71\2\uffff"; + "\1\ufaff\1\uffff\1\176\3\ufaff\3\uffff\2\71\1\uffff\1\ufaff\1\71"+ + "\4\uffff\1\ufaff\3\uffff\1\ufaff\5\uffff\1\ufaff\2\uffff\2\145\3"+ + "\uffff\4\ufaff\1\145\1\uffff\1\145\6\uffff\1\ufaff\1\145\1\71\1"+ + "\145\1\uffff\2\ufaff\1\uffff\1\145\1\uffff\1\71\2\uffff"; static final String DFA34_acceptS = - "\1\uffff\1\1\4\uffff\1\6\1\7\1\10\2\uffff\1\13\1\14\1\uffff\1\17"+ - "\1\20\1\21\1\22\1\23\1\25\1\26\1\27\1\uffff\1\31\1\32\1\33\1\34"+ - "\1\35\1\uffff\1\37\1\36\2\uffff\1\42\1\24\1\2\6\uffff\1\41\1\11"+ - "\1\12\1\15\1\16\4\uffff\1\3\2\uffff\1\40\1\uffff\1\30\1\uffff\1"+ - "\4\1\5"; + "\1\uffff\1\1\4\uffff\1\6\1\7\1\10\2\uffff\1\13\2\uffff\1\17\1\20"+ + "\1\21\1\22\1\uffff\1\25\1\26\1\27\1\uffff\1\31\1\32\1\33\1\34\1"+ + "\35\1\uffff\1\37\1\36\2\uffff\1\42\1\24\1\2\5\uffff\1\41\1\uffff"+ + "\1\11\1\12\1\14\1\15\1\16\1\23\4\uffff\1\3\2\uffff\1\40\1\uffff"+ + "\1\30\1\uffff\1\4\1\5"; static final String DFA34_specialS = - "\74\uffff}>"; + "\76\uffff}>"; static final String[] DFA34_transitionS = { "\2\41\2\uffff\1\41\22\uffff\1\41\1\17\1\1\1\uffff\1\31\1\uffff"+ "\1\16\1\uffff\1\7\1\10\1\14\1\11\1\27\1\12\1\15\1\uffff\1\37"+ @@ -2764,101 +2786,119 @@ public class FTSLexer extends Lexer { "", "\1\43\1\uffff\2\43\1\uffff\26\43\1\uffff\1\43\1\uffff\35\43"+ "\1\uffff\1\43\1\uffff\1\43\1\uffff\32\43\2\uffff\2\43", - "\12\45\7\uffff\21\45\1\44\10\45\1\uffff\1\35\4\uffff\21\45"+ - "\1\44\10\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", - "\12\45\7\uffff\15\45\1\46\14\45\1\uffff\1\35\4\uffff\15\45"+ - "\1\46\14\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", - "\12\45\7\uffff\16\45\1\47\13\45\1\uffff\1\35\4\uffff\16\45"+ - "\1\47\13\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\21\45\1\44\10\45"+ + "\1\uffff\1\35\4\uffff\21\45\1\44\10\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\15\45\1\46\14\45"+ + "\1\uffff\1\35\4\uffff\15\45\1\46\14\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\16\45\1\47\13\45"+ + "\1\uffff\1\35\4\uffff\16\45\1\47\13\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", "", "", "", - "\1\52\1\uffff\1\50\11\51", - "\1\52\1\uffff\1\50\11\51", + "\1\51\1\uffff\1\50\11\52", + "\1\51\1\uffff\1\50\11\52", "", - "", - "\1\55\1\uffff\12\52", - "", - "", - "", - "", - "", - "", - "", - "", - "\12\45\7\uffff\16\45\1\57\13\45\1\uffff\1\35\4\uffff\16\45"+ - "\1\57\13\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", - "", - "", - "", - "", - "", - "\12\45\7\uffff\32\45\1\uffff\1\35\4\uffff\32\45\105\uffff"+ - "\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170"+ - "\uffff\u0080\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00"+ - "\uffff\u2bb0\35\u2150\uffff\u0200\35", - "", - "", - "\1\52\1\uffff\12\60\13\uffff\1\61\37\uffff\1\61", - "\1\52\1\uffff\12\62\13\uffff\1\61\37\uffff\1\61", - "", - "", - "", - "\2\36\13\uffff\12\45\7\uffff\32\45\1\uffff\1\35\2\uffff\1"+ - "\36\1\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08"+ - "\35\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ + "\1\35\5\uffff\12\35\5\uffff\1\35\1\uffff\32\35\1\uffff\1\35"+ + "\4\uffff\32\35\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35"+ + "\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ "\35", - "\12\45\7\uffff\32\45\1\uffff\1\35\4\uffff\32\45\105\uffff"+ - "\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170"+ - "\uffff\u0080\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00"+ - "\uffff\u2bb0\35\u2150\uffff\u0200\35", - "\12\45\7\uffff\3\45\1\64\26\45\1\uffff\1\35\4\uffff\3\45\1"+ - "\64\26\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", - "\12\45\7\uffff\23\45\1\65\6\45\1\uffff\1\35\4\uffff\23\45"+ - "\1\65\6\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35\u1040"+ - "\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e\35\u10d2"+ - "\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200\35", - "\1\52\1\uffff\12\52\13\uffff\1\52\37\uffff\1\52", - "\1\52\1\uffff\12\67\13\uffff\1\52\37\uffff\1\52", + "\1\56\1\uffff\12\51", "", "", "", "", - "", - "\2\36\13\uffff\12\45\7\uffff\32\45\1\uffff\1\35\2\uffff\1"+ - "\36\1\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08"+ - "\35\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ - "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ - "\35", - "\1\52\1\uffff\12\60\13\uffff\1\61\37\uffff\1\61", - "\1\52\1\uffff\1\52\2\uffff\12\71", - "\1\52\1\uffff\12\62\13\uffff\1\61\37\uffff\1\61", - "", - "\2\36\13\uffff\12\45\7\uffff\32\45\1\uffff\1\35\2\uffff\1"+ - "\36\1\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08"+ - "\35\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ - "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ - "\35", - "\2\36\13\uffff\12\45\7\uffff\32\45\1\uffff\1\35\2\uffff\1"+ - "\36\1\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08"+ - "\35\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ + "\1\35\5\uffff\12\35\5\uffff\1\35\1\uffff\32\35\1\uffff\1\35"+ + "\4\uffff\32\35\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35"+ + "\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ "\35", "", - "\1\52\1\uffff\12\67\13\uffff\1\52\37\uffff\1\52", "", - "\12\71", + "", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\16\45\1\61\13\45"+ + "\1\uffff\1\35\4\uffff\16\45\1\61\13\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "", + "", + "", + "", + "", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45\1\uffff\1\35"+ + "\4\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35"+ + "\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ + "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ + "\35", + "", + "", + "\1\51\1\uffff\12\62\13\uffff\1\63\37\uffff\1\63", + "\1\51\1\uffff\12\64\13\uffff\1\63\37\uffff\1\63", + "", + "", + "", + "\2\36\5\uffff\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45"+ + "\1\uffff\1\35\2\uffff\1\36\1\uffff\32\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45\1\uffff\1\35"+ + "\4\uffff\32\45\105\uffff\27\35\1\uffff\37\35\1\uffff\u1f08\35"+ + "\u1040\uffff\u0150\35\u0170\uffff\u0080\35\u0080\uffff\u092e"+ + "\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0\35\u2150\uffff\u0200"+ + "\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\3\45\1\66\26\45\1"+ + "\uffff\1\35\4\uffff\3\45\1\66\26\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\23\45\1\67\6\45\1"+ + "\uffff\1\35\4\uffff\23\45\1\67\6\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\51\1\uffff\12\51\13\uffff\1\51\37\uffff\1\51", + "", + "\1\51\1\uffff\12\71\13\uffff\1\51\37\uffff\1\51", + "", + "", + "", + "", + "", + "", + "\2\36\5\uffff\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45"+ + "\1\uffff\1\35\2\uffff\1\36\1\uffff\32\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\1\51\1\uffff\12\62\13\uffff\1\63\37\uffff\1\63", + "\1\51\1\uffff\1\51\2\uffff\12\73", + "\1\51\1\uffff\12\64\13\uffff\1\63\37\uffff\1\63", + "", + "\2\36\5\uffff\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45"+ + "\1\uffff\1\35\2\uffff\1\36\1\uffff\32\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "\2\36\5\uffff\1\35\5\uffff\12\45\5\uffff\1\35\1\uffff\32\45"+ + "\1\uffff\1\35\2\uffff\1\36\1\uffff\32\45\105\uffff\27\35\1\uffff"+ + "\37\35\1\uffff\u1f08\35\u1040\uffff\u0150\35\u0170\uffff\u0080"+ + "\35\u0080\uffff\u092e\35\u10d2\uffff\u5200\35\u0c00\uffff\u2bb0"+ + "\35\u2150\uffff\u0200\35", + "", + "\1\51\1\uffff\12\71\13\uffff\1\51\37\uffff\1\51", + "", + "\12\73", "", "" }; diff --git a/source/java/org/alfresco/repo/search/impl/parsers/FTSParser.java b/source/java/org/alfresco/repo/search/impl/parsers/FTSParser.java index d3d5131ddf..94310988d8 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/FTSParser.java +++ b/source/java/org/alfresco/repo/search/impl/parsers/FTSParser.java @@ -1,4 +1,4 @@ -// $ANTLR !Unknown version! W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g 2009-04-14 14:56:06 +// $ANTLR !Unknown version! W:\\alfresco\\HEAD\\root\\projects\\Repository\\source\\java\\org\\alfresco\\repo\\search\\impl\\parsers\\FTS.g 2009-04-14 15:35:35 package org.alfresco.repo.search.impl.parsers; import org.antlr.runtime.*; @@ -1585,7 +1585,7 @@ public class FTSParser extends Parser { // AST REWRITE - // elements: columnReference, FTSPHRASE + // elements: FTSPHRASE, columnReference // token labels: // rule labels: retval // token list labels: @@ -1774,7 +1774,7 @@ public class FTSParser extends Parser { // AST REWRITE - // elements: columnReference, ftsFieldGroupRange + // elements: ftsFieldGroupRange, columnReference // token labels: // rule labels: retval // token list labels: @@ -3826,7 +3826,7 @@ public class FTSParser extends Parser { // AST REWRITE - // elements: prefix, identifier, uri + // elements: identifier, prefix, uri // token labels: // rule labels: retval // token list labels: diff --git a/source/java/org/alfresco/repo/search/impl/parsers/FTSQueryParser.java b/source/java/org/alfresco/repo/search/impl/parsers/FTSQueryParser.java index e0402be1f3..bf27f27fd5 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/FTSQueryParser.java +++ b/source/java/org/alfresco/repo/search/impl/parsers/FTSQueryParser.java @@ -29,12 +29,11 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.alfresco.cmis.CMISDictionaryService; -import org.alfresco.cmis.CMISPropertyDefinition; import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.Column; import org.alfresco.repo.search.impl.querymodel.Constraint; import org.alfresco.repo.search.impl.querymodel.Function; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.LiteralArgument; import org.alfresco.repo.search.impl.querymodel.PropertyArgument; import org.alfresco.repo.search.impl.querymodel.QueryModelFactory; @@ -42,6 +41,7 @@ import org.alfresco.repo.search.impl.querymodel.Selector; import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSExactTerm; import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSPhrase; import org.alfresco.repo.search.impl.querymodel.impl.functions.FTSTerm; +import org.alfresco.repo.search.impl.querymodel.impl.functions.PropertyAccessor; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CharStream; @@ -51,16 +51,9 @@ import org.antlr.runtime.tree.CommonTree; public class FTSQueryParser { - private CMISDictionaryService cmisDictionaryService; - - public FTSQueryParser(CMISDictionaryService cmisDictionaryService) + public Constraint buildFTS(String ftsExpression, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Selector selector, ArrayList columns) { - this.cmisDictionaryService = cmisDictionaryService; - } - - public Constraint buildFTS(String ftsExpression, QueryModelFactory factory, Selector selector, ArrayList columns) - { - // TODO: transform '' to ' to reverse encoding + // TODO: Decode sql escape for '' should do in CMIS layer FTSParser parser = null; try { @@ -71,11 +64,11 @@ public class FTSQueryParser CommonTree ftsNode = (CommonTree) parser.ftsQuery().getTree(); if (ftsNode.getType() == FTSParser.CONJUNCTION) { - return buildFTSConjunction(ftsNode, factory, selector, columns); + return buildFTSConjunction(ftsNode, factory, functionEvaluationContext, selector, columns); } else { - return buildFTSDisjunction(ftsNode, factory, selector, columns); + return buildFTSDisjunction(ftsNode, factory, functionEvaluationContext, selector, columns); } } catch (RecognitionException e) @@ -92,7 +85,8 @@ public class FTSQueryParser } - private Constraint buildFTSDisjunction(CommonTree orNode, QueryModelFactory factory, Selector selector, ArrayList columns) + private Constraint buildFTSDisjunction(CommonTree orNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Selector selector, + ArrayList columns) { if (orNode.getType() != FTSParser.DISJUNCTION) { @@ -106,18 +100,18 @@ public class FTSQueryParser switch (subNode.getType()) { case FTSParser.DISJUNCTION: - constraint = buildFTSDisjunction(subNode, factory, selector, columns); + constraint = buildFTSDisjunction(subNode, factory, functionEvaluationContext, selector, columns); break; case FTSParser.CONJUNCTION: - constraint = buildFTSConjunction(subNode, factory, selector, columns); + constraint = buildFTSConjunction(subNode, factory, functionEvaluationContext, selector, columns); break; case FTSParser.NEGATION: - constraint = buildFTSTest(subNode, factory, selector, columns); + constraint = buildFTSTest(subNode, factory, functionEvaluationContext, selector, columns); constraint = factory.createNegation(constraint); break; case FTSParser.DEFAULT: CommonTree testNode = (CommonTree) subNode.getChild(0); - constraint = buildFTSTest(testNode, factory, selector, columns); + constraint = buildFTSTest(testNode, factory, functionEvaluationContext, selector, columns); break; default: throw new FTSQueryException("Unsupported FTS option " + subNode.getText()); @@ -134,7 +128,8 @@ public class FTSQueryParser } } - private Constraint buildFTSConjunction(CommonTree andNode, QueryModelFactory factory, Selector selector, ArrayList columns) + private Constraint buildFTSConjunction(CommonTree andNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Selector selector, + ArrayList columns) { if (andNode.getType() != FTSParser.CONJUNCTION) { @@ -148,18 +143,18 @@ public class FTSQueryParser switch (subNode.getType()) { case FTSParser.DISJUNCTION: - constraint = buildFTSDisjunction(subNode, factory, selector, columns); + constraint = buildFTSDisjunction(subNode, factory, functionEvaluationContext, selector, columns); break; case FTSParser.CONJUNCTION: - constraint = buildFTSConjunction(subNode, factory, selector, columns); + constraint = buildFTSConjunction(subNode, factory, functionEvaluationContext, selector, columns); break; case FTSParser.NEGATION: - constraint = buildFTSTest(subNode, factory, selector, columns); + constraint = buildFTSTest(subNode, factory, functionEvaluationContext, selector, columns); constraint = factory.createNegation(constraint); break; case FTSParser.DEFAULT: CommonTree testNode = (CommonTree) subNode.getChild(0); - constraint = buildFTSTest(testNode, factory, selector, columns); + constraint = buildFTSTest(testNode, factory, functionEvaluationContext, selector, columns); break; default: throw new FTSQueryException("Unsupported FTS option " + subNode.getText()); @@ -176,23 +171,25 @@ public class FTSQueryParser } } - private Constraint buildFTSNegation(CommonTree notNode, QueryModelFactory factory, Selector selector, ArrayList columns) + private Constraint buildFTSNegation(CommonTree notNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Selector selector, + ArrayList columns) { switch (notNode.getType()) { case FTSParser.NEGATION: - Constraint constraint = buildFTSTest(notNode, factory, selector, columns); + Constraint constraint = buildFTSTest(notNode, factory, functionEvaluationContext, selector, columns); return factory.createNegation(constraint); case FTSParser.DEFAULT: CommonTree testNode = (CommonTree) notNode.getChild(0); - return buildFTSTest(testNode, factory, selector, columns); + return buildFTSTest(testNode, factory, functionEvaluationContext, selector, columns); default: throw new FTSQueryException("Unsupported FTS option " + notNode.getText()); } } - private Constraint buildFTSTest(CommonTree testNode, QueryModelFactory factory, Selector selector, ArrayList columns) + private Constraint buildFTSTest(CommonTree testNode, QueryModelFactory factory, FunctionEvaluationContext functionEvaluationContext, Selector selector, + ArrayList columns) { String functionName; Function function; @@ -202,9 +199,9 @@ public class FTSQueryParser switch (testNode.getType()) { case FTSParser.DISJUNCTION: - return buildFTSDisjunction(testNode, factory, selector, columns); + return buildFTSDisjunction(testNode, factory, functionEvaluationContext, selector, columns); case FTSParser.CONJUNCTION: - return buildFTSConjunction(testNode, factory, selector, columns); + return buildFTSConjunction(testNode, factory, functionEvaluationContext, selector, columns); case FTSParser.TERM: functionName = FTSTerm.NAME; function = factory.getFunction(functionName); @@ -213,7 +210,7 @@ public class FTSQueryParser functionArguments.put(larg.getName(), larg); if (testNode.getChildCount() > 1) { - parg = buildColumnReference(FTSTerm.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, selector); + parg = buildColumnReference(FTSTerm.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, functionEvaluationContext, selector, columns); functionArguments.put(parg.getName(), parg); } return factory.createFunctionalConstraint(function, functionArguments); @@ -225,7 +222,7 @@ public class FTSQueryParser functionArguments.put(larg.getName(), larg); if (testNode.getChildCount() > 1) { - parg = buildColumnReference(FTSExactTerm.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, selector); + parg = buildColumnReference(FTSExactTerm.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, functionEvaluationContext, selector, columns); functionArguments.put(parg.getName(), parg); } return factory.createFunctionalConstraint(function, functionArguments); @@ -238,7 +235,7 @@ public class FTSQueryParser functionArguments.put(larg.getName(), larg); if (testNode.getChildCount() > 1) { - parg = buildColumnReference(FTSPhrase.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, selector); + parg = buildColumnReference(FTSPhrase.ARG_PROPERTY, (CommonTree) testNode.getChild(1), factory, functionEvaluationContext, selector, columns); functionArguments.put(parg.getName(), parg); } return factory.createFunctionalConstraint(function, functionArguments); @@ -253,21 +250,36 @@ public class FTSQueryParser } } - private Constraint buildFTSDefault(CommonTree testNode, QueryModelFactory factory, Map selectors, ArrayList columns) - { - // TODO Auto-generated method stub - return null; - } - - public PropertyArgument buildColumnReference(String argumentName, CommonTree columnReferenceNode, QueryModelFactory factory, Selector selector) + public PropertyArgument buildColumnReference(String argumentName, CommonTree columnReferenceNode, QueryModelFactory factory, + FunctionEvaluationContext functionEvaluationContext, Selector selector, ArrayList columns) { if (columnReferenceNode.getType() != FTSParser.COLUMN_REF) { throw new FTSQueryException("Not column ref ..." + columnReferenceNode.getText()); } - String cmisPropertyName = columnReferenceNode.getChild(0).getText(); - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(cmisPropertyName, null); - return factory.createPropertyArgument(argumentName, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef.getPropertyId().getQName()); + String fieldName = columnReferenceNode.getChild(0).getText(); + if (columns != null) + { + for (Column column : columns) + { + if (column.getAlias().equals(fieldName)) + { + // TODO: Check selector matches ... + PropertyArgument arg = (PropertyArgument)column.getFunctionArguments().get(PropertyAccessor.ARG_PROPERTY); + fieldName = arg.getPropertyName(); + break; + } + } + } + + String alias = ""; + if(selector != null) + { + alias = selector.getAlias(); + } + + return factory.createPropertyArgument(argumentName, functionEvaluationContext.isQueryable(fieldName), functionEvaluationContext.isOrderable(fieldName), + alias, fieldName); } } diff --git a/source/java/org/alfresco/repo/search/impl/parsers/fts_test.gunit b/source/java/org/alfresco/repo/search/impl/parsers/fts_test.gunit index 7a4c383c31..8a15f35727 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/fts_test.gunit +++ b/source/java/org/alfresco/repo/search/impl/parsers/fts_test.gunit @@ -86,6 +86,7 @@ ftsTest: "1.5" -> "(TERM 1.5)" "cm:name:1.5" -> "(TERM 1.5 (COLUMN_REF name (PREFIX cm)))" "cm:name:12" -> "(TERM 12 (COLUMN_REF name (PREFIX cm)))" +"zebr*" -> "OK" ftsTerm: "name:woof" -> "woof (COLUMN_REF name)" diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java b/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java index cb1d315167..4258cba7ef 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java @@ -44,29 +44,35 @@ public interface FunctionEvaluationContext public Map getScores(); - public Serializable getProperty(NodeRef nodeRef, QName propertyQName); + public Serializable getProperty(NodeRef nodeRef, String propertyName); public NodeService getNodeService(); public Float getScore(); - public Query buildLuceneEquality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneExists(LuceneQueryParser lqp, QName propertyQName, Boolean not) throws ParseException; + public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException; - public Query buildLuceneGreaterThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneLessThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneLike(LuceneQueryParser lqp, QName propertyQName, Serializable value, Boolean not) throws ParseException; + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException; - public Query buildLuceneInequality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; - public Query buildLuceneIn(LuceneQueryParser lqp, QName propertyQName, Collection values, Boolean not, PredicateMode mode) throws ParseException; + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException; - public String getLuceneSortField(QName propertyQName); + public String getLuceneSortField(String propertyName); + + public boolean isObjectId(String propertyName); + + public boolean isQueryable(String fieldName); + + public boolean isOrderable(String fieldName); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/PropertyArgument.java b/source/java/org/alfresco/repo/search/impl/querymodel/PropertyArgument.java index f15bdfe80f..5e7feceb5b 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/PropertyArgument.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/PropertyArgument.java @@ -33,5 +33,5 @@ public interface PropertyArgument extends DynamicArgument { public String getSelector(); - public QName getPropertyName(); + public String getPropertyName(); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/QueryModelFactory.java b/source/java/org/alfresco/repo/search/impl/querymodel/QueryModelFactory.java index 2058a54f75..ee9e35a13a 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/QueryModelFactory.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/QueryModelFactory.java @@ -58,7 +58,7 @@ public interface QueryModelFactory public ParameterArgument createParameterArgument(String name, String parameterName); - public PropertyArgument createPropertyArgument(String name, boolean queryable, boolean orderable, String selectorAlias, QName propertyName); + public PropertyArgument createPropertyArgument(String name, boolean queryable, boolean orderable, String selectorAlias, String propertyName); public SelectorArgument createSelectorArgument(String name, String selectorAlias); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/Source.java b/source/java/org/alfresco/repo/search/impl/querymodel/Source.java index 08d1c67d8e..fceb985f6d 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/Source.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/Source.java @@ -38,5 +38,5 @@ public interface Source public Selector getSelector(String name); - public List> getSelectorGroups(); + public List> getSelectorGroups(FunctionEvaluationContext functionContext); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseJoin.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseJoin.java index 5d835956bf..b0363edf57 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseJoin.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseJoin.java @@ -34,6 +34,7 @@ import org.alfresco.cmis.mapping.CMISMapping; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.Constraint; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.FunctionalConstraint; import org.alfresco.repo.search.impl.querymodel.Join; import org.alfresco.repo.search.impl.querymodel.JoinType; @@ -156,12 +157,12 @@ public class BaseJoin implements Join return answer.get(name); } - public List> getSelectorGroups() + public List> getSelectorGroups(FunctionEvaluationContext functionContext) { List> answer = new ArrayList>(); - List> left = getLeft().getSelectorGroups(); - List> right = getRight().getSelectorGroups(); + List> left = getLeft().getSelectorGroups(functionContext); + List> right = getRight().getSelectorGroups(functionContext); FunctionalConstraint joinCondition = (FunctionalConstraint) getJoinCondition(); if (!joinCondition.getFunction().getName().equals(Equals.NAME)) @@ -178,8 +179,8 @@ public class BaseJoin implements Join if (lhs instanceof PropertyArgument) { PropertyArgument propertyArgument = (PropertyArgument) lhs; - QName qname = propertyArgument.getPropertyName(); - if (isObjectId(qname)) + String name = propertyArgument.getPropertyName(); + if (functionContext.isObjectId(name)) { lhsSelector = propertyArgument.getSelector(); } @@ -188,8 +189,8 @@ public class BaseJoin implements Join if (rhs instanceof PropertyArgument) { PropertyArgument propertyArgument = (PropertyArgument) rhs; - QName qname = propertyArgument.getPropertyName(); - if (isObjectId(qname)) + String name = propertyArgument.getPropertyName(); + if (functionContext.isObjectId(name)) { rhsSelector = propertyArgument.getSelector(); } @@ -248,9 +249,4 @@ public class BaseJoin implements Join return answer; } - - private boolean isObjectId(QName qname) - { - return ContentModel.PROP_NODE_DBID.equals(qname) || CMISMapping.PROP_OBJECT_ID_QNAME.equals(qname); - } } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BasePropertyArgument.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BasePropertyArgument.java index 4ad119ad7a..584b31e452 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BasePropertyArgument.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BasePropertyArgument.java @@ -36,14 +36,14 @@ import org.alfresco.service.namespace.QName; */ public class BasePropertyArgument extends BaseDynamicArgument implements PropertyArgument { - private QName propertyName; + private String propertyName; private String selector; /** * @param name */ - public BasePropertyArgument(String name, boolean queryable, boolean orderable, String selector, QName propertyName) + public BasePropertyArgument(String name, boolean queryable, boolean orderable, String selector, String propertyName) { super(name, queryable, orderable); this.selector = selector; @@ -66,7 +66,7 @@ public class BasePropertyArgument extends BaseDynamicArgument implements Propert * * @see org.alfresco.repo.search.impl.querymodel.PropertyArgument#getPropertyName() */ - public QName getPropertyName() + public String getPropertyName() { return propertyName; } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseSelector.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseSelector.java index d5a2cb804c..c0117cfe3c 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseSelector.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseSelector.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.Selector; import org.alfresco.service.namespace.QName; @@ -92,10 +93,9 @@ public class BaseSelector implements Selector return answer; } - public Selector getSelector(String name) { - if(getAlias().equals(name)) + if (getAlias().equals(name)) { return this; } @@ -105,7 +105,7 @@ public class BaseSelector implements Selector } } - public List> getSelectorGroups() + public List> getSelectorGroups(FunctionEvaluationContext functionContext) { HashSet set = new HashSet(); set.add(getAlias()); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LucenePropertyArgument.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LucenePropertyArgument.java index d467a7e237..c1b11deb37 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LucenePropertyArgument.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LucenePropertyArgument.java @@ -38,7 +38,7 @@ public class LucenePropertyArgument extends BasePropertyArgument * @param name * @param propertyName */ - public LucenePropertyArgument(String name, boolean queryable, boolean orderable, String selector, QName propertyName) + public LucenePropertyArgument(String name, boolean queryable, boolean orderable, String selector, String propertyName) { super(name, queryable, orderable, selector, propertyName); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQuery.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQuery.java index 24156a500a..c8600c0b4e 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQuery.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQuery.java @@ -154,9 +154,9 @@ public class LuceneQuery extends BaseQuery implements LuceneQueryBuilder throw new IllegalStateException(); } - QName propertyQName = property.getPropertyName(); + String propertyName = property.getPropertyName(); - String luceneField = functionContext.getLuceneSortField(propertyQName); + String luceneField = functionContext.getLuceneSortField(propertyName); if (luceneField != null) { diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryEngine.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryEngine.java index ee8d51bb92..eaf75ec95f 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryEngine.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryEngine.java @@ -122,7 +122,7 @@ public class LuceneQueryEngine implements QueryEngine public QueryEngineResults executeQuery(Query query, QueryOptions options, FunctionEvaluationContext functionContext) { - List> selectorGroups = query.getSource().getSelectorGroups(); + List> selectorGroups = query.getSource().getSelectorGroups(functionContext); if(selectorGroups.size() == 0) { diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryModelFactory.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryModelFactory.java index af6947587b..607b8adffe 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryModelFactory.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryModelFactory.java @@ -223,7 +223,7 @@ public class LuceneQueryModelFactory implements QueryModelFactory * @see org.alfresco.repo.search.impl.querymodel.QueryModelFactory#createPropertyArgument(java.lang.String, * org.alfresco.service.namespace.QName) */ - public PropertyArgument createPropertyArgument(String name, boolean queryable, boolean orderable, String selector, QName propertyName) + public PropertyArgument createPropertyArgument(String name, boolean queryable, boolean orderable, String selector, String propertyName) { return new LucenePropertyArgument(name, queryable, orderable, selector, propertyName); } diff --git a/source/java/org/alfresco/service/cmr/search/SearchService.java b/source/java/org/alfresco/service/cmr/search/SearchService.java index 55085dd455..fd934941c2 100644 --- a/source/java/org/alfresco/service/cmr/search/SearchService.java +++ b/source/java/org/alfresco/service/cmr/search/SearchService.java @@ -55,6 +55,12 @@ public interface SearchService public static final String LANGUAGE_XPATH = "xpath"; public static final String LANGUAGE_JCR_XPATH = "jcr-xpath"; + + public static final String LANGUAGE_FTS_ALFRESCO = "fts-alfresco"; + + //public static final String LANGUAGE_SQL_CMIS_STRICT = "sql-cmis-strict"; + + //public static final String LANGUAGE_SQL_ALFTRESCO = "sql-alfresco"; /** * Search against a store.