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.