diff --git a/source/java/org/alfresco/cmis/dictionary/CMISDictionaryService.java b/source/java/org/alfresco/cmis/dictionary/CMISDictionaryService.java index cca9d795ee..b8bc67ff3b 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISDictionaryService.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISDictionaryService.java @@ -201,13 +201,10 @@ public class CMISDictionaryService Collection types = new HashSet(alfrescoTypeQNames.size()); for (QName typeQName : alfrescoTypeQNames) { - if (cmisMapping.isValidCmisDocument(typeQName)) + CMISTypeId subTypeId = cmisMapping.getCmisTypeId(typeQName); + if (typeId != null) { - types.add(cmisMapping.getCmisTypeId(CMISScope.DOCUMENT, typeQName)); - } - else if (cmisMapping.isValidCmisFolder(typeQName)) - { - types.add(cmisMapping.getCmisTypeId(CMISScope.FOLDER, typeQName)); + types.add(subTypeId); } } return types; diff --git a/source/java/org/alfresco/cmis/dictionary/CMISMapping.java b/source/java/org/alfresco/cmis/dictionary/CMISMapping.java index caedc88c90..9601ec02b9 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISMapping.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISMapping.java @@ -139,7 +139,7 @@ public class CMISMapping public static String PROP_CONTENT_STREAM_LENGTH = "CONTENT_STREAM_LENGTH"; - public static String PROP_CONTENT_STREAM_MIMETYPE = "CONTENT_STREAM_MIMETYPE"; + public static String PROP_CONTENT_STREAM_MIME_TYPE = "CONTENT_STREAM_MIME_TYPE"; public static String PROP_CONTENT_STREAM_FILENAME = "CONTENT_STREAM_FILENAME"; @@ -664,6 +664,10 @@ public class CMISMapping { return ContentModel.TYPE_FOLDER; } + else if (tableName.equals(RELATIONSHIP_TYPE_ID.getTypeId())) + { + return null; + } // Find prefix and property name - in upper case diff --git a/source/java/org/alfresco/cmis/dictionary/CMISPropertyDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISPropertyDefinition.java index 5346d97705..d1e46b6df3 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISPropertyDefinition.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISPropertyDefinition.java @@ -98,7 +98,7 @@ public class CMISPropertyDefinition implements Serializable // Properties of associations - all the same propertyName = cmisMapping.getCmisPropertyName(propertyQName); propertyId = cmisMapping.getCmisPropertyId(propertyQName); - displayName = propDef.getTitle(); + displayName = (propDef.getTitle() != null) ? propDef.getTitle() : propertyName; description = propDef.getDescription(); isInherited = false; propertyType = cmisMapping.getPropertyType(propertyQName); @@ -114,7 +114,7 @@ public class CMISPropertyDefinition implements Serializable propertyName = cmisMapping.getCmisPropertyName(propertyQName); propertyId = cmisMapping.getCmisPropertyId(propertyQName); - displayName = propDef.getTitle(); + displayName = (propDef.getTitle() != null) ? propDef.getTitle() : propertyName; description = propDef.getDescription(); if(propDef.getContainerClass().isAspect()) { diff --git a/source/java/org/alfresco/cmis/dictionary/CMISTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISTypeDefinition.java index 233bb4565f..70301d9da1 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISTypeDefinition.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISTypeDefinition.java @@ -103,7 +103,7 @@ public class CMISTypeDefinition implements Serializable { objectTypeId = typeId; objectTypeQueryName = cmisMapping.getQueryName(typeId.getQName()); - displayName = associationDefinition.getTitle(); + displayName = (associationDefinition.getTitle() != null) ? associationDefinition.getTitle() : typeId.getTypeId(); parentTypeId = CMISMapping.RELATIONSHIP_TYPE_ID; rootTypeQueryName = cmisMapping.getQueryName(CMISMapping.RELATIONSHIP_QNAME); description = associationDefinition.getDescription(); @@ -141,7 +141,7 @@ public class CMISTypeDefinition implements Serializable TypeDefinition typeDefinition = dictionaryService.getType(typeId.getQName()); objectTypeId = typeId; objectTypeQueryName = cmisMapping.getQueryName(typeId.getQName()); - displayName = typeDefinition.getTitle(); + displayName = (typeDefinition.getTitle() != null) ? typeDefinition.getTitle() : typeId.getTypeId(); parentTypeId = null; rootTypeQueryName = cmisMapping.getQueryName(CMISMapping.RELATIONSHIP_QNAME); description = typeDefinition.getDescription(); @@ -163,7 +163,7 @@ public class CMISTypeDefinition implements Serializable objectTypeQueryName = cmisMapping.getQueryName(typeId.getQName()); - displayName = typeDefinition.getTitle(); + displayName = (typeDefinition.getTitle() != null) ? typeDefinition.getTitle() : typeId.getTypeId(); QName parentTypeQName = cmisMapping.getCmisType(typeDefinition.getParentName()); if (parentTypeQName == null) diff --git a/source/java/org/alfresco/cmis/property/AbstractGenericPropertyAccessor.java b/source/java/org/alfresco/cmis/property/AbstractGenericPropertyAccessor.java index 6ce39988a0..d27b23d524 100644 --- a/source/java/org/alfresco/cmis/property/AbstractGenericPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/AbstractGenericPropertyAccessor.java @@ -24,6 +24,7 @@ */ package org.alfresco.cmis.property; + /** * Base class for generic property accessors * @@ -33,5 +34,5 @@ package org.alfresco.cmis.property; public abstract class AbstractGenericPropertyAccessor extends AbstractPropertyAccessor implements GenericPropertyAccessor { - + } diff --git a/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java b/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java index 86e7f240eb..ca7bf58d4b 100644 --- a/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java +++ b/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java @@ -25,6 +25,7 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -36,6 +37,7 @@ import org.alfresco.cmis.dictionary.ContentStreamAllowed; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -404,19 +406,20 @@ public class CMISPropertyServiceImpl implements CMISPropertyService, Initializin * @param lqp * @param propertyName * @param value + * @param mode * @return * @throws ParseException */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); if (accessor != null) { - return accessor.buildLuceneEquality(lqp, propertyName, value); + return accessor.buildLuceneEquality(lqp, propertyName, value, mode); } else { - return genericPropertyAccessor.buildLuceneEquality(lqp, propertyName, value); + return genericPropertyAccessor.buildLuceneEquality(lqp, propertyName, value, mode); } } @@ -439,4 +442,169 @@ public class CMISPropertyServiceImpl implements CMISPropertyService, Initializin } } + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneGreaterThan(lqp, propertyName, value, mode); + } + else + { + return genericPropertyAccessor.buildLuceneGreaterThan(lqp, propertyName, value, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneGreaterThanOrEquals(lqp, propertyName, value, mode); + } + else + { + return genericPropertyAccessor.buildLuceneGreaterThanOrEquals(lqp, propertyName, value, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param values + * @param not + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneIn(lqp, propertyName, values, not, mode); + } + else + { + return genericPropertyAccessor.buildLuceneIn(lqp, propertyName, values, not, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneInequality(lqp, propertyName, value, mode); + } + else + { + return genericPropertyAccessor.buildLuceneInequality(lqp, propertyName, value, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneLessThan(lqp, propertyName, value, mode); + } + else + { + return genericPropertyAccessor.buildLuceneLessThan(lqp, propertyName, value, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + * @throws ParseException + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneLessThanOrEquals(lqp, propertyName, value, mode); + } + else + { + return genericPropertyAccessor.buildLuceneLessThanOrEquals(lqp, propertyName, value, mode); + } + } + + /** + * @param lqp + * @param propertyName + * @param value + * @param not + * @return + * @throws ParseException + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.buildLuceneLike(lqp, propertyName, value, not); + } + else + { + return genericPropertyAccessor.buildLuceneLike(lqp, propertyName, value, not); + } + } + + /** + * @param propertyName + * @return + */ + public String getLuceneSortField(String propertyName) + { + NamedPropertyAccessor accessor = namedPropertyAccessors.get(propertyName); + if (accessor != null) + { + return accessor.getLuceneSortField(propertyName); + } + else + { + return genericPropertyAccessor.getLuceneSortField(propertyName); + } + } + } diff --git a/source/java/org/alfresco/cmis/property/CMISPropertyServiceTest.java b/source/java/org/alfresco/cmis/property/CMISPropertyServiceTest.java index 08984ef708..8bcf096641 100644 --- a/source/java/org/alfresco/cmis/property/CMISPropertyServiceTest.java +++ b/source/java/org/alfresco/cmis/property/CMISPropertyServiceTest.java @@ -70,7 +70,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertNull(properties.get(CMISMapping.PROP_CHECKIN_COMMENT)); assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED)); assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH)); - assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE)); + assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE)); assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME)); assertNull(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI)); @@ -107,7 +107,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -144,7 +144,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -165,7 +165,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest properties = cmisPropertyService.getProperties(content); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), size); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "text/plain"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "text/plain"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); } @@ -198,7 +198,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -245,7 +245,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -282,7 +282,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -328,7 +328,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent (Working Copy)"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -361,7 +361,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -407,7 +407,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent (Working Copy)"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -440,7 +440,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -477,7 +477,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -510,7 +510,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -556,7 +556,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent (Working Copy)"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -589,7 +589,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -635,7 +635,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent (Working Copy)"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -671,7 +671,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), "Meep"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -717,7 +717,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), null); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent (Working Copy)"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -753,7 +753,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertEquals(properties.get(CMISMapping.PROP_CHECKIN_COMMENT), "Woof"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_ALLOWED), ContentStreamAllowed.ALLOWED.toString()); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_LENGTH), 0L); - assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIMETYPE), "application/octet-stream"); + assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE), "application/octet-stream"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_FILENAME), "BaseContent"); assertEquals(properties.get(CMISMapping.PROP_CONTENT_STREAM_URI), null); @@ -787,7 +787,7 @@ public class CMISPropertyServiceTest extends BaseCMISTest assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CHECKIN_COMMENT)); assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_ALLOWED)); assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_LENGTH)); - assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_MIMETYPE)); + assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE)); assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_FILENAME)); assertNull(cmisPropertyService.getProperty(folder, CMISMapping.PROP_CONTENT_STREAM_URI)); diff --git a/source/java/org/alfresco/cmis/property/CheckinCommentPropertyAccessor.java b/source/java/org/alfresco/cmis/property/CheckinCommentPropertyAccessor.java index 2ce131dd14..e3d6b4fe95 100644 --- a/source/java/org/alfresco/cmis/property/CheckinCommentPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/CheckinCommentPropertyAccessor.java @@ -25,19 +25,20 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.version.Version; import org.apache.lucene.search.Query; /** - * Accesor for the CMIS Checkin Comment + * Accessor for the CMIS Checkin Comment * * @author andyh - * */ public class CheckinCommentPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -45,7 +46,7 @@ public class CheckinCommentPropertyAccessor extends AbstractNamedPropertyAccesso public Serializable getProperty(NodeRef nodeRef) { Version version = getServiceRegistry().getVersionService().getCurrentVersion(nodeRef); - if(version != null) + if (version != null) { return version.getDescription(); } @@ -60,27 +61,119 @@ public class CheckinCommentPropertyAccessor extends AbstractNamedPropertyAccesso { return CMISMapping.PROP_CHECKIN_COMMENT; } - + @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) { return null; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) { return null; } - + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) + { + return null; + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/ContentStreamLengthPropertyAccessor.java b/source/java/org/alfresco/cmis/property/ContentStreamLengthPropertyAccessor.java index e03e6af5a3..d75c4c855a 100644 --- a/source/java/org/alfresco/cmis/property/ContentStreamLengthPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/ContentStreamLengthPropertyAccessor.java @@ -25,22 +25,29 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; + /** * Accessor for CMIS content stream length property * * @author andyh - * */ public class ContentStreamLengthPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -65,45 +72,203 @@ public class ContentStreamLengthPropertyAccessor extends AbstractNamedPropertyAc { return CMISMapping.PROP_CONTENT_STREAM_LENGTH; } - + @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + private String getLuceneFieldName() { - StringBuilder field = new StringBuilder(); + StringBuilder field = new StringBuilder(128); field.append("@"); field.append(ContentModel.PROP_CONTENT); field.append(".size"); - - // Check type conversion - - Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.LONG), value); - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery(field.toString(), asString); + return field.toString(); } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + private String getValueAsString(Serializable value) + { + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.LONG), value); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + return asString; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getFieldQuery(getLuceneFieldName(), getValueAsString(value)); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { - if(not) - { - return lqp.getFieldQuery("ISNULL", ContentModel.PROP_CONTENT.toString()); - } - else - { - return lqp.getFieldQuery("ISNOTNULL", ContentModel.PROP_CONTENT.toString()); - } - - + if (not) + { + return lqp.getFieldQuery("ISNULL", ContentModel.PROP_CONTENT.toString()); + } + else + { + return lqp.getFieldQuery("ISNOTNULL", ContentModel.PROP_CONTENT.toString()); + } + + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), getValueAsString(value), "MAX", false, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), getValueAsString(value), "MAX", true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.LONG), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getDoesNotMatchFieldQuery(getLuceneFieldName(), getValueAsString(value)); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), "MIN", getValueAsString(value), true, false); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), "MIN", getValueAsString(value), true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(getLuceneFieldName(), getValueAsString(value)), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(getLuceneFieldName(), getValueAsString(value)); + } + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); } } diff --git a/source/java/org/alfresco/cmis/property/ContentStreamMimetypePropertyAccessor.java b/source/java/org/alfresco/cmis/property/ContentStreamMimetypePropertyAccessor.java index d0b0e3182e..cc03b2af5e 100644 --- a/source/java/org/alfresco/cmis/property/ContentStreamMimetypePropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/ContentStreamMimetypePropertyAccessor.java @@ -25,23 +25,29 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; /** * Accessor for CMIS content stream mimetype property * * @author andyh - * */ public class ContentStreamMimetypePropertyAccessor extends AbstractNamedPropertyAccessor { @@ -64,45 +70,205 @@ public class ContentStreamMimetypePropertyAccessor extends AbstractNamedProperty @Override public String getPropertyName() { - return CMISMapping.PROP_CONTENT_STREAM_MIMETYPE; + return CMISMapping.PROP_CONTENT_STREAM_MIME_TYPE; } - + @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + private String getLuceneFieldName() { - StringBuilder field = new StringBuilder(); + StringBuilder field = new StringBuilder(128); field.append("@"); field.append(ContentModel.PROP_CONTENT); field.append(".mimetype"); - - // Check type conversion - - Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.TEXT), value); - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery(field.toString(), asString); + return field.toString(); } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + + private String getValueAsString(Serializable value) + { + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.TEXT), value); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + return asString; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getFieldQuery(getLuceneFieldName(), getValueAsString(value)); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { - if(not) - { - return lqp.getFieldQuery("ISNULL", ContentModel.PROP_CONTENT.toString()); - } - else - { - return lqp.getFieldQuery("ISNOTNULL", ContentModel.PROP_CONTENT.toString()); - } + if (not) + { + return lqp.getFieldQuery("ISNULL", ContentModel.PROP_CONTENT.toString()); + } + else + { + return lqp.getFieldQuery("ISNOTNULL", ContentModel.PROP_CONTENT.toString()); + } + + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), getValueAsString(value), "\uFFFF", false, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), getValueAsString(value), "\uFFFF", true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.TEXT), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getDoesNotMatchFieldQuery(getLuceneFieldName(), getValueAsString(value)); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), "\u0000", getValueAsString(value), true, false); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return lqp.getRangeQuery(getLuceneFieldName(), "\u0000", getValueAsString(value), true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(getLuceneFieldName(), getValueAsString(value)), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(getLuceneFieldName(), getValueAsString(value)); + } + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); } } diff --git a/source/java/org/alfresco/cmis/property/FixedValuePropertyAccessor.java b/source/java/org/alfresco/cmis/property/FixedValuePropertyAccessor.java index f7df1fea7b..e391744a25 100644 --- a/source/java/org/alfresco/cmis/property/FixedValuePropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/FixedValuePropertyAccessor.java @@ -25,10 +25,18 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.alfresco.util.EqualsHelper; +import org.alfresco.util.SearchLanguageConversion; import org.apache.lucene.index.Term; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; @@ -38,7 +46,6 @@ import org.apache.lucene.search.TermQuery; * Property accessor for fixed value mapping (eg to null, true, etc) * * @author andyh - * */ public class FixedValuePropertyAccessor extends AbstractNamedPropertyAccessor { @@ -59,12 +66,15 @@ public class FixedValuePropertyAccessor extends AbstractNamedPropertyAccessor return fixedValue; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - if(value.equals(fixedValue)) + if (EqualsHelper.nullSafeEquals(fixedValue, value)) { return new MatchAllDocsQuery(); } @@ -74,14 +84,17 @@ public class FixedValuePropertyAccessor extends AbstractNamedPropertyAccessor } } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { - if(not) + if (not) { - if(fixedValue == null) + if (fixedValue == null) { return new MatchAllDocsQuery(); } @@ -92,7 +105,7 @@ public class FixedValuePropertyAccessor extends AbstractNamedPropertyAccessor } else { - if(fixedValue == null) + if (fixedValue == null) { return new TermQuery(new Term("NO_TOKENS", "__")); } @@ -101,7 +114,211 @@ public class FixedValuePropertyAccessor extends AbstractNamedPropertyAccessor return new MatchAllDocsQuery(); } } - + + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + @SuppressWarnings("unchecked") + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + if (fixedValue instanceof Comparable) + { + Comparable comparable = (Comparable) fixedValue; + if (comparable.compareTo(value) > 0) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + @SuppressWarnings("unchecked") + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + if (fixedValue instanceof Comparable) + { + Comparable comparable = (Comparable) fixedValue; + if (comparable.compareTo(value) >= 0) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + boolean in = false; + for (Serializable value : values) + { + if (EqualsHelper.nullSafeEquals(fixedValue, value)) + { + in = true; + break; + } + } + + if (in == !not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + if (!EqualsHelper.nullSafeEquals(fixedValue, value)) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + @SuppressWarnings("unchecked") + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + if (fixedValue instanceof Comparable) + { + Comparable comparable = (Comparable) fixedValue; + if (comparable.compareTo(value) < 0) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + @SuppressWarnings("unchecked") + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + if (fixedValue instanceof Comparable) + { + Comparable comparable = (Comparable) fixedValue; + if (comparable.compareTo(value) <= 0) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + + if (fixedValue != null) + { + boolean matches = false; + + Object converted = DefaultTypeConverter.INSTANCE.convert(fixedValue.getClass(), value); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + String regExpression = SearchLanguageConversion.convertSQLLikeToRegex(asString); + Pattern pattern = Pattern.compile(regExpression); + String target = DefaultTypeConverter.INSTANCE.convert(String.class, fixedValue); + Matcher matcher = pattern.matcher(target); + if (matcher.matches()) + { + matches = true; + } + + if (matches == !not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); } } diff --git a/source/java/org/alfresco/cmis/property/GenericPropertyAccessor.java b/source/java/org/alfresco/cmis/property/GenericPropertyAccessor.java index 45abb60910..3b8b3baca2 100644 --- a/source/java/org/alfresco/cmis/property/GenericPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/GenericPropertyAccessor.java @@ -25,9 +25,11 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; @@ -35,7 +37,6 @@ import org.apache.lucene.search.Query; * The API to access a property. * * @author andyh - * */ public interface GenericPropertyAccessor { @@ -47,8 +48,26 @@ public interface GenericPropertyAccessor * @return */ public Serializable getProperty(NodeRef nodeRef, String propertyName); - - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException; - + + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException; + + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException; + + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException; + + public String getLuceneSortField(String propertyName); + + } diff --git a/source/java/org/alfresco/cmis/property/IsImmutablePropertyAccessor.java b/source/java/org/alfresco/cmis/property/IsImmutablePropertyAccessor.java index b6810d019f..a2e65dc417 100644 --- a/source/java/org/alfresco/cmis/property/IsImmutablePropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/IsImmutablePropertyAccessor.java @@ -25,12 +25,14 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.lock.LockType; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; @@ -38,8 +40,8 @@ import org.apache.lucene.search.Query; /** * Property accessor for CMIS is immutable property + * * @author andyh - * */ public class IsImmutablePropertyAccessor extends AbstractNamedPropertyAccessor { @@ -47,21 +49,21 @@ public class IsImmutablePropertyAccessor extends AbstractNamedPropertyAccessor public Serializable getProperty(NodeRef nodeRef) { LockType type = getServiceRegistry().getLockService().getLockType(nodeRef); - if(type == LockType.READ_ONLY_LOCK) + if (type == LockType.READ_ONLY_LOCK) { return Boolean.valueOf(true); } Serializable value = getServiceRegistry().getNodeService().getProperty(nodeRef, ContentModel.PROP_AUTO_VERSION); - if(value != null) + if (value != null) { Boolean autoVersion = DefaultTypeConverter.INSTANCE.convert(Boolean.class, value); - if(false == autoVersion.booleanValue()) + if (false == autoVersion.booleanValue()) { return Boolean.valueOf(true); } } return Boolean.valueOf(false); - + } @Override @@ -73,23 +75,116 @@ public class IsImmutablePropertyAccessor extends AbstractNamedPropertyAccessor @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { + // TODO Auto-generated method stub return null; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/IsLatestVersionPropertyAccessor.java b/source/java/org/alfresco/cmis/property/IsLatestVersionPropertyAccessor.java index fb794ee363..0bc9fb36b7 100644 --- a/source/java/org/alfresco/cmis/property/IsLatestVersionPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/IsLatestVersionPropertyAccessor.java @@ -25,26 +25,28 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; /** * Accesser for CMIS is latest version property + * * @author andyh - * */ public class IsLatestVersionPropertyAccessor extends AbstractNamedPropertyAccessor { public Serializable getProperty(NodeRef nodeRef) { - return !getServiceRegistry().getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY); + return !getServiceRegistry().getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY); } @Override @@ -56,23 +58,115 @@ public class IsLatestVersionPropertyAccessor extends AbstractNamedPropertyAccess @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/IsMajorVersionPropertyAccessor.java b/source/java/org/alfresco/cmis/property/IsMajorVersionPropertyAccessor.java index febd135959..72f36a3d1a 100644 --- a/source/java/org/alfresco/cmis/property/IsMajorVersionPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/IsMajorVersionPropertyAccessor.java @@ -25,12 +25,14 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionType; @@ -38,22 +40,22 @@ import org.apache.lucene.search.Query; /** * Accessor for CMIS is major version property + * * @author andyh - * */ public class IsMajorVersionPropertyAccessor extends AbstractNamedPropertyAccessor { public Serializable getProperty(NodeRef nodeRef) { - if(getServiceRegistry().getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY)) + if (getServiceRegistry().getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY)) { return false; } else { Version version = getServiceRegistry().getVersionService().getCurrentVersion(nodeRef); - if(version != null) + if (version != null) { return (version.getVersionType() == VersionType.MAJOR); } @@ -63,33 +65,125 @@ public class IsMajorVersionPropertyAccessor extends AbstractNamedPropertyAccesso } } } - + @Override public String getPropertyName() { return CMISMapping.PROP_IS_MAJOR_VERSION; } - + @Override public CMISScope getScope() { - return CMISScope.DOCUMENT; + return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/MappingPropertyAccessor.java b/source/java/org/alfresco/cmis/property/MappingPropertyAccessor.java index 11d4e818df..07cc4e0ef9 100644 --- a/source/java/org/alfresco/cmis/property/MappingPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/MappingPropertyAccessor.java @@ -25,14 +25,21 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; /** * Generic mapping of CMIS style property names to Alfresco properties (for non CMIS properties) @@ -47,31 +54,47 @@ public class MappingPropertyAccessor extends AbstractGenericPropertyAccessor return getServiceRegistry().getNodeService().getProperty(nodeRef, propertyQname); } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.GenericPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + + + + private String getLuceneFieldName(QName propertyQname) { - QName propertyQname = getCMISMapping().getPropertyQName(propertyName); - StringBuilder field = new StringBuilder(); + StringBuilder field = new StringBuilder(64); field.append("@"); field.append(propertyQname); - - // Check type conversion - + return field.toString(); + } + + private String getValueAsString(QName propertyQname, Serializable value) + { PropertyDefinition pd = getServiceRegistry().getDictionaryService().getProperty(propertyQname); Object converted = DefaultTypeConverter.INSTANCE.convert(pd.getDataType(), value); String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery(field.toString(), asString); + return asString; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.GenericPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { - QName propertyQname = getCMISMapping().getPropertyQName(propertyName); if(not) { @@ -82,7 +105,178 @@ public class MappingPropertyAccessor extends AbstractGenericPropertyAccessor return lqp.getFieldQuery("ISNOTNULL", propertyQname.toString()); } } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getRangeQuery(field, stringValue, "\uFFFF", false, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getRangeQuery(field, stringValue, "\uFFFF", true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + PropertyDefinition pd = getServiceRegistry().getDictionaryService().getProperty(propertyQname); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(pd.getDataType(), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getDoesNotMatchFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getRangeQuery(field, "\u0000", stringValue, true, false); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + return lqp.getRangeQuery(field, "\u0000", stringValue, true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + String field = getLuceneFieldName(propertyQname); + String stringValue = getValueAsString(propertyQname, value); + + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(field, stringValue), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(field, stringValue); + } + } + + + + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.GenericPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + QName propertyQname = getCMISMapping().getPropertyQName(propertyName); + return getLuceneFieldName(propertyQname); + } + - - } diff --git a/source/java/org/alfresco/cmis/property/NamedPropertyAccessor.java b/source/java/org/alfresco/cmis/property/NamedPropertyAccessor.java index 3b61beeb79..53efcbfad1 100644 --- a/source/java/org/alfresco/cmis/property/NamedPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/NamedPropertyAccessor.java @@ -25,10 +25,12 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; @@ -36,37 +38,109 @@ import org.apache.lucene.search.Query; * Named property accessor * * @author andyh - * */ -public interface NamedPropertyAccessor +public interface NamedPropertyAccessor { /** - * Get the name of the CMIS property this accessor fetches + * Get the name of the CMIS property this accessor fetches + * * @return */ public String getPropertyName(); - + /** * Get the property value + * * @param nodeRef * @return */ public Serializable getProperty(NodeRef nodeRef); - + /** * To what types of objects does this property apply? + * * @return */ public CMISScope getScope(); - - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException; + + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; /** * @param lqp * @param propertyName * @param not * @return - * @throws ParseException + * @throws ParseException */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param values + * @param not + * @param mode + * @return + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param mode + * @return + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException; + + /** + * @param lqp + * @param propertyName + * @param value + * @param not + * @return + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException; + + /** + * @param propertyName + * @return + */ + public String getLuceneSortField(String propertyName); } diff --git a/source/java/org/alfresco/cmis/property/ObjectIdPropertyAccessor.java b/source/java/org/alfresco/cmis/property/ObjectIdPropertyAccessor.java index 8c0ece0868..066b1e098e 100644 --- a/source/java/org/alfresco/cmis/property/ObjectIdPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/ObjectIdPropertyAccessor.java @@ -25,19 +25,24 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; +import org.alfresco.cmis.search.CMISQueryException; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; /** * Get the CMIS object id property. @@ -80,20 +85,30 @@ public class ObjectIdPropertyAccessor extends AbstractNamedPropertyAccessor return CMISScope.OBJECT; } + + private String getLuceneFieldName() + { + return "ID"; + } + + private String getValueAsString(Serializable value) + { + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.NODE_REF), value); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + return asString; + } + /* * (non-Javadoc) * * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, - * java.lang.String, java.io.Serializable) + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { - // TODO: version label form - - Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.NODE_REF), value); - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery("ID", asString); + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getFieldQuery(field, stringValue); } /* @@ -111,7 +126,159 @@ public class ObjectIdPropertyAccessor extends AbstractNamedPropertyAccessor else { return new MatchAllDocsQuery(); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'greater than' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'greater than or equals' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.NODE_REF), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; } } + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getDoesNotMatchFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'less than' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'less than or equals' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(field, stringValue), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(field, stringValue); + } + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); + } + } diff --git a/source/java/org/alfresco/cmis/property/ObjectTypeIdPropertyAccessor.java b/source/java/org/alfresco/cmis/property/ObjectTypeIdPropertyAccessor.java index 3fd254e963..a6a16a1301 100644 --- a/source/java/org/alfresco/cmis/property/ObjectTypeIdPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/ObjectTypeIdPropertyAccessor.java @@ -25,24 +25,31 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; +import org.alfresco.cmis.dictionary.CMISTypeId; +import org.alfresco.cmis.search.CMISQueryException; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; /** * Get the CMIS object type id property * * @author andyh - * */ public class ObjectTypeIdPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -51,11 +58,11 @@ public class ObjectTypeIdPropertyAccessor extends AbstractNamedPropertyAccessor { QName typeQName = getCMISMapping().getCmisType(getServiceRegistry().getNodeService().getType(nodeRef)); CMISScope scope; - if(getCMISMapping().isValidCmisDocument(typeQName)) + if (getCMISMapping().isValidCmisDocument(typeQName)) { scope = CMISScope.DOCUMENT; } - else if(getCMISMapping().isValidCmisFolder(typeQName)) + else if (getCMISMapping().isValidCmisFolder(typeQName)) { scope = CMISScope.FOLDER; } @@ -71,23 +78,42 @@ public class ObjectTypeIdPropertyAccessor extends AbstractNamedPropertyAccessor { return CMISMapping.PROP_OBJECT_TYPE_ID; } - + @Override public CMISScope getScope() { - return CMISScope.OBJECT; + return CMISScope.OBJECT; } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + + private String getLuceneFieldName() { - // TODO: version label form - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, value); - return lqp.getFieldQuery("TYPE", asString); + return "TYPE"; } - + + private String getValueAsString(Serializable value) + { + // Object converted = + // DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.QNAME), + // value); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, value); + return asString; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + CMISTypeId cmisTypeId = getCMISMapping().getCmisTypeId(stringValue); + QName alfrescoType = getCMISMapping().getAlfrescoType(cmisTypeId.getQName()); + return lqp.getFieldQuery(field, alfrescoType.toString()); + } + /* * (non-Javadoc) * @@ -105,7 +131,165 @@ public class ObjectTypeIdPropertyAccessor extends AbstractNamedPropertyAccessor return new MatchAllDocsQuery(); } } - - + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'greater than' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'greater than or equals' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + + Collection asStrings = new ArrayList(values.size()); + for (Serializable value : values) + { + String stringValue = getValueAsString(value); + CMISTypeId cmisTypeId = getCMISMapping().getCmisTypeId(stringValue); + QName alfrescoType = getCMISMapping().getAlfrescoType(cmisTypeId.getQName()); + asStrings.add(alfrescoType.toString()); + } + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + CMISTypeId cmisTypeId = getCMISMapping().getCmisTypeId(stringValue); + QName alfrescoType = getCMISMapping().getAlfrescoType(cmisTypeId.getQName()); + return lqp.getDoesNotMatchFieldQuery(field, alfrescoType.toString()); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'less than' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + throw new CMISQueryException("Property "+getPropertyName() +" can not be used in a 'less than or equals' comparison"); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + CMISTypeId cmisTypeId = getCMISMapping().getCmisTypeId(stringValue); + QName alfrescoType = getCMISMapping().getAlfrescoType(cmisTypeId.getQName()); + + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(field, alfrescoType.toString()), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(field, alfrescoType.toString()); + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); + } } diff --git a/source/java/org/alfresco/cmis/property/ParentPropertyAccessor.java b/source/java/org/alfresco/cmis/property/ParentPropertyAccessor.java index 3475ad946e..e662e62426 100644 --- a/source/java/org/alfresco/cmis/property/ParentPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/ParentPropertyAccessor.java @@ -25,20 +25,24 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.CMISService; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; /** * Get the CMIS parent property @@ -92,19 +96,32 @@ public class ParentPropertyAccessor extends AbstractNamedPropertyAccessor return CMISScope.FOLDER; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + private String getLuceneFieldName() + { + return "PARENT"; + } + + private String getValueAsString(Serializable value) { - // TODO: version label form - Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.NODE_REF), value); - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery("PARENT", asString); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + return asString; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getFieldQuery(field, stringValue); + } + /* * (non-Javadoc) * @@ -123,4 +140,156 @@ public class ParentPropertyAccessor extends AbstractNamedPropertyAccessor } } + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(getServiceRegistry().getDictionaryService().getDataType(DataTypeDefinition.NODE_REF), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getDoesNotMatchFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(field, stringValue), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(field, stringValue); + } + } + + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); + } } diff --git a/source/java/org/alfresco/cmis/property/SimplePropertyAccessor.java b/source/java/org/alfresco/cmis/property/SimplePropertyAccessor.java index 03c41ecefa..d2c500bc3a 100644 --- a/source/java/org/alfresco/cmis/property/SimplePropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/SimplePropertyAccessor.java @@ -25,20 +25,27 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.BooleanClause.Occur; import org.springframework.beans.factory.InitializingBean; /** * A simple 1-1 property mapping from a CMIS property name to an alfresco property + * * @author andyh - * */ public class SimplePropertyAccessor extends AbstractNamedPropertyAccessor implements InitializingBean { @@ -61,37 +68,211 @@ public class SimplePropertyAccessor extends AbstractNamedPropertyAccessor implem propertyQname = QName.resolveToQName(getServiceRegistry().getNamespaceService(), mapping); } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.GenericPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) - */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + private String getLuceneFieldName() { - StringBuilder field = new StringBuilder(); + StringBuilder field = new StringBuilder(64); field.append("@"); field.append(propertyQname); - - // Check type conversion - + return field.toString(); + } + + private String getValueAsString(Serializable value) + { PropertyDefinition pd = getServiceRegistry().getDictionaryService().getProperty(propertyQname); Object converted = DefaultTypeConverter.INSTANCE.convert(pd.getDataType(), value); - String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); - - return lqp.getFieldQuery(field.toString(), asString); + String asString = DefaultTypeConverter.INSTANCE.convert(String.class, converted); + return asString; } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.GenericPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) - */ - public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException - { - if(not) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String xxxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) + */ + public Query buildLuceneExists(LuceneQueryParser lqp, String xxxx, Boolean not) throws ParseException + { + if (not) { return lqp.getFieldQuery("ISNULL", propertyQname.toString()); } else { return lqp.getFieldQuery("ISNOTNULL", propertyQname.toString()); - } + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String xxxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getRangeQuery(field, stringValue, "\uFFFF", false, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String xxxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getRangeQuery(field, stringValue, "\uFFFF", true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String xxxx, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + PropertyDefinition pd = getServiceRegistry().getDictionaryService().getProperty(propertyQname); + + // Check type conversion + + @SuppressWarnings("unused") + Object converted = DefaultTypeConverter.INSTANCE.convert(pd.getDataType(), values); + Collection asStrings = DefaultTypeConverter.INSTANCE.convert(String.class, values); + + if (asStrings.size() == 0) + { + if (not) + { + return new MatchAllDocsQuery(); + } + else + { + return new TermQuery(new Term("NO_TOKENS", "__")); + } + } + else if (asStrings.size() == 1) + { + String value = asStrings.iterator().next(); + if (not) + { + return lqp.getDoesNotMatchFieldQuery(field, value); + } + else + { + return lqp.getFieldQuery(field, value); + } + } + else + { + BooleanQuery booleanQuery = new BooleanQuery(); + if (not) + { + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + } + for (String value : asStrings) + { + Query any = lqp.getFieldQuery(field, value); + if (not) + { + booleanQuery.add(any, Occur.MUST_NOT); + } + else + { + booleanQuery.add(any, Occur.SHOULD); + } + } + return booleanQuery; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String xxxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getDoesNotMatchFieldQuery(field, stringValue); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String xxxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getRangeQuery(field, "\u0000", stringValue, true, false); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String xxx, Serializable value, PredicateMode mode) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + return lqp.getRangeQuery(field, "\u0000", stringValue, true, true); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String xxxx, Serializable value, Boolean not) throws ParseException + { + String field = getLuceneFieldName(); + String stringValue = getValueAsString(value); + + if (not) + { + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(new MatchAllDocsQuery(), Occur.MUST); + booleanQuery.add(lqp.getLikeQuery(field, stringValue), Occur.MUST_NOT); + return booleanQuery; + } + else + { + return lqp.getLikeQuery(field, stringValue); + } + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return getLuceneFieldName(); } } diff --git a/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutByPropertyAccessor.java b/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutByPropertyAccessor.java index ddcc1b2b73..e74bf70944 100644 --- a/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutByPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutByPropertyAccessor.java @@ -25,20 +25,22 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.lock.LockType; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; /** * Get the CMIS version series checked out by property + * * @author andyh - * */ public class VersionSeriesCheckedOutByPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -83,20 +85,114 @@ public class VersionSeriesCheckedOutByPropertyAccessor extends AbstractNamedProp return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutIdPropertyAccessor.java b/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutIdPropertyAccessor.java index 58be9f0f30..1e5c428ea8 100644 --- a/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutIdPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/VersionSeriesCheckedOutIdPropertyAccessor.java @@ -25,20 +25,22 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.lock.LockType; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; /** * Get the CMIS version series checked out id property + * * @author andyh - * */ public class VersionSeriesCheckedOutIdPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -77,21 +79,111 @@ public class VersionSeriesCheckedOutIdPropertyAccessor extends AbstractNamedProp return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } } diff --git a/source/java/org/alfresco/cmis/property/VersionSeriesIdPropertyAccessor.java b/source/java/org/alfresco/cmis/property/VersionSeriesIdPropertyAccessor.java index 854f944cab..e995db35e3 100644 --- a/source/java/org/alfresco/cmis/property/VersionSeriesIdPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/VersionSeriesIdPropertyAccessor.java @@ -25,23 +25,26 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; /** * @author andyh - * */ public class VersionSeriesIdPropertyAccessor extends AbstractNamedPropertyAccessor { - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.alfresco.cmis.property.NamedPropertyAccessor#getProperty(org.alfresco.service.cmr.repository.NodeRef) */ public Serializable getProperty(NodeRef nodeRef) @@ -66,20 +69,112 @@ public class VersionSeriesIdPropertyAccessor extends AbstractNamedPropertyAccess return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/property/VersionSeriesIsCheckedOutPropertyAccessor.java b/source/java/org/alfresco/cmis/property/VersionSeriesIsCheckedOutPropertyAccessor.java index 29a52ddb66..9902f6478f 100644 --- a/source/java/org/alfresco/cmis/property/VersionSeriesIsCheckedOutPropertyAccessor.java +++ b/source/java/org/alfresco/cmis/property/VersionSeriesIsCheckedOutPropertyAccessor.java @@ -25,20 +25,22 @@ package org.alfresco.cmis.property; import java.io.Serializable; +import java.util.Collection; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.cmis.dictionary.CMISScope; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.service.cmr.lock.LockType; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.lucene.search.Query; /** * Get the CMIS version series checked out property + * * @author andyh - * */ public class VersionSeriesIsCheckedOutPropertyAccessor extends AbstractNamedPropertyAccessor { @@ -76,21 +78,112 @@ public class VersionSeriesIsCheckedOutPropertyAccessor extends AbstractNamedProp return CMISScope.DOCUMENT; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.io.Serializable) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) */ - public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value) throws ParseException + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException { return null; } - /* (non-Javadoc) - * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, java.lang.String, java.lang.Boolean) + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) */ public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException { return null; } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } - + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + throw new UnsupportedOperationException(); + } + } diff --git a/source/java/org/alfresco/cmis/search/CMISResultSet.java b/source/java/org/alfresco/cmis/search/CMISResultSet.java index 4ec4aaef95..50765df881 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSet.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSet.java @@ -45,7 +45,7 @@ public interface CMISResultSet extends Iterable * set when executing the query. * @return */ - public int start(); + public int getStart(); /** * Get the number of rows in this result set. @@ -58,7 +58,7 @@ public interface CMISResultSet extends Iterable * * @return */ - public int length(); + public int getLength(); /** * Close the result set and release any resources held/ diff --git a/source/java/org/alfresco/cmis/search/CMISResultSetImpl.java b/source/java/org/alfresco/cmis/search/CMISResultSetImpl.java index 4c8486ea71..2deafc697c 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSetImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSetImpl.java @@ -24,6 +24,7 @@ */ package org.alfresco.cmis.search; +import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -39,8 +40,10 @@ import org.alfresco.service.cmr.search.ResultSet; /** * @author andyh */ -public class CMISResultSetImpl implements CMISResultSet +public class CMISResultSetImpl implements CMISResultSet, Serializable { + private static final long serialVersionUID = 2014688399588268994L; + private Map wrapped; CMISQueryOptions options; @@ -118,7 +121,7 @@ public class CMISResultSetImpl implements CMISResultSet * * @see org.alfresco.cmis.search.CMISResultSet#length() */ - public int length() + public int getLength() { for (ResultSet resultSet : wrapped.values()) { @@ -132,7 +135,7 @@ public class CMISResultSetImpl implements CMISResultSet * * @see org.alfresco.cmis.search.CMISResultSet#start() */ - public int start() + public int getStart() { return options.getSkipCount(); } diff --git a/source/java/org/alfresco/cmis/search/CMISResultSetRow.java b/source/java/org/alfresco/cmis/search/CMISResultSetRow.java index 004417cd57..e65f06871d 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSetRow.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSetRow.java @@ -27,6 +27,8 @@ package org.alfresco.cmis.search; import java.io.Serializable; import java.util.Map; +import org.alfresco.service.cmr.repository.NodeRef; + /** * A row in a CMISResultSet * @@ -62,12 +64,25 @@ public interface CMISResultSetRow public Map getScores(); /** - * Get the score related to the names selector. + * Get the score related to the named selector. * @param selectorName * @return - the score. */ public float getScore(String selectorName); + /** + * Gets the node refs + * @return a map of selector name to node ref + */ + public Map getNodeRefs(); + + /** + * Gets the node ref related to the named selector + * @param selectorName + * @return the node ref + */ + public NodeRef getNodeRef(String selectorName); + /** * Get the index of this result set in the result set * If you want the overall position in paged reults you have to add the skipCount fo the result set. diff --git a/source/java/org/alfresco/cmis/search/CMISResultSetRowImpl.java b/source/java/org/alfresco/cmis/search/CMISResultSetRowImpl.java index 775ae018e7..d1d0b54741 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSetRowImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSetRowImpl.java @@ -130,6 +130,26 @@ public class CMISResultSetRowImpl implements CMISResultSetRow return scores; } + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.search.CMISResultSetRow#getScore(java.lang.String) + */ + public NodeRef getNodeRef(String selectorName) + { + return nodeRefs.get(selectorName); + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.search.CMISResultSetRow#getScores() + */ + public Map getNodeRefs() + { + return nodeRefs; + } + /* * (non-Javadoc) * diff --git a/source/java/org/alfresco/cmis/search/CMISResultSetRowIteratorImpl.java b/source/java/org/alfresco/cmis/search/CMISResultSetRowIteratorImpl.java index 745ad4ec51..bc04be3e33 100644 --- a/source/java/org/alfresco/cmis/search/CMISResultSetRowIteratorImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISResultSetRowIteratorImpl.java @@ -54,7 +54,7 @@ public class CMISResultSetRowIteratorImpl implements ListIterator values, Boolean not, PredicateMode mode) throws ParseException + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.buildLuceneIn(lqp, propertyName, values, not, mode); + } + else + { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * 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 + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.buildLuceneInequality(lqp, propertyName, value, mode); + } + else + { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * 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 + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.buildLuceneLessThan(lqp, propertyName, value, mode); + } + else + { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * 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 + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.buildLuceneLessThanOrEquals(lqp, propertyName, value, mode); + } + else + { + return null; + } + } + + /* + * (non-Javadoc) + * + * @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 + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.buildLuceneLike(lqp, propertyName, value, not); + } + else + { + return null; + } + } + + /* (non-Javadoc) + * @see org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext#getLuceneSortField(org.alfresco.service.namespace.QName) + */ + public String getLuceneSortField(QName propertyQName) + { + if (cmisPropertyService instanceof CMISPropertyServiceImpl) + { + String propertyName = cmisDictionaryService.getCMISMapping().getCmisPropertyName(propertyQName); + CMISPropertyServiceImpl impl = (CMISPropertyServiceImpl) cmisPropertyService; + return impl.getLuceneSortField(propertyName); + } + else + { + return null; + } + } + } diff --git a/source/java/org/alfresco/cmis/search/QueryTest.java b/source/java/org/alfresco/cmis/search/QueryTest.java index c836ad66ab..069f110846 100644 --- a/source/java/org/alfresco/cmis/search/QueryTest.java +++ b/source/java/org/alfresco/cmis/search/QueryTest.java @@ -25,140 +25,1456 @@ package org.alfresco.cmis.search; import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; import org.alfresco.cmis.dictionary.BaseCMISTest; import org.alfresco.cmis.dictionary.CMISMapping; import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.alfresco.service.cmr.repository.datatype.Duration; +import org.alfresco.util.CachingDateFormat; /** * @author andyh */ public class QueryTest extends BaseCMISTest { + @SuppressWarnings("unchecked") + private T testQuery(String query, int size, boolean dump, String returnPropertyName, T returnType, boolean shouldThrow) + { + CMISResultSet rs = null; + try + { + T returnValue = null; + rs = cmisQueryService.query(query); + + for (CMISResultSetRow row : rs) + { + if (row.getIndex() == 0) + { + Serializable sValue = row.getValue(returnPropertyName); + returnValue = (T) DefaultTypeConverter.INSTANCE.convert(returnType.getClass(), sValue); + if(dump) + { + System.out.println(cmisPropertyService.getProperties(row.getNodeRef(rs.getMetaData().getSelectorNames()[0]))); + } + } + if (dump) + { + System.out.println("ID =" + + row.getValue("OBJECT_ID") + " " + ((returnPropertyName != null) ? (returnPropertyName + "=" + row.getValue(returnPropertyName)) : "") + " Score=" + + row.getScore() + " " + row.getScores()); + } + } + if (size >= 0) + { + assertEquals(size, rs.getLength()); + } + if (shouldThrow) + { + fail(); + } + return returnValue; + } + catch (CMISQueryException e) + { + if (shouldThrow) + { + return null; + } + else + { + throw e; + } + } + catch (QueryModelException e) + { + if (shouldThrow) + { + return null; + } + else + { + throw e; + } + } + finally + { + if (rs != null) + { + try + { + rs.close(); + } + finally + { + rs = null; + } + } + } + + } + + public void test_ALLOWED_CHILD_OBJECT_TYPES() + { + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES = 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES <> 'test'", 33, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES < 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES <= 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES > 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES >= 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES IN ('test')", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES NOT IN ('test')", 33, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES LIKE 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES NOT LIKE 'test'", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES IS NOT NULL", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES IS NULL", 33, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' = ANY ALLOWED_CHILD_OBJECT_TYPES", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' <> ANY ALLOWED_CHILD_OBJECT_TYPES", 33, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' < ANY ALLOWED_CHILD_OBJECT_TYPES", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' <= ANY ALLOWED_CHILD_OBJECT_TYPES", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' > ANY ALLOWED_CHILD_OBJECT_TYPES", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE 'test' >= ANY ALLOWED_CHILD_OBJECT_TYPES", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ANY ALLOWED_CHILD_OBJECT_TYPES IN ('test')", 0, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + testQuery("SELECT ALLOWED_CHILD_OBJECT_TYPES FROM FOLDER_OBJECT_TYPE WHERE ANY ALLOWED_CHILD_OBJECT_TYPES NOT IN ('test')", 33, false, "ALLOWED_CHILD_OBJECT_TYPES", new String(), false); + } + + public void test_PARENT() + { + NodeRef rootNode = cmisService.getDefaultRootNodeRef(); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT = '" + rootNode.toString() + "'", 4, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT <> '" + rootNode.toString() + "'", 29, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT < '" + rootNode.toString() + "'", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT <= '" + rootNode.toString() + "'", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT > '" + rootNode.toString() + "'", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT >= '" + rootNode.toString() + "'", 0, false, "PARENT", new String(), true); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT IN ('" + rootNode.toString() + "')", 4, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT NOT IN ('" + rootNode.toString() + "')", 29, false, "PARENT", new String(), false); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT LIKE '" + rootNode.toString() + "'", 4, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT NOT LIKE '" + rootNode.toString() + "'", 29, false, "PARENT", new String(), false); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT IS NOT NULL", 33, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE PARENT IS NULL", 0, false, "PARENT", new String(), false); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' = ANY PARENT", 4, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' <> ANY PARENT", 29, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' < ANY PARENT", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' <= ANY PARENT", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' > ANY PARENT", 0, false, "PARENT", new String(), true); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE '" + rootNode.toString() + "' >= ANY PARENT", 0, false, "PARENT", new String(), true); + + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE ANY PARENT IN ('" + rootNode.toString() + "')", 4, false, "PARENT", new String(), false); + testQuery("SELECT PARENT FROM FOLDER_OBJECT_TYPE WHERE ANY PARENT NOT IN ('" + rootNode.toString() + "')", 29, false, "PARENT", new String(), false); + } + + + public void test_CONTENT_STREAM_URI() + { + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI = 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI <> 'test'", 45, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI < 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI <= 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI > 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI >= 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI IN ('test')", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI NOT IN ('test')", 45, false, "CONTENT_STREAM_URI", new String(), false); + + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI LIKE 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI NOT LIKE 'test'", 0, false, "CONTENT_STREAM_URI", new String(), false); + + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI IS NOT NULL", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_URI IS NULL", 45, false, "CONTENT_STREAM_URI", new String(), false); + + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' = ANY CONTENT_STREAM_URI", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' <> ANY CONTENT_STREAM_URI", 45, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' < ANY CONTENT_STREAM_URI", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' <= ANY CONTENT_STREAM_URI", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' > ANY CONTENT_STREAM_URI", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE 'test' >= ANY CONTENT_STREAM_URI", 0, false, "CONTENT_STREAM_URI", new String(), false); + + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_URI IN ('test')", 0, false, "CONTENT_STREAM_URI", new String(), false); + testQuery("SELECT CONTENT_STREAM_URI FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_URI NOT IN ('test')", 45, false, "CONTENT_STREAM_URI", new String(), false); + } + + + public void test_CONTENT_STREAM_FILENAME() + { + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME = 'tutorial'", 1, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME <> 'tutorial'", 44, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME < 'tutorial'", 45, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME <= 'tutorial'", 45, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME > 'tutorial'", 8, true, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME >= 'tutorial'", 9, false, "CONTENT_STREAM_FILENAME", new String(), false); + + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME IN ('tutorial')", 1, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME NOT IN ('tutorial')", 44, false, "CONTENT_STREAM_FILENAME", new String(), false); + + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME LIKE 'tutorial'", 1, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME NOT LIKE 'tutorial'", 44, false, "CONTENT_STREAM_FILENAME", new String(), false); + + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME IS NOT NULL", 45, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_FILENAME IS NULL", 0, false, "CONTENT_STREAM_FILENAME", new String(), false); + + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' = ANY CONTENT_STREAM_FILENAME", 1, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' <> ANY CONTENT_STREAM_FILENAME", 44, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' < ANY CONTENT_STREAM_FILENAME", 45, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' <= ANY CONTENT_STREAM_FILENAME", 45, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' > ANY CONTENT_STREAM_FILENAME", 8, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' >= ANY CONTENT_STREAM_FILENAME", 9, false, "CONTENT_STREAM_FILENAME", new String(), false); + + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_FILENAME IN ('tutorial')", 1, false, "CONTENT_STREAM_FILENAME", new String(), false); + testQuery("SELECT CONTENT_STREAM_FILENAME FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_FILENAME NOT IN ('tutorial')", 44, false, "CONTENT_STREAM_FILENAME", new String(), false); + } + + public void test_CONTENT_STREAM_MIME_TYPE() + { + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE = 'text/plain'", 26, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE <> 'text/plain'", 19, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE < 'text/plain'", 14, true, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE <= 'text/plain'", 40, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE > 'text/plain'", 5, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE >= 'text/plain'", 31, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE IN ('text/plain')", 26, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE NOT IN ('text/plain')", 19, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE LIKE 'text/plain'", 26, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE NOT LIKE 'text/plain'", 19, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE IS NOT NULL", 45, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_MIME_TYPE IS NULL", 0, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' = ANY CONTENT_STREAM_MIME_TYPE", 26, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' <> ANY CONTENT_STREAM_MIME_TYPE", 19, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' < ANY CONTENT_STREAM_MIME_TYPE", 14, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' <= ANY CONTENT_STREAM_MIME_TYPE", 40, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' > ANY CONTENT_STREAM_MIME_TYPE", 5, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE 'text/plain' >= ANY CONTENT_STREAM_MIME_TYPE", 31, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_MIME_TYPE IN ('text/plain')", 26, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + testQuery("SELECT CONTENT_STREAM_MIME_TYPE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_MIME_TYPE NOT IN ('text/plain')", 19, false, "CONTENT_STREAM_MIME_TYPE", new String(), false); + } + + public void test_CONTENT_STREAM_LENGTH() + { + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH = 750", 1, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH <> 750", 44, true, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH < 750", 28, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH <= 750", 29, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH > 750", 16, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH >= 750", 17, false, "CONTENT_STREAM_LENGTH", new String(), false); + + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH IN (750)", 1, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH NOT IN (750)", 44, false, "CONTENT_STREAM_LENGTH", new String(), false); + + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH LIKE '750'", 1, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH NOT LIKE '750'", 44, false, "CONTENT_STREAM_LENGTH", new String(), false); + + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH IS NOT NULL", 45, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_LENGTH IS NULL", 0, false, "CONTENT_STREAM_LENGTH", new String(), false); + + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 = ANY CONTENT_STREAM_LENGTH", 1, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 <> ANY CONTENT_STREAM_LENGTH", 44, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 < ANY CONTENT_STREAM_LENGTH", 28, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 <= ANY CONTENT_STREAM_LENGTH", 29, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 > ANY CONTENT_STREAM_LENGTH", 16, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE 750 >= ANY CONTENT_STREAM_LENGTH", 17, false, "CONTENT_STREAM_LENGTH", new String(), false); + + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_LENGTH IN (750)", 1, false, "CONTENT_STREAM_LENGTH", new String(), false); + testQuery("SELECT CONTENT_STREAM_LENGTH FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_LENGTH NOT IN (750)", 44, false, "CONTENT_STREAM_LENGTH", new String(), false); + } + + + public void test_CONTENT_STREAM_ALLOWED() + { + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED = 'ALLOWED'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED <> 'ALLOWED'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED < 'ALLOWED'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED <= 'ALLOWED'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED > 'ALLOWED'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED >= 'ALLOWED'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED IN ('ALLOWED')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED NOT IN ('ALLOWED')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED LIKE 'ALLOWED'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED NOT LIKE 'ALLOWED'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE CONTENT_STREAM_ALLOWED IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' = ANY CONTENT_STREAM_ALLOWED", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' <> ANY CONTENT_STREAM_ALLOWED", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' < ANY CONTENT_STREAM_ALLOWED", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' <= ANY CONTENT_STREAM_ALLOWED", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' > ANY CONTENT_STREAM_ALLOWED", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE 'ALLOWED' >= ANY CONTENT_STREAM_ALLOWED", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_ALLOWED IN ('ALLOWED')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CONTENT_STREAM_ALLOWED FROM DOCUMENT_OBJECT_TYPE WHERE ANY CONTENT_STREAM_ALLOWED NOT IN ('ALLOWED')", 0, false, "OBJECT_ID", new String(), false); + } + + + public void test_CHECKIN_COMMENT() + { + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT = 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT <> 'admin'", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT < 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT <= 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT > 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT >= 'admin'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT LIKE 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT NOT LIKE 'admin'", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT IS NOT NULL", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE CHECKIN_COMMENT IS NULL", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' = ANY CHECKIN_COMMENT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <> ANY CHECKIN_COMMENT", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' < ANY CHECKIN_COMMENT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <= ANY CHECKIN_COMMENT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' > ANY CHECKIN_COMMENT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' >= ANY CHECKIN_COMMENT", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE ANY CHECKIN_COMMENT IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT CHECKIN_COMMENT FROM DOCUMENT_OBJECT_TYPE WHERE ANY CHECKIN_COMMENT NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + } + + public void test_VERSION_SERIES_CHECKED_OUT_ID() + { + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID = 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID <> 'admin'", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID < 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID <= 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID > 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID >= 'admin'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID LIKE 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID NOT LIKE 'admin'", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID IS NOT NULL", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_ID IS NULL", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' = ANY VERSION_SERIES_CHECKED_OUT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <> ANY VERSION_SERIES_CHECKED_OUT_ID", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' < ANY VERSION_SERIES_CHECKED_OUT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <= ANY VERSION_SERIES_CHECKED_OUT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' > ANY VERSION_SERIES_CHECKED_OUT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' >= ANY VERSION_SERIES_CHECKED_OUT_ID", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_CHECKED_OUT_ID IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_CHECKED_OUT_ID NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + } + + public void test_VERSION_SERIES_CHECKED_OUT_BY() + { + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY = 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY <> 'admin'", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY < 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY <= 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY > 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY >= 'admin'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY LIKE 'admin'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY NOT LIKE 'admin'", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY IS NOT NULL", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_CHECKED_OUT_BY IS NULL", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' = ANY VERSION_SERIES_CHECKED_OUT_BY", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <> ANY VERSION_SERIES_CHECKED_OUT_BY", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' < ANY VERSION_SERIES_CHECKED_OUT_BY", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' <= ANY VERSION_SERIES_CHECKED_OUT_BY", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' > ANY VERSION_SERIES_CHECKED_OUT_BY", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'admin' >= ANY VERSION_SERIES_CHECKED_OUT_BY", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_CHECKED_OUT_BY IN ('admin')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_CHECKED_OUT_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_CHECKED_OUT_BY NOT IN ('admin')", 45, false, "OBJECT_ID", new String(), true); + } + + + public void test_VERSION_SERIES_IS_CHECKED_OUT() + { + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT = 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT <> 'TRUE'", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT < 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT <= 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT > 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT >= 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT IN ('TRUE')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT NOT IN ('TRUE')", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT LIKE 'TRUE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT NOT LIKE 'TRUE'", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT IS NOT NULL", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_IS_CHECKED_OUT IS NULL", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' = ANY VERSION_SERIES_IS_CHECKED_OUT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <> ANY VERSION_SERIES_IS_CHECKED_OUT", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' < ANY VERSION_SERIES_IS_CHECKED_OUT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <= ANY VERSION_SERIES_IS_CHECKED_OUT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' > ANY VERSION_SERIES_IS_CHECKED_OUT", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' >= ANY VERSION_SERIES_IS_CHECKED_OUT", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_IS_CHECKED_OUT IN ('TRUE')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_IS_CHECKED_OUT FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_IS_CHECKED_OUT NOT IN ('TRUE')", 45, false, "OBJECT_ID", new String(), true); + } + + + public void test_VERSION_SERIES_ID() + { + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID = 'company'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID <> 'company'", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID < 'company'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID <= 'company'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID > 'company'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID >= 'company'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID IN ('company')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID NOT IN ('company')", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID LIKE 'company'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID NOT LIKE 'company'", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID IS NOT NULL", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_SERIES_ID IS NULL", 45, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' = ANY VERSION_SERIES_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' <> ANY VERSION_SERIES_ID", 45, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' < ANY VERSION_SERIES_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' <= ANY VERSION_SERIES_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' > ANY VERSION_SERIES_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'company' >= ANY VERSION_SERIES_ID", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_ID IN ('company')", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT VERSION_SERIES_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_SERIES_ID NOT IN ('company')", 45, false, "OBJECT_ID", new String(), true); + } + + public void test_VERSION_LABEL() + { + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL = 'company'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL <> 'company'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL < 'company'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL <= 'company'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL > 'company'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL >= 'company'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL IN ('company')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL NOT IN ('company')", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL LIKE 'company'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL NOT LIKE 'company'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL IS NOT NULL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE VERSION_LABEL IS NULL", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' = ANY VERSION_LABEL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' <> ANY VERSION_LABEL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' < ANY VERSION_LABEL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' <= ANY VERSION_LABEL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' > ANY VERSION_LABEL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE 'company' >= ANY VERSION_LABEL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_LABEL IN ('company')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT VERSION_LABEL FROM DOCUMENT_OBJECT_TYPE WHERE ANY VERSION_LABEL NOT IN ('company')", 45, false, "OBJECT_ID", new String(), false); + } + + public void test_IS_LATEST_MAJOR_VERSION() + { + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION = 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION <> 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION < 'TRUE'", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION <= 'TRUE'", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION > 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION >= 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION LIKE 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION NOT LIKE 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION IS NOT NULL", 33, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_MAJOR_VERSION IS NULL", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' = ANY IS_LATEST_MAJOR_VERSION", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <> ANY IS_LATEST_MAJOR_VERSION", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' < ANY IS_LATEST_MAJOR_VERSION", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <= ANY IS_LATEST_MAJOR_VERSION", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' > ANY IS_LATEST_MAJOR_VERSION", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' >= ANY IS_LATEST_MAJOR_VERSION", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_LATEST_MAJOR_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_LATEST_MAJOR_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + } + + public void test_IS_MAJOR_VERSION() + { + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION = 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION <> 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION < 'TRUE'", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION <= 'TRUE'", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION > 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION >= 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION LIKE 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION NOT LIKE 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION IS NOT NULL", 33, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_MAJOR_VERSION IS NULL", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' = ANY IS_MAJOR_VERSION", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <> ANY IS_MAJOR_VERSION", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' < ANY IS_MAJOR_VERSION", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <= ANY IS_MAJOR_VERSION", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' > ANY IS_MAJOR_VERSION", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' >= ANY IS_MAJOR_VERSION", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_MAJOR_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_MAJOR_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_MAJOR_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + } + + public void test_IS_LATEST_VERSION() + { + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION = 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION <> 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION < 'TRUE'", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION <= 'TRUE'", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION > 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION >= 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION LIKE 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION NOT LIKE 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION IS NOT NULL", 33, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE IS_LATEST_VERSION IS NULL", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' = ANY IS_LATEST_VERSION", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <> ANY IS_LATEST_VERSION", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' < ANY IS_LATEST_VERSION", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <= ANY IS_LATEST_VERSION", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' > ANY IS_LATEST_VERSION", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' >= ANY IS_LATEST_VERSION", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_LATEST_VERSION IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_LATEST_VERSION FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_LATEST_VERSION NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + } + + public void test_IS_IMMUTABLE() + { + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE = 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE <> 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE < 'TRUE'", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE <= 'TRUE'", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE > 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE >= 'TRUE'", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE LIKE 'TRUE'", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE NOT LIKE 'TRUE'", 32, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE IS NOT NULL", 33, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE IS_IMMUTABLE IS NULL", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' = ANY IS_IMMUTABLE", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <> ANY IS_IMMUTABLE", 32, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' < ANY IS_IMMUTABLE", 6, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' <= ANY IS_IMMUTABLE", 7, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' > ANY IS_IMMUTABLE", 30, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE 'TRUE' >= ANY IS_IMMUTABLE", 30, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_IMMUTABLE IN ('TRUE')", 1, false, "OBJECT_ID", new String(), true); + testQuery("SELECT IS_IMMUTABLE FROM DOCUMENT_OBJECT_TYPE WHERE ANY IS_IMMUTABLE NOT IN ('TRUE')", 32, false, "OBJECT_ID", new String(), true); + } + + public void test_folder_NAME() + { + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME = 'company'", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME <> 'company'", 32, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME < 'company'", 6, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME <= 'company'", 7, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME > 'company'", 30, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME >= 'company'", 30, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME IN ('company')", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME NOT IN ('company')", 32, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME LIKE 'company'", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME NOT LIKE 'company'", 32, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE NAME IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' = ANY NAME", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' <> ANY NAME", 32, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' < ANY NAME", 6, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' <= ANY NAME", 7, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' > ANY NAME", 30, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE 'company' >= ANY NAME", 30, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE ANY NAME IN ('company')", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT NAME FROM FOLDER_OBJECT_TYPE WHERE ANY NAME NOT IN ('company')", 32, false, "OBJECT_ID", new String(), false); + } + + public void test_document_NAME() + { + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME = 'tutorial'", 1, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME <> 'tutorial'", 44, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME < 'tutorial'", 45, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME <= 'tutorial'", 45, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME > 'tutorial'", 8, true, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME >= 'tutorial'", 9, false, "NAME", new String(), false); + + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME IN ('tutorial')", 1, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME NOT IN ('tutorial')", 44, false, "NAME", new String(), false); + + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME LIKE 'tutorial'", 1, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME NOT LIKE 'tutorial'", 44, false, "NAME", new String(), false); + + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME IS NOT NULL", 45, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE NAME IS NULL", 0, false, "NAME", new String(), false); + + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' = ANY NAME", 1, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' <> ANY NAME", 44, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' < ANY NAME", 45, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' <= ANY NAME", 45, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' > ANY NAME", 8, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE 'tutorial' >= ANY NAME", 9, false, "NAME", new String(), false); + + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE ANY NAME IN ('tutorial')", 1, false, "NAME", new String(), false); + testQuery("SELECT NAME FROM DOCUMENT_OBJECT_TYPE WHERE ANY NAME NOT IN ('tutorial')", 44, false, "NAME", new String(), false); + } + + public void test_CHANGE_TOKEN() + { + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN = 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN <> 'test'", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN < 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN <= 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN > 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN >= 'test'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN IN ('test')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN NOT IN ('test')", 33, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN LIKE 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN NOT LIKE 'test'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN IS NOT NULL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE CHANGE_TOKEN IS NULL", 33, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' = ANY CHANGE_TOKEN", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' <> ANY CHANGE_TOKEN", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' < ANY CHANGE_TOKEN", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' <= ANY CHANGE_TOKEN", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' > ANY CHANGE_TOKEN", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE 'test' >= ANY CHANGE_TOKEN", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE ANY CHANGE_TOKEN IN ('test')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CHANGE_TOKEN FROM FOLDER_OBJECT_TYPE WHERE ANY CHANGE_TOKEN NOT IN ('test')", 33, false, "OBJECT_ID", new String(), false); + } + + public void test_LAST_MODIFICATION_DATE() + { + // By default we are only working to the day + + Calendar today = Calendar.getInstance(); + SimpleDateFormat df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", true); + + Date date = testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE", -1, false, "LAST_MODIFICATION_DATE", new Date(), false); + today.setTime(date); + + // start.set(Calendar.YEAR, start.getMinimum(Calendar.YEAR)); + // start.set(Calendar.DAY_OF_YEAR, start.getMinimum(Calendar.DAY_OF_YEAR)); + // start.set(Calendar.HOUR_OF_DAY, start.getMinimum(Calendar.HOUR_OF_DAY)); + // start.set(Calendar.MINUTE, start.getMinimum(Calendar.MINUTE)); + // start.set(Calendar.SECOND, start.getMinimum(Calendar.SECOND)); + today.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + + String sDate = df.format(today.getTime()); + + // Today (assuming al ws created today) + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE = '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <> '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE < '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE > '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE >= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + + // using yesterday + + date = Duration.subtract(date, new Duration("P1D")); + Calendar yesterday = Calendar.getInstance(); + yesterday.setTime(date); + yesterday.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + sDate = df.format(yesterday.getTime()); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE = '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <> '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE < '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <= '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE > '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE >= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + // using tomorrow + + date = Duration.add(date, new Duration("P2D")); + Calendar tomorrow = Calendar.getInstance(); + tomorrow.setTime(date); + tomorrow.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + sDate = df.format(tomorrow.getTime()); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE = '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <> '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE < '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE <= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE > '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE >= '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE NOT LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFICATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY LAST_MODIFICATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY LAST_MODIFICATION_DATE", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFICATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFICATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + } + + public void test_LAST_MODIFIED_BY() + { + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY = 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY <> 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY < 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY <= 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY > 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY >= 'System'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY IN ('System')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY NOT IN ('System')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY LIKE 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY NOT LIKE 'System'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE LAST_MODIFIED_BY IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' = ANY LAST_MODIFIED_BY", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' <> ANY LAST_MODIFIED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' < ANY LAST_MODIFIED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' <= ANY LAST_MODIFIED_BY", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' > ANY LAST_MODIFIED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' >= ANY LAST_MODIFIED_BY", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFIED_BY IN ('System')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT LAST_MODIFIED_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY LAST_MODIFIED_BY NOT IN ('System')", 0, false, "OBJECT_ID", new String(), false); + + } + + public void test_CREATION_DATE() + { + // By default we are only working to the day + + Calendar today = Calendar.getInstance(); + SimpleDateFormat df = CachingDateFormat.getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", true); + + Date date = testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE", -1, false, "CREATION_DATE", new Date(), false); + today.setTime(date); + + // start.set(Calendar.YEAR, start.getMinimum(Calendar.YEAR)); + // start.set(Calendar.DAY_OF_YEAR, start.getMinimum(Calendar.DAY_OF_YEAR)); + // start.set(Calendar.HOUR_OF_DAY, start.getMinimum(Calendar.HOUR_OF_DAY)); + // start.set(Calendar.MINUTE, start.getMinimum(Calendar.MINUTE)); + // start.set(Calendar.SECOND, start.getMinimum(Calendar.SECOND)); + today.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + + String sDate = df.format(today.getTime()); + + // Today (assuming al ws created today) + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE = '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <> '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE < '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE > '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE >= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE NOT IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + + // using yesterday + + date = Duration.subtract(date, new Duration("P1D")); + Calendar yesterday = Calendar.getInstance(); + yesterday.setTime(date); + yesterday.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + sDate = df.format(yesterday.getTime()); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE = '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <> '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE < '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <= '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE > '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE >= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + // using tomorrow + + date = Duration.add(date, new Duration("P2D")); + Calendar tomorrow = Calendar.getInstance(); + tomorrow.setTime(date); + tomorrow.set(Calendar.MILLISECOND, today.getMinimum(Calendar.MILLISECOND)); + sDate = df.format(tomorrow.getTime()); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE = '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <> '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE < '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE <= '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE > '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE >= '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE LIKE '" + sDate + "'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE NOT LIKE '" + sDate + "'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE CREATION_DATE IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' = ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <> ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' < ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' <= ANY CREATION_DATE", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' > ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE '" + sDate + "' >= ANY CREATION_DATE", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE IN ('" + sDate + "')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATION_DATE FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATION_DATE NOT IN ('" + sDate + "')", 45, false, "OBJECT_ID", new String(), false); + + } + + public void test_CREATED_BY() + { + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY = 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY <> 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY < 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY <= 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY > 'System'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY >= 'System'", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY IN ('System')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY NOT IN ('System')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY LIKE 'System'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY NOT LIKE 'System'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE CREATED_BY IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' = ANY CREATED_BY", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' <> ANY CREATED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' < ANY CREATED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' <= ANY CREATED_BY", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' > ANY CREATED_BY", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE 'System' >= ANY CREATED_BY", 45, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATED_BY IN ('System')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT CREATED_BY FROM DOCUMENT_OBJECT_TYPE WHERE ANY CREATED_BY NOT IN ('System')", 0, false, "OBJECT_ID", new String(), false); + + } + + public void test_OBJECT_TYPE_ID() + { + // DOC + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID = 'DOCUMENT_OBJECT_TYPE'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID <> 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID < 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID <= 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID > 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID >= 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID IN ('DOCUMENT_OBJECT_TYPE')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID NOT IN ('DOCUMENT_OBJECT_TYPE')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID LIKE 'DOCUMENT_OBJECT_TYPE'", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID NOT LIKE 'DOCUMENT_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID IS NOT NULL", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE OBJECT_TYPE_ID IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' = ANY OBJECT_TYPE_ID", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' <> ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' < ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' <= ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' > ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE 'DOCUMENT_OBJECT_TYPE' >= ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY OBJECT_TYPE_ID IN ('DOCUMENT_OBJECT_TYPE')", 45, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM DOCUMENT_OBJECT_TYPE WHERE ANY OBJECT_TYPE_ID NOT IN ('DOCUMENT_OBJECT_TYPE')", 0, false, "OBJECT_ID", new String(), false); + + // FOLDER + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID = 'FOLDER_OBJECT_TYPE'", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID <> 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID < 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID <= 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID > 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID >= 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID IN ('FOLDER_OBJECT_TYPE')", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID NOT IN ('FOLDER_OBJECT_TYPE')", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID LIKE 'FOLDER_OBJECT_TYPE'", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID NOT LIKE 'FOLDER_OBJECT_TYPE'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID IS NOT NULL", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_TYPE_ID IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' = ANY OBJECT_TYPE_ID", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' <> ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' < ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' <= ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' > ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE 'FOLDER_OBJECT_TYPE' >= ANY OBJECT_TYPE_ID", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE ANY OBJECT_TYPE_ID IN ('FOLDER_OBJECT_TYPE')", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_TYPE_ID FROM FOLDER_OBJECT_TYPE WHERE ANY OBJECT_TYPE_ID NOT IN ('FOLDER_OBJECT_TYPE')", 0, false, "OBJECT_ID", new String(), false); + + // RELATIONSHIP + + testQuery("SELECT OBJECT_TYPE_ID FROM RELATIONSHIP_OBJECT_TYPE WHERE OBJECT_TYPE_ID = ''", 1, false, "OBJECT_ID", new String(), true); + + } + + public void test_URI() + { + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI = 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI <> 'test'", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI < 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI <= 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI > 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI >= 'test'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI IN ('test')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI NOT IN ('test')", 33, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI LIKE 'test'", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI NOT LIKE 'test'", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI IS NOT NULL", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE URI IS NULL", 33, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' = ANY URI", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' <> ANY URI", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' < ANY URI", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' <= ANY URI", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' > ANY URI", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE 'test' >= ANY URI", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE ANY URI IN ('test')", 0, false, "OBJECT_ID", new String(), false); + testQuery("SELECT URI FROM FOLDER_OBJECT_TYPE WHERE ANY URI NOT IN ('test')", 33, false, "OBJECT_ID", new String(), false); + } + + public void test_OBJECT_ID() + { + String companyHomeId = testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE NAME = '\"company home\"'", 1, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID = '" + companyHomeId + "'", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID <> '" + companyHomeId + "'", 32, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID < '" + companyHomeId + "'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID <= '" + companyHomeId + "'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID > '" + companyHomeId + "'", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID >= '" + companyHomeId + "'", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID IN ('" + companyHomeId + "')", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID NOT IN ('" + companyHomeId + "')", 32, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID LIKE '" + companyHomeId + "'", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID NOT LIKE '" + companyHomeId + "'", 32, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE IN_FOLDER('" + companyHomeId + "')", 4, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE IN_TREE ('" + companyHomeId + "')", 32, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID IS NOT NULL", 33, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE OBJECT_ID IS NULL", 0, false, "OBJECT_ID", new String(), false); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' = ANY OBJECT_ID", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' <> ANY OBJECT_ID", 32, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' < ANY OBJECT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' <= ANY OBJECT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' > ANY OBJECT_ID", 0, false, "OBJECT_ID", new String(), true); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE '" + companyHomeId + "' >= ANY OBJECT_ID", 0, false, "OBJECT_ID", new String(), true); + + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE ANY OBJECT_ID IN ('" + companyHomeId + "')", 1, false, "OBJECT_ID", new String(), false); + testQuery("SELECT OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE ANY OBJECT_ID NOT IN ('" + companyHomeId + "')", 32, false, "OBJECT_ID", new String(), false); + } + + public void testOrderBy() + { + + String query = "SELECT OBJECT_ID FROM DOCUMENT_OBJECT_TYPE ORDER OBJECT_ID"; + CMISResultSet rs = cmisQueryService.query(query); + // assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("OBJECT_ID") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT OBJECT_ID FROM DOCUMENT_OBJECT_TYPE ORDER OBJECT_ID ASC"; + rs = cmisQueryService.query(query); + // assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("OBJECT_ID") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT OBJECT_ID FROM DOCUMENT_OBJECT_TYPE ORDER OBJECT_ID DESC"; + rs = cmisQueryService.query(query); + // assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("OBJECT_ID") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT SCORE() AS MEEP, OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE NAME IN ('company', 'home') ORDER BY MEEP ASC"; + rs = cmisQueryService.query(query); + // assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("OBJECT_ID") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT SCORE() AS MEEP, OBJECT_ID FROM FOLDER_OBJECT_TYPE WHERE NAME IN ('company', 'home') ORDER BY MEEP DESC"; + rs = cmisQueryService.query(query); + // assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("OBJECT_ID") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + } + + public void testAllSimpleTextPredicates() + { + String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME = 'company'"; + CMISResultSet rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NOT NAME = 'company'"; + rs = cmisQueryService.query(query); + assertEquals(32, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND 'company' = ANY NAME"; + rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NOT NAME <> 'company'"; + rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME <> 'company'"; + rs = cmisQueryService.query(query); + assertEquals(32, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME < 'company'"; + rs = cmisQueryService.query(query); + assertEquals(6, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME <= 'company'"; + rs = cmisQueryService.query(query); + assertEquals(7, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME > 'company'"; + rs = cmisQueryService.query(query); + assertEquals(30, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME >= 'company'"; + rs = cmisQueryService.query(query); + assertEquals(30, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME IN ('company', 'home')"; + rs = cmisQueryService.query(query); + assertEquals(2, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME NOT IN ('company', 'home')"; + rs = cmisQueryService.query(query); + assertEquals(31, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND ANY NAME IN ('company', 'home')"; + rs = cmisQueryService.query(query); + assertEquals(2, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND ANY NAME NOT IN ('company', 'home')"; + rs = cmisQueryService.query(query); + assertEquals(31, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME LIKE 'company'"; + rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME LIKE 'com%'"; + rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME LIKE 'c_m_a_y'"; + rs = cmisQueryService.query(query); + assertEquals(1, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME NOT LIKE 'c_m_a_y'"; + rs = cmisQueryService.query(query); + assertEquals(32, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + } + public void testSimpleConjunction() { String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME = 'company'"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME = 'home'"; rs = cmisQueryService.query(query); - assertEquals(2, rs.length()); + assertEquals(2, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL AND NAME = 'home' AND NAME = 'company'"; rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; + rs = null; } - + public void testSimpleDisjunction() { String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME = 'guest'"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME = 'company'"; rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME = 'guest' OR NAME = 'company'"; rs = cmisQueryService.query(query); - assertEquals(2, rs.length()); + assertEquals(2, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - - + rs = null; + } - + public void testExists() { String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NOT NULL"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(33, rs.length()); + assertEquals(33, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME IS NULL"; rs = cmisQueryService.query(query); - assertEquals(0, rs.length()); + assertEquals(0, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - - + rs = null; + query = "SELECT * FROM DOCUMENT_OBJECT_TYPE WHERE URI IS NOT NULL"; rs = cmisQueryService.query(query); - assertEquals(0, rs.length()); + assertEquals(0, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; - + rs = null; + query = "SELECT * FROM DOCUMENT_OBJECT_TYPE WHERE URI IS NULL"; rs = cmisQueryService.query(query); - assertEquals(45, rs.length()); + assertEquals(45, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); - rs = null; + rs = null; } - + public void testObjectEquals() { - + } public void testDocumentEquals() { - + } public void testFolderEquals() @@ -170,7 +1486,7 @@ public class QueryTest extends BaseCMISTest String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME = '" + name + "'"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -180,7 +1496,7 @@ public class QueryTest extends BaseCMISTest query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE NAME = 'company'"; rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -190,17 +1506,17 @@ public class QueryTest extends BaseCMISTest query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE PARENT = '" + rootNode.toString() + "'"; rs = cmisQueryService.query(query); - assertEquals(4, rs.length()); + assertEquals(4, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); } rs.close(); rs = null; - + query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE ALLOWED_CHILD_OBJECT_TYPES = 'meep'"; rs = cmisQueryService.query(query); - assertEquals(0, rs.length()); + assertEquals(0, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -219,7 +1535,7 @@ public class QueryTest extends BaseCMISTest String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE IN_TREE('" + id + "')"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(32, rs.length()); + assertEquals(32, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -237,7 +1553,7 @@ public class QueryTest extends BaseCMISTest String query = "SELECT * FROM FOLDER_OBJECT_TYPE WHERE IN_FOLDER('" + id + "')"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(4, rs.length()); + assertEquals(4, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -249,7 +1565,7 @@ public class QueryTest extends BaseCMISTest { String query = "SELECT * FROM DOCUMENT_OBJECT_TYPE WHERE CONTAINS('\"Sample demonstrating the listing of AVM folder contents\"')"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(1, rs.length()); + assertEquals(1, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("NAME") + " Score " + row.getScore() + " " + row.getScores()); @@ -262,7 +1578,7 @@ public class QueryTest extends BaseCMISTest runAs("guest"); String query = "SELECT * FROM DOCUMENT_OBJECT_TYPE"; CMISResultSet rs = cmisQueryService.query(query); - assertEquals(2, rs.length()); + assertEquals(2, rs.getLength()); rs.close(); } diff --git a/source/java/org/alfresco/cmis/search/impl/CMISQueryParser.java b/source/java/org/alfresco/cmis/search/impl/CMISQueryParser.java index 6e33c1a01b..7c339cb6ff 100644 --- a/source/java/org/alfresco/cmis/search/impl/CMISQueryParser.java +++ b/source/java/org/alfresco/cmis/search/impl/CMISQueryParser.java @@ -221,7 +221,7 @@ public class CMISQueryParser { if (notNode.getType() == CMISParser.NEGATION) { - Constraint constraint = buildTest(notNode, factory, selectors, columns); + Constraint constraint = buildTest((CommonTree)notNode.getChild(0), factory, selectors, columns); return factory.createNegation(constraint); } else @@ -347,12 +347,15 @@ public class CMISQueryParser function = factory.getFunction(functionName); functionArguments = new LinkedHashMap(); argNode = (CommonTree) predicateNode.getChild(0); - arg = getFunctionArgument(argNode, function.getArgumentDefinition(In.ARG_PROPERTY), factory, selectors); + arg = getFunctionArgument(argNode, function.getArgumentDefinition(In.ARG_MODE), factory, selectors); functionArguments.put(arg.getName(), arg); argNode = (CommonTree) predicateNode.getChild(1); - arg = getFunctionArgument(argNode, function.getArgumentDefinition(In.ARG_COLLECTION), factory, selectors); + arg = getFunctionArgument(argNode, function.getArgumentDefinition(In.ARG_PROPERTY), factory, selectors); functionArguments.put(arg.getName(), arg); - arg = factory.createLiteralArgument(In.ARG_NOT, DataTypeDefinition.BOOLEAN, (predicateNode.getChildCount() > 2)); + argNode = (CommonTree) predicateNode.getChild(2); + arg = getFunctionArgument(argNode, function.getArgumentDefinition(In.ARG_LIST), factory, selectors); + functionArguments.put(arg.getName(), arg); + arg = factory.createLiteralArgument(In.ARG_NOT, DataTypeDefinition.BOOLEAN, (predicateNode.getChildCount() > 3)); functionArguments.put(arg.getName(), arg); return factory.createFunctionalConstraint(function, functionArguments); case CMISParser.PRED_LIKE: @@ -1031,6 +1034,10 @@ public class CMISQueryParser alias = singleTableNode.getChild(1).getText(); } QName classQName = cmisMapping.getAlfrescoClassQNameFromCmisTableName(tableName); + if(classQName == null) + { + throw new CMISQueryException("Type is unsupported in query "+tableName); + } return factory.createSelector(classQName, alias); } else diff --git a/source/java/org/alfresco/cmis/search/impl/CMISQueryServiceImpl.java b/source/java/org/alfresco/cmis/search/impl/CMISQueryServiceImpl.java index cca0d4aab2..6125ce9c90 100644 --- a/source/java/org/alfresco/cmis/search/impl/CMISQueryServiceImpl.java +++ b/source/java/org/alfresco/cmis/search/impl/CMISQueryServiceImpl.java @@ -165,7 +165,7 @@ public class CMISQueryServiceImpl implements CMISQueryService */ public FullTextSearchSupport getFullTextSearchSupport() { - return FullTextSearchSupport.FULL_TEXT_ONLY; + return FullTextSearchSupport.FULL_TEXT_AND_STRUCTURED; } /* diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java index 05688c08e6..63bfc85232 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java @@ -4313,23 +4313,39 @@ public class ADMLuceneTest extends TestCase assertEquals(1, results.length()); results.close(); - // Test ISNULL/ISNOTNULL + // Test ISNULL/ISUNSET/ISNOTNULL + sp = new SearchParameters(); + sp.addStore(rootNodeRef.getStoreRef()); + sp.setLanguage("lucene"); + sp.setQuery("ISUNSET:\"" + QName.createQName(TEST_NAMESPACE, "null").toString() + "\""); + results = searcher.query(sp); + assertEquals(1, results.length()); + results.close(); + sp = new SearchParameters(); sp.addStore(rootNodeRef.getStoreRef()); sp.setLanguage("lucene"); sp.setQuery("ISNULL:\"" + QName.createQName(TEST_NAMESPACE, "null").toString() + "\""); results = searcher.query(sp); - assertEquals(1, results.length()); + //assertEquals(62, results.length()); results.close(); sp = new SearchParameters(); sp.addStore(rootNodeRef.getStoreRef()); sp.setLanguage("lucene"); - sp.setQuery("ISNULL:\"" + QName.createQName(TEST_NAMESPACE, "path-ista").toString() + "\""); + sp.setQuery("ISUNSET:\"" + QName.createQName(TEST_NAMESPACE, "path-ista").toString() + "\""); results = searcher.query(sp); assertEquals(0, results.length()); results.close(); + + sp = new SearchParameters(); + sp.addStore(rootNodeRef.getStoreRef()); + sp.setLanguage("lucene"); + sp.setQuery("ISNULL:\"" + QName.createQName(TEST_NAMESPACE, "path-ista").toString() + "\""); + results = searcher.query(sp); + //assertEquals(61, results.length()); + results.close(); sp = new SearchParameters(); sp.addStore(rootNodeRef.getStoreRef()); @@ -4350,10 +4366,18 @@ public class ADMLuceneTest extends TestCase sp = new SearchParameters(); sp.addStore(rootNodeRef.getStoreRef()); sp.setLanguage("lucene"); - sp.setQuery("ISNULL:\"" + QName.createQName(TEST_NAMESPACE, "aspectProperty").toString() + "\""); + sp.setQuery("ISUNSET:\"" + QName.createQName(TEST_NAMESPACE, "aspectProperty").toString() + "\""); results = searcher.query(sp); assertEquals(1, results.length()); results.close(); + + sp = new SearchParameters(); + sp.addStore(rootNodeRef.getStoreRef()); + sp.setLanguage("lucene"); + sp.setQuery("ISNULL:\"" + QName.createQName(TEST_NAMESPACE, "aspectProperty").toString() + "\""); + results = searcher.query(sp); + //assertEquals(62, results.length()); + results.close(); sp = new SearchParameters(); sp.addStore(rootNodeRef.getStoreRef()); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java index 3c6ba0c1c5..8a5c3cd365 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneQueryParser.java @@ -58,6 +58,7 @@ import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; import org.alfresco.util.CachingDateFormat; +import org.alfresco.util.SearchLanguageConversion; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.analysis.Analyzer; @@ -68,6 +69,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.ConstantScoreRangeQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.MultiPhraseQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; @@ -137,7 +139,7 @@ public class LuceneQueryParser extends QueryParser this.config = config; } - private void setIndexReader(IndexReader indexReader) + public void setIndexReader(IndexReader indexReader) { this.indexReader = indexReader; } @@ -187,6 +189,29 @@ public class LuceneQueryParser extends QueryParser } + public Query getLikeQuery(String field, String sqlLikeClause) throws ParseException + { + String luceneWildCardExpression = SearchLanguageConversion.convertSQLLikeToLucene(sqlLikeClause); + return getFieldQuery(field, luceneWildCardExpression); + } + + public Query getDoesNotMatchFieldQuery(String field, String queryText) throws ParseException + { + BooleanQuery query = new BooleanQuery(); + Query allQuery = new MatchAllDocsQuery(); + Query matchQuery = getFieldQuery(field, queryText); + if ((matchQuery != null)) + { + query.add(allQuery, Occur.MUST); + query.add(matchQuery, Occur.MUST_NOT); + } + else + { + throw new UnsupportedOperationException(); + } + return query; + } + public Query getFieldQuery(String field, String queryText) throws ParseException { try @@ -495,7 +520,7 @@ public class LuceneQueryParser extends QueryParser } } - else if (field.equals("ISNULL")) + else if (field.equals("ISUNSET")) { String qnameString = expandFieldName(queryText); QName qname = QName.createQName(qnameString); @@ -520,6 +545,28 @@ public class LuceneQueryParser extends QueryParser return getFieldQueryImpl(field, queryText); } + } + else if (field.equals("ISNULL")) + { + String qnameString = expandFieldName(queryText); + QName qname = QName.createQName(qnameString); + PropertyDefinition pd = dictionaryService.getProperty(qname); + if (pd != null) + { + BooleanQuery query = new BooleanQuery(); + Query presenceQuery = getWildcardQuery("@" + qname.toString(), "*"); + if (presenceQuery != null) + { + query.add(new MatchAllDocsQuery(), Occur.MUST); + query.add(presenceQuery, Occur.MUST_NOT); + } + return query; + } + else + { + return getFieldQueryImpl(field, queryText); + } + } else if (field.equals("ISNOTNULL")) { @@ -536,7 +583,7 @@ public class LuceneQueryParser extends QueryParser Query presenceQuery = getWildcardQuery("@" + qname.toString(), "*"); if ((typeQuery != null) && (presenceQuery != null)) { - //query.add(typeQuery, Occur.MUST); + // query.add(typeQuery, Occur.MUST); query.add(presenceQuery, Occur.MUST); } return query; @@ -734,7 +781,7 @@ public class LuceneQueryParser extends QueryParser if (post.length() > 0) { // Add new token followed by * not given by the tokeniser - org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(post.toString(), index - post.length(), index, "ALPHANUM"); + org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(post.toString(), index + 1, index + 1 + post.length(), "ALPHANUM"); if (isMlText) { Locale locale = I18NUtil.parseLocale(localeString); @@ -1121,6 +1168,15 @@ public class LuceneQueryParser extends QueryParser * throw in overridden method to disallow */ protected Query getRangeQuery(String field, String part1, String part2, boolean inclusive) throws ParseException + { + return getRangeQuery(field, part1, part2, inclusive, inclusive); + } + + /** + * @exception ParseException + * throw in overridden method to disallow + */ + public Query getRangeQuery(String field, String part1, String part2, boolean includeLower, boolean includeUpper) throws ParseException { if (field.startsWith("@")) { @@ -1206,14 +1262,14 @@ public class LuceneQueryParser extends QueryParser } // Build a composite query for all the bits - Query rq = buildDateTimeRange(fieldName, start, end, inclusive); + Query rq = buildDateTimeRange(fieldName, start, end, includeLower, includeUpper); return rq; } else { String first = getToken(fieldName, part1); String last = getToken(fieldName, part2); - return new ConstantScoreRangeQuery(fieldName, first, last, inclusive, inclusive); + return new ConstantScoreRangeQuery(fieldName, first, last, includeLower, includeUpper); } } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT) @@ -1224,13 +1280,13 @@ public class LuceneQueryParser extends QueryParser part1 = part1.toLowerCase(); part2 = part2.toLowerCase(); } - return new ConstantScoreRangeQuery(fieldName, part1.equals("\u0000") ? null : part1, part2.equals("\uFFFF") ? null : part2, inclusive, inclusive); + return new ConstantScoreRangeQuery(fieldName, part1.equals("\u0000") ? null : part1, part2.equals("\uFFFF") ? null : part2, includeLower, includeUpper); } } String first = getToken(fieldName, part1); String last = getToken(fieldName, part2); - return new ConstantScoreRangeQuery(fieldName, first, last, inclusive, inclusive); + return new ConstantScoreRangeQuery(fieldName, first, last, includeLower, includeUpper); } else { @@ -1239,11 +1295,11 @@ public class LuceneQueryParser extends QueryParser part1 = part1.toLowerCase(); part2 = part2.toLowerCase(); } - return new ConstantScoreRangeQuery(field, part1, part2, inclusive, inclusive); + return new ConstantScoreRangeQuery(field, part1, part2, includeLower, includeUpper); } } - private Query buildDateTimeRange(String field, Calendar start, Calendar end, boolean inclusive) throws ParseException + private Query buildDateTimeRange(String field, Calendar start, Calendar end, boolean includeLower, boolean includeUpper) throws ParseException { BooleanQuery query = new BooleanQuery(); Query part; @@ -1273,7 +1329,7 @@ public class LuceneQueryParser extends QueryParser query.add(part, Occur.MUST); if (start.get(Calendar.MILLISECOND) == end.get(Calendar.MILLISECOND)) { - if (inclusive) + if (includeLower && includeUpper) { part = new TermQuery(new Term(field, build3SF("MS", start.get(Calendar.MILLISECOND)))); query.add(part, Occur.MUST); @@ -1287,7 +1343,7 @@ public class LuceneQueryParser extends QueryParser { // only ms part = new ConstantScoreRangeQuery(field, build3SF("MS", start.get(Calendar.MILLISECOND)), build3SF("MS", end.get(Calendar.MILLISECOND)), - inclusive, inclusive); + includeLower, includeUpper); query.add(part, Occur.MUST); } } @@ -1298,7 +1354,7 @@ public class LuceneQueryParser extends QueryParser BooleanQuery subQuery = new BooleanQuery(); Query subPart; - subPart = buildStart(field, start, inclusive, Calendar.SECOND, Calendar.MILLISECOND); + subPart = buildStart(field, start, includeLower, Calendar.SECOND, Calendar.MILLISECOND); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1310,7 +1366,7 @@ public class LuceneQueryParser extends QueryParser subQuery.add(subPart, Occur.SHOULD); } - subPart = buildEnd(field, end, inclusive, Calendar.SECOND, Calendar.MILLISECOND); + subPart = buildEnd(field, end, includeUpper, Calendar.SECOND, Calendar.MILLISECOND); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1332,7 +1388,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MILLISECOND, Calendar.SECOND }) { - subPart = buildStart(field, start, inclusive, Calendar.MINUTE, i); + subPart = buildStart(field, start, includeLower, Calendar.MINUTE, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1347,7 +1403,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.SECOND, Calendar.MILLISECOND }) { - subPart = buildEnd(field, end, inclusive, Calendar.MINUTE, i); + subPart = buildEnd(field, end, includeUpper, Calendar.MINUTE, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1369,7 +1425,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE }) { - subPart = buildStart(field, start, inclusive, Calendar.HOUR_OF_DAY, i); + subPart = buildStart(field, start, includeLower, Calendar.HOUR_OF_DAY, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1385,7 +1441,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND }) { - subPart = buildEnd(field, end, inclusive, Calendar.HOUR_OF_DAY, i); + subPart = buildEnd(field, end, includeUpper, Calendar.HOUR_OF_DAY, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1407,7 +1463,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY }) { - subPart = buildStart(field, start, inclusive, Calendar.DAY_OF_MONTH, i); + subPart = buildStart(field, start, includeLower, Calendar.DAY_OF_MONTH, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1422,7 +1478,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND }) { - subPart = buildEnd(field, end, inclusive, Calendar.DAY_OF_MONTH, i); + subPart = buildEnd(field, end, includeUpper, Calendar.DAY_OF_MONTH, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1445,7 +1501,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH }) { - subPart = buildStart(field, start, inclusive, Calendar.MONTH, i); + subPart = buildStart(field, start, includeLower, Calendar.MONTH, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1460,7 +1516,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND }) { - subPart = buildEnd(field, end, inclusive, Calendar.MONTH, i); + subPart = buildEnd(field, end, includeUpper, Calendar.MONTH, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1482,7 +1538,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH }) { - subPart = buildStart(field, start, inclusive, Calendar.YEAR, i); + subPart = buildStart(field, start, includeLower, Calendar.YEAR, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -1497,7 +1553,7 @@ public class LuceneQueryParser extends QueryParser for (int i : new int[] { Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND }) { - subPart = buildEnd(field, end, inclusive, Calendar.YEAR, i); + subPart = buildEnd(field, end, includeUpper, Calendar.YEAR, i); if (subPart != null) { subQuery.add(subPart, Occur.SHOULD); @@ -2354,7 +2410,7 @@ public class LuceneQueryParser extends QueryParser // start.set(Calendar.SECOND, start.getMinimum(Calendar.SECOND)); // start.set(Calendar.MILLISECOND, start.getMinimum(Calendar.MILLISECOND)); LuceneQueryParser lqp = new LuceneQueryParser(null, null); - query = lqp.buildDateTimeRange("TEST", start, end, false); + query = lqp.buildDateTimeRange("TEST", start, end, false, false); System.out.println("Query is " + query); } } diff --git a/source/java/org/alfresco/repo/search/impl/parsers/CMIS.g b/source/java/org/alfresco/repo/search/impl/parsers/CMIS.g index c7dfcfde2d..5d62be772a 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/CMIS.g +++ b/source/java/org/alfresco/repo/search/impl/parsers/CMIS.g @@ -502,22 +502,10 @@ keyWordOrId * Quoted strings take precedence */ -SINGLE_QUOTE - : '\''; -/* - * Fragments for quoted strings - */ - -fragment -ESCAPED_SINGLE_QUOTE - : '\'\''; - QUOTED_STRING - : SINGLE_QUOTE ( ~SINGLE_QUOTE | ESCAPED_SINGLE_QUOTE)* SINGLE_QUOTE + : '\'' ( ~'\'' | '\'\'')* '\'' ; - - SELECT : ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t'); AS : ('A'|'a')('S'|'s'); diff --git a/source/java/org/alfresco/repo/search/impl/parsers/CMIS.tokens b/source/java/org/alfresco/repo/search/impl/parsers/CMIS.tokens index 57a3e81d02..8d9f699690 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/CMIS.tokens +++ b/source/java/org/alfresco/repo/search/impl/parsers/CMIS.tokens @@ -1,6 +1,6 @@ FUNCTION=10 WHERE=44 -EXPONENT=82 +EXPONENT=80 PRED_FTS=22 STAR=30 INNER=39 @@ -11,7 +11,7 @@ PRED_COMPARISON=18 CONTAINS=58 TABLE=12 SOURCE=11 -DOTDOT=76 +DOTDOT=74 EQUALS=43 NOT=47 ID=67 @@ -19,42 +19,41 @@ AND=46 LPAREN=35 LESSTHANOREQUALS=51 AS=32 -SINGLE_QUOTE=74 RPAREN=36 -TILDA=77 +TILDA=75 PRED_LIKE=21 STRING_LITERAL=28 IN=53 -DECIMAL_NUMERAL=80 +DECIMAL_NUMERAL=78 FLOATING_POINT_LITERAL=69 COMMA=31 IS=55 LEFT=40 -SIGNED_INTEGER=87 +SIGNED_INTEGER=85 PARAMETER=14 COLUMN=6 -PLUS=78 +PLUS=76 QUOTED_STRING=66 -ZERO_DIGIT=84 -DIGIT=81 +ZERO_DIGIT=82 +DIGIT=79 DOT=34 COLUMN_REF=8 SELECT=29 LIKE=54 GREATERTHAN=50 DOTSTAR=33 -E=86 +E=84 OUTER=41 BY=62 LESSTHAN=49 -NON_ZERO_DIGIT=85 +NON_ZERO_DIGIT=83 ASC=63 QUALIFIER=9 CONJUNCTION=15 NULL=56 ON=42 NOTEQUALS=48 -MINUS=79 +MINUS=77 LIST=23 PRED_DESCENDANT=25 JOIN=38 @@ -63,7 +62,7 @@ COLON=65 GREATERTHANOREQUALS=52 DISJUNCTION=16 COLUMNS=7 -WS=83 +WS=81 ANY=57 SCORE=73 NEGATION=17 @@ -81,4 +80,3 @@ ALL_COLUMNS=5 FROM=37 UPPER=71 PRED_IN=19 -ESCAPED_SINGLE_QUOTE=75 diff --git a/source/java/org/alfresco/repo/search/impl/parsers/CMISLexer.java b/source/java/org/alfresco/repo/search/impl/parsers/CMISLexer.java index 1bb5c30540..a680128a41 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/CMISLexer.java +++ b/source/java/org/alfresco/repo/search/impl/parsers/CMISLexer.java @@ -1,4 +1,4 @@ -// $ANTLR 3.1b1 W:\\workspace-cmis2\\ANTLR\\CMIS.g 2008-07-29 14:25:59 +// $ANTLR 3.1b1 W:\\workspace-cmis2\\ANTLR\\CMIS.g 2008-08-07 14:37:14 package org.alfresco.repo.search.impl.parsers; import org.antlr.runtime.*; @@ -9,7 +9,7 @@ import java.util.ArrayList; public class CMISLexer extends Lexer { public static final int FUNCTION=10; public static final int WHERE=44; - public static final int EXPONENT=82; + public static final int EXPONENT=80; public static final int PRED_FTS=22; public static final int STAR=30; public static final int INNER=39; @@ -21,7 +21,7 @@ public class CMISLexer extends Lexer { public static final int TABLE=12; public static final int SOURCE=11; public static final int EQUALS=43; - public static final int DOTDOT=76; + public static final int DOTDOT=74; public static final int NOT=47; public static final int ID=67; public static final int AND=46; @@ -29,24 +29,23 @@ public class CMISLexer extends Lexer { public static final int LPAREN=35; public static final int LESSTHANOREQUALS=51; public static final int AS=32; - public static final int SINGLE_QUOTE=74; public static final int RPAREN=36; - public static final int TILDA=77; + public static final int TILDA=75; public static final int PRED_LIKE=21; public static final int STRING_LITERAL=28; public static final int IN=53; - public static final int DECIMAL_NUMERAL=80; + public static final int DECIMAL_NUMERAL=78; public static final int FLOATING_POINT_LITERAL=69; public static final int COMMA=31; public static final int IS=55; public static final int LEFT=40; - public static final int SIGNED_INTEGER=87; + public static final int SIGNED_INTEGER=85; public static final int PARAMETER=14; public static final int COLUMN=6; - public static final int PLUS=78; + public static final int PLUS=76; public static final int QUOTED_STRING=66; - public static final int ZERO_DIGIT=84; - public static final int DIGIT=81; + public static final int ZERO_DIGIT=82; + public static final int DIGIT=79; public static final int DOT=34; public static final int COLUMN_REF=8; public static final int SELECT=29; @@ -54,17 +53,17 @@ public class CMISLexer extends Lexer { public static final int DOTSTAR=33; public static final int GREATERTHAN=50; public static final int OUTER=41; - public static final int E=86; + public static final int E=84; public static final int LESSTHAN=49; public static final int BY=62; public static final int ASC=63; - public static final int NON_ZERO_DIGIT=85; + public static final int NON_ZERO_DIGIT=83; public static final int QUALIFIER=9; public static final int CONJUNCTION=15; public static final int NULL=56; public static final int ON=42; public static final int NOTEQUALS=48; - public static final int MINUS=79; + public static final int MINUS=77; public static final int LIST=23; public static final int PRED_DESCENDANT=25; public static final int JOIN=38; @@ -74,7 +73,7 @@ public class CMISLexer extends Lexer { public static final int COLUMNS=7; public static final int DISJUNCTION=16; public static final int ANY=57; - public static final int WS=83; + public static final int WS=81; public static final int SCORE=73; public static final int NEGATION=17; public static final int TABLE_REF=13; @@ -91,7 +90,6 @@ public class CMISLexer extends Lexer { public static final int FROM=37; public static final int UPPER=71; public static final int PRED_IN=19; - public static final int ESCAPED_SINGLE_QUOTE=75; // delegates // delegators @@ -106,53 +104,16 @@ public class CMISLexer extends Lexer { } public String getGrammarFileName() { return "W:\\workspace-cmis2\\ANTLR\\CMIS.g"; } - // $ANTLR start SINGLE_QUOTE - public final void mSINGLE_QUOTE() throws RecognitionException { - try { - int _type = SINGLE_QUOTE; - int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:506:9: ( '\\'' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:506:17: '\\'' - { - match('\''); - - } - - state.type = _type; - state.channel = _channel; - } - finally { - } - } - // $ANTLR end SINGLE_QUOTE - - // $ANTLR start ESCAPED_SINGLE_QUOTE - public final void mESCAPED_SINGLE_QUOTE() throws RecognitionException { - try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:514:9: ( '\\'\\'' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:514:17: '\\'\\'' - { - match("\'\'"); - - - } - - } - finally { - } - } - // $ANTLR end ESCAPED_SINGLE_QUOTE - // $ANTLR start QUOTED_STRING public final void mQUOTED_STRING() throws RecognitionException { try { int _type = QUOTED_STRING; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:5: ( SINGLE_QUOTE (~ SINGLE_QUOTE | ESCAPED_SINGLE_QUOTE )* SINGLE_QUOTE ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:9: SINGLE_QUOTE (~ SINGLE_QUOTE | ESCAPED_SINGLE_QUOTE )* SINGLE_QUOTE + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:507:5: ( '\\'' (~ '\\'' | '\\'\\'' )* '\\'' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:507:9: '\\'' (~ '\\'' | '\\'\\'' )* '\\'' { - mSINGLE_QUOTE(); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:22: (~ SINGLE_QUOTE | ESCAPED_SINGLE_QUOTE )* + match('\''); + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:507:14: (~ '\\'' | '\\'\\'' )* loop1: do { int alt1=3; @@ -174,9 +135,9 @@ public class CMISLexer extends Lexer { switch (alt1) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:24: ~ SINGLE_QUOTE + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:507:16: ~ '\\'' { - if ( (input.LA(1)>='\u0000' && input.LA(1)<='I')||(input.LA(1)>='K' && input.LA(1)<='\uFFFE') ) { + if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='\uFFFE') ) { input.consume(); } @@ -189,9 +150,10 @@ public class CMISLexer extends Lexer { } break; case 2 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:40: ESCAPED_SINGLE_QUOTE + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:507:24: '\\'\\'' { - mESCAPED_SINGLE_QUOTE(); + match("\'\'"); + } break; @@ -201,7 +163,7 @@ public class CMISLexer extends Lexer { } } while (true); - mSINGLE_QUOTE(); + match('\''); } @@ -218,8 +180,8 @@ public class CMISLexer extends Lexer { try { int _type = SELECT; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:522:8: ( ( 'S' | 's' ) ( 'E' | 'e' ) ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'C' | 'c' ) ( 'T' | 't' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:522:10: ( 'S' | 's' ) ( 'E' | 'e' ) ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'C' | 'c' ) ( 'T' | 't' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:510:8: ( ( 'S' | 's' ) ( 'E' | 'e' ) ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'C' | 'c' ) ( 'T' | 't' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:510:10: ( 'S' | 's' ) ( 'E' | 'e' ) ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'C' | 'c' ) ( 'T' | 't' ) { if ( input.LA(1)=='S'||input.LA(1)=='s' ) { input.consume(); @@ -291,8 +253,8 @@ public class CMISLexer extends Lexer { try { int _type = AS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:523:4: ( ( 'A' | 'a' ) ( 'S' | 's' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:523:6: ( 'A' | 'a' ) ( 'S' | 's' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:511:4: ( ( 'A' | 'a' ) ( 'S' | 's' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:511:6: ( 'A' | 'a' ) ( 'S' | 's' ) { if ( input.LA(1)=='A'||input.LA(1)=='a' ) { input.consume(); @@ -328,8 +290,8 @@ public class CMISLexer extends Lexer { try { int _type = UPPER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:524:7: ( ( 'U' | 'u' ) ( 'P' | 'p' ) ( 'P' | 'p' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:524:9: ( 'U' | 'u' ) ( 'P' | 'p' ) ( 'P' | 'p' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:512:7: ( ( 'U' | 'u' ) ( 'P' | 'p' ) ( 'P' | 'p' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:512:9: ( 'U' | 'u' ) ( 'P' | 'p' ) ( 'P' | 'p' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='U'||input.LA(1)=='u' ) { input.consume(); @@ -392,8 +354,8 @@ public class CMISLexer extends Lexer { try { int _type = LOWER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:525:7: ( ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'W' | 'w' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:525:9: ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'W' | 'w' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:513:7: ( ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'W' | 'w' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:513:9: ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'W' | 'w' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='L'||input.LA(1)=='l' ) { input.consume(); @@ -456,8 +418,8 @@ public class CMISLexer extends Lexer { try { int _type = FROM; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:526:6: ( ( 'F' | 'f' ) ( 'R' | 'r' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:526:8: ( 'F' | 'f' ) ( 'R' | 'r' ) ( 'O' | 'o' ) ( 'M' | 'm' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:514:6: ( ( 'F' | 'f' ) ( 'R' | 'r' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:514:8: ( 'F' | 'f' ) ( 'R' | 'r' ) ( 'O' | 'o' ) ( 'M' | 'm' ) { if ( input.LA(1)=='F'||input.LA(1)=='f' ) { input.consume(); @@ -511,8 +473,8 @@ public class CMISLexer extends Lexer { try { int _type = JOIN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:527:6: ( ( 'J' | 'j' ) ( 'O' | 'o' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:527:8: ( 'J' | 'j' ) ( 'O' | 'o' ) ( 'I' | 'i' ) ( 'N' | 'n' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:515:6: ( ( 'J' | 'j' ) ( 'O' | 'o' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:515:8: ( 'J' | 'j' ) ( 'O' | 'o' ) ( 'I' | 'i' ) ( 'N' | 'n' ) { if ( input.LA(1)=='J'||input.LA(1)=='j' ) { input.consume(); @@ -566,8 +528,8 @@ public class CMISLexer extends Lexer { try { int _type = INNER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:528:7: ( ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'N' | 'n' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:528:9: ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'N' | 'n' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:516:7: ( ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'N' | 'n' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:516:9: ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'N' | 'n' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='I'||input.LA(1)=='i' ) { input.consume(); @@ -630,8 +592,8 @@ public class CMISLexer extends Lexer { try { int _type = LEFT; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:529:6: ( ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'F' | 'f' ) ( 'T' | 't' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:529:8: ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'F' | 'f' ) ( 'T' | 't' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:6: ( ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'F' | 'f' ) ( 'T' | 't' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:517:8: ( 'L' | 'l' ) ( 'E' | 'e' ) ( 'F' | 'f' ) ( 'T' | 't' ) { if ( input.LA(1)=='L'||input.LA(1)=='l' ) { input.consume(); @@ -685,8 +647,8 @@ public class CMISLexer extends Lexer { try { int _type = OUTER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:530:7: ( ( 'O' | 'o' ) ( 'U' | 'u' ) ( 'T' | 't' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:530:9: ( 'O' | 'o' ) ( 'U' | 'u' ) ( 'T' | 't' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:518:7: ( ( 'O' | 'o' ) ( 'U' | 'u' ) ( 'T' | 't' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:518:9: ( 'O' | 'o' ) ( 'U' | 'u' ) ( 'T' | 't' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='O'||input.LA(1)=='o' ) { input.consume(); @@ -749,8 +711,8 @@ public class CMISLexer extends Lexer { try { int _type = ON; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:531:4: ( ( 'O' | 'o' ) ( 'N' | 'n' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:531:6: ( 'O' | 'o' ) ( 'N' | 'n' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:519:4: ( ( 'O' | 'o' ) ( 'N' | 'n' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:519:6: ( 'O' | 'o' ) ( 'N' | 'n' ) { if ( input.LA(1)=='O'||input.LA(1)=='o' ) { input.consume(); @@ -786,8 +748,8 @@ public class CMISLexer extends Lexer { try { int _type = WHERE; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:532:7: ( ( 'W' | 'w' ) ( 'H' | 'h' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:532:9: ( 'W' | 'w' ) ( 'H' | 'h' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ( 'E' | 'e' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:520:7: ( ( 'W' | 'w' ) ( 'H' | 'h' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:520:9: ( 'W' | 'w' ) ( 'H' | 'h' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ( 'E' | 'e' ) { if ( input.LA(1)=='W'||input.LA(1)=='w' ) { input.consume(); @@ -850,8 +812,8 @@ public class CMISLexer extends Lexer { try { int _type = OR; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:533:4: ( ( 'O' | 'o' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:533:6: ( 'O' | 'o' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:521:4: ( ( 'O' | 'o' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:521:6: ( 'O' | 'o' ) ( 'R' | 'r' ) { if ( input.LA(1)=='O'||input.LA(1)=='o' ) { input.consume(); @@ -887,8 +849,8 @@ public class CMISLexer extends Lexer { try { int _type = AND; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:534:5: ( ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'D' | 'd' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:534:7: ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'D' | 'd' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:522:5: ( ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'D' | 'd' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:522:7: ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'D' | 'd' ) { if ( input.LA(1)=='A'||input.LA(1)=='a' ) { input.consume(); @@ -933,8 +895,8 @@ public class CMISLexer extends Lexer { try { int _type = NOT; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:535:5: ( ( 'N' | 'n' ) ( 'O' | 'o' ) ( 'T' | 't' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:535:7: ( 'N' | 'n' ) ( 'O' | 'o' ) ( 'T' | 't' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:523:5: ( ( 'N' | 'n' ) ( 'O' | 'o' ) ( 'T' | 't' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:523:7: ( 'N' | 'n' ) ( 'O' | 'o' ) ( 'T' | 't' ) { if ( input.LA(1)=='N'||input.LA(1)=='n' ) { input.consume(); @@ -979,8 +941,8 @@ public class CMISLexer extends Lexer { try { int _type = IN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:536:4: ( ( 'I' | 'i' ) ( 'N' | 'n' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:536:6: ( 'I' | 'i' ) ( 'N' | 'n' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:524:4: ( ( 'I' | 'i' ) ( 'N' | 'n' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:524:6: ( 'I' | 'i' ) ( 'N' | 'n' ) { if ( input.LA(1)=='I'||input.LA(1)=='i' ) { input.consume(); @@ -1016,8 +978,8 @@ public class CMISLexer extends Lexer { try { int _type = LIKE; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:537:6: ( ( 'L' | 'l' ) ( 'I' | 'i' ) ( 'K' | 'k' ) ( 'E' | 'e' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:537:8: ( 'L' | 'l' ) ( 'I' | 'i' ) ( 'K' | 'k' ) ( 'E' | 'e' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:525:6: ( ( 'L' | 'l' ) ( 'I' | 'i' ) ( 'K' | 'k' ) ( 'E' | 'e' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:525:8: ( 'L' | 'l' ) ( 'I' | 'i' ) ( 'K' | 'k' ) ( 'E' | 'e' ) { if ( input.LA(1)=='L'||input.LA(1)=='l' ) { input.consume(); @@ -1071,8 +1033,8 @@ public class CMISLexer extends Lexer { try { int _type = IS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:538:4: ( ( 'I' | 'i' ) ( 'S' | 's' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:538:6: ( 'I' | 'i' ) ( 'S' | 's' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:526:4: ( ( 'I' | 'i' ) ( 'S' | 's' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:526:6: ( 'I' | 'i' ) ( 'S' | 's' ) { if ( input.LA(1)=='I'||input.LA(1)=='i' ) { input.consume(); @@ -1108,8 +1070,8 @@ public class CMISLexer extends Lexer { try { int _type = NULL; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:539:6: ( ( 'N' | 'n' ) ( 'U' | 'u' ) ( 'L' | 'l' ) ( 'L' | 'l' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:539:8: ( 'N' | 'n' ) ( 'U' | 'u' ) ( 'L' | 'l' ) ( 'L' | 'l' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:527:6: ( ( 'N' | 'n' ) ( 'U' | 'u' ) ( 'L' | 'l' ) ( 'L' | 'l' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:527:8: ( 'N' | 'n' ) ( 'U' | 'u' ) ( 'L' | 'l' ) ( 'L' | 'l' ) { if ( input.LA(1)=='N'||input.LA(1)=='n' ) { input.consume(); @@ -1163,8 +1125,8 @@ public class CMISLexer extends Lexer { try { int _type = ANY; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:540:5: ( ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'Y' | 'y' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:540:7: ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'Y' | 'y' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:528:5: ( ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'Y' | 'y' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:528:7: ( 'A' | 'a' ) ( 'N' | 'n' ) ( 'Y' | 'y' ) { if ( input.LA(1)=='A'||input.LA(1)=='a' ) { input.consume(); @@ -1209,8 +1171,8 @@ public class CMISLexer extends Lexer { try { int _type = CONTAINS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:541:9: ( ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'N' | 'n' ) ( 'T' | 't' ) ( 'A' | 'a' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'S' | 's' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:541:11: ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'N' | 'n' ) ( 'T' | 't' ) ( 'A' | 'a' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'S' | 's' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:529:9: ( ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'N' | 'n' ) ( 'T' | 't' ) ( 'A' | 'a' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'S' | 's' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:529:11: ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'N' | 'n' ) ( 'T' | 't' ) ( 'A' | 'a' ) ( 'I' | 'i' ) ( 'N' | 'n' ) ( 'S' | 's' ) { if ( input.LA(1)=='C'||input.LA(1)=='c' ) { input.consume(); @@ -1300,8 +1262,8 @@ public class CMISLexer extends Lexer { try { int _type = IN_FOLDER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:543:2: ( ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'F' | 'f' ) ( 'O' | 'o' ) ( 'L' | 'l' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:543:4: ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'F' | 'f' ) ( 'O' | 'o' ) ( 'L' | 'l' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:531:2: ( ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'F' | 'f' ) ( 'O' | 'o' ) ( 'L' | 'l' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:531:4: ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'F' | 'f' ) ( 'O' | 'o' ) ( 'L' | 'l' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='I'||input.LA(1)=='i' ) { input.consume(); @@ -1392,8 +1354,8 @@ public class CMISLexer extends Lexer { try { int _type = IN_TREE; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:544:9: ( ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'T' | 't' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ( 'E' | 'e' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:544:11: ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'T' | 't' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ( 'E' | 'e' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:532:9: ( ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'T' | 't' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ( 'E' | 'e' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:532:11: ( 'I' | 'i' ) ( 'N' | 'n' ) '_' ( 'T' | 't' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ( 'E' | 'e' ) { if ( input.LA(1)=='I'||input.LA(1)=='i' ) { input.consume(); @@ -1466,8 +1428,8 @@ public class CMISLexer extends Lexer { try { int _type = ORDER; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:545:7: ( ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:545:9: ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:533:7: ( ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:533:9: ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'R' | 'r' ) { if ( input.LA(1)=='O'||input.LA(1)=='o' ) { input.consume(); @@ -1530,8 +1492,8 @@ public class CMISLexer extends Lexer { try { int _type = BY; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:546:4: ( ( 'B' | 'b' ) ( 'Y' | 'y' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:546:6: ( 'B' | 'b' ) ( 'Y' | 'y' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:534:4: ( ( 'B' | 'b' ) ( 'Y' | 'y' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:534:6: ( 'B' | 'b' ) ( 'Y' | 'y' ) { if ( input.LA(1)=='B'||input.LA(1)=='b' ) { input.consume(); @@ -1567,8 +1529,8 @@ public class CMISLexer extends Lexer { try { int _type = ASC; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:547:5: ( ( 'A' | 'a' ) ( 'S' | 's' ) ( 'C' | 'c' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:547:7: ( 'A' | 'a' ) ( 'S' | 's' ) ( 'C' | 'c' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:535:5: ( ( 'A' | 'a' ) ( 'S' | 's' ) ( 'C' | 'c' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:535:7: ( 'A' | 'a' ) ( 'S' | 's' ) ( 'C' | 'c' ) { if ( input.LA(1)=='A'||input.LA(1)=='a' ) { input.consume(); @@ -1613,8 +1575,8 @@ public class CMISLexer extends Lexer { try { int _type = DESC; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:548:6: ( ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'S' | 's' ) ( 'C' | 'c' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:548:8: ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'S' | 's' ) ( 'C' | 'c' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:536:6: ( ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'S' | 's' ) ( 'C' | 'c' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:536:8: ( 'D' | 'd' ) ( 'E' | 'e' ) ( 'S' | 's' ) ( 'C' | 'c' ) { if ( input.LA(1)=='D'||input.LA(1)=='d' ) { input.consume(); @@ -1668,8 +1630,8 @@ public class CMISLexer extends Lexer { try { int _type = SCORE; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:549:7: ( ( 'S' | 's' ) ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:549:9: ( 'S' | 's' ) ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'E' | 'e' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:537:7: ( ( 'S' | 's' ) ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'E' | 'e' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:537:9: ( 'S' | 's' ) ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'E' | 'e' ) { if ( input.LA(1)=='S'||input.LA(1)=='s' ) { input.consume(); @@ -1732,8 +1694,8 @@ public class CMISLexer extends Lexer { try { int _type = LPAREN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:550:8: ( '(' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:550:10: '(' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:538:8: ( '(' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:538:10: '(' { match('('); @@ -1752,8 +1714,8 @@ public class CMISLexer extends Lexer { try { int _type = RPAREN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:551:8: ( ')' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:551:10: ')' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:539:8: ( ')' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:539:10: ')' { match(')'); @@ -1772,8 +1734,8 @@ public class CMISLexer extends Lexer { try { int _type = STAR; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:552:6: ( '*' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:552:8: '*' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:540:6: ( '*' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:540:8: '*' { match('*'); @@ -1792,8 +1754,8 @@ public class CMISLexer extends Lexer { try { int _type = COMMA; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:553:7: ( ',' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:553:9: ',' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:541:7: ( ',' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:541:9: ',' { match(','); @@ -1812,8 +1774,8 @@ public class CMISLexer extends Lexer { try { int _type = DOTSTAR; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:554:9: ( '.*' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:554:11: '.*' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:542:9: ( '.*' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:542:11: '.*' { match(".*"); @@ -1833,8 +1795,8 @@ public class CMISLexer extends Lexer { try { int _type = DOT; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:555:5: ( '.' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:555:7: '.' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:543:5: ( '.' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:543:7: '.' { match('.'); @@ -1853,8 +1815,8 @@ public class CMISLexer extends Lexer { try { int _type = DOTDOT; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:556:8: ( '..' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:556:10: '..' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:544:8: ( '..' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:544:10: '..' { match(".."); @@ -1874,8 +1836,8 @@ public class CMISLexer extends Lexer { try { int _type = EQUALS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:557:9: ( '=' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:557:11: '=' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:545:9: ( '=' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:545:11: '=' { match('='); @@ -1894,8 +1856,8 @@ public class CMISLexer extends Lexer { try { int _type = TILDA; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:558:7: ( '~' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:558:9: '~' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:546:7: ( '~' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:546:9: '~' { match('~'); @@ -1914,8 +1876,8 @@ public class CMISLexer extends Lexer { try { int _type = NOTEQUALS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:560:2: ( '<>' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:560:4: '<>' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:548:2: ( '<>' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:548:4: '<>' { match("<>"); @@ -1935,8 +1897,8 @@ public class CMISLexer extends Lexer { try { int _type = GREATERTHAN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:562:2: ( '>' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:562:4: '>' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:550:2: ( '>' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:550:4: '>' { match('>'); @@ -1955,8 +1917,8 @@ public class CMISLexer extends Lexer { try { int _type = LESSTHAN; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:564:2: ( '<' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:564:4: '<' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:552:2: ( '<' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:552:4: '<' { match('<'); @@ -1975,8 +1937,8 @@ public class CMISLexer extends Lexer { try { int _type = GREATERTHANOREQUALS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:566:2: ( '>=' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:566:4: '>=' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:554:2: ( '>=' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:554:4: '>=' { match(">="); @@ -1996,8 +1958,8 @@ public class CMISLexer extends Lexer { try { int _type = LESSTHANOREQUALS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:568:2: ( '<=' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:568:4: '<=' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:556:2: ( '<=' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:556:4: '<=' { match("<="); @@ -2017,8 +1979,8 @@ public class CMISLexer extends Lexer { try { int _type = COLON; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:569:7: ( ':' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:569:9: ':' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:557:7: ( ':' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:557:9: ':' { match(':'); @@ -2037,8 +1999,8 @@ public class CMISLexer extends Lexer { try { int _type = DOUBLE_QUOTE; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:572:2: ( '\"' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:572:4: '\"' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:560:2: ( '\"' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:560:4: '\"' { match('\"'); @@ -2057,10 +2019,10 @@ public class CMISLexer extends Lexer { try { int _type = DECIMAL_INTEGER_LITERAL; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:580:9: ( ( PLUS | MINUS )? DECIMAL_NUMERAL ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:580:11: ( PLUS | MINUS )? DECIMAL_NUMERAL + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:568:9: ( ( PLUS | MINUS )? DECIMAL_NUMERAL ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:568:11: ( PLUS | MINUS )? DECIMAL_NUMERAL { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:580:11: ( PLUS | MINUS )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:568:11: ( PLUS | MINUS )? int alt2=2; int LA2_0 = input.LA(1); @@ -2103,14 +2065,14 @@ public class CMISLexer extends Lexer { try { int _type = FLOATING_POINT_LITERAL; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:2: ( ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | DOT ( DIGIT )+ ( EXPONENT )? | ( DIGIT )+ EXPONENT ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:2: ( ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | DOT ( DIGIT )+ ( EXPONENT )? | ( DIGIT )+ EXPONENT ) int alt9=3; alt9 = dfa9.predict(input); switch (alt9) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:4: ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:4: ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:4: ( DIGIT )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:4: ( DIGIT )+ int cnt3=0; loop3: do { @@ -2124,7 +2086,7 @@ public class CMISLexer extends Lexer { switch (alt3) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:4: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:4: DIGIT { mDIGIT(); @@ -2141,7 +2103,7 @@ public class CMISLexer extends Lexer { } while (true); mDOT(); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:15: ( DIGIT )* + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:15: ( DIGIT )* loop4: do { int alt4=2; @@ -2154,7 +2116,7 @@ public class CMISLexer extends Lexer { switch (alt4) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:15: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:15: DIGIT { mDIGIT(); @@ -2166,7 +2128,7 @@ public class CMISLexer extends Lexer { } } while (true); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:22: ( EXPONENT )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:22: ( EXPONENT )? int alt5=2; int LA5_0 = input.LA(1); @@ -2175,7 +2137,7 @@ public class CMISLexer extends Lexer { } switch (alt5) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:587:22: EXPONENT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:575:22: EXPONENT { mEXPONENT(); @@ -2188,10 +2150,10 @@ public class CMISLexer extends Lexer { } break; case 2 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:588:4: DOT ( DIGIT )+ ( EXPONENT )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:576:4: DOT ( DIGIT )+ ( EXPONENT )? { mDOT(); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:588:8: ( DIGIT )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:576:8: ( DIGIT )+ int cnt6=0; loop6: do { @@ -2205,7 +2167,7 @@ public class CMISLexer extends Lexer { switch (alt6) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:588:8: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:576:8: DIGIT { mDIGIT(); @@ -2221,7 +2183,7 @@ public class CMISLexer extends Lexer { cnt6++; } while (true); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:588:15: ( EXPONENT )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:576:15: ( EXPONENT )? int alt7=2; int LA7_0 = input.LA(1); @@ -2230,7 +2192,7 @@ public class CMISLexer extends Lexer { } switch (alt7) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:588:15: EXPONENT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:576:15: EXPONENT { mEXPONENT(); @@ -2243,9 +2205,9 @@ public class CMISLexer extends Lexer { } break; case 3 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:589:4: ( DIGIT )+ EXPONENT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:577:4: ( DIGIT )+ EXPONENT { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:589:4: ( DIGIT )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:577:4: ( DIGIT )+ int cnt8=0; loop8: do { @@ -2259,7 +2221,7 @@ public class CMISLexer extends Lexer { switch (alt8) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:589:4: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:577:4: DIGIT { mDIGIT(); @@ -2294,8 +2256,8 @@ public class CMISLexer extends Lexer { try { int _type = ID; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:593:4: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:593:6: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:581:4: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:581:6: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* { if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) { input.consume(); @@ -2306,7 +2268,7 @@ public class CMISLexer extends Lexer { recover(mse); throw mse;} - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:593:29: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:581:29: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '0' | '_' | '$' | '#' )* loop10: do { int alt10=2; @@ -2355,10 +2317,10 @@ public class CMISLexer extends Lexer { try { int _type = WS; int _channel = DEFAULT_TOKEN_CHANNEL; - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:594:4: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:594:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:582:4: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:582:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:594:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:582:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ int cnt11=0; loop11: do { @@ -2411,7 +2373,7 @@ public class CMISLexer extends Lexer { // $ANTLR start DECIMAL_NUMERAL public final void mDECIMAL_NUMERAL() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:603:2: ( ZERO_DIGIT | NON_ZERO_DIGIT ( DIGIT )* ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:591:2: ( ZERO_DIGIT | NON_ZERO_DIGIT ( DIGIT )* ) int alt13=2; int LA13_0 = input.LA(1); @@ -2429,17 +2391,17 @@ public class CMISLexer extends Lexer { } switch (alt13) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:603:4: ZERO_DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:591:4: ZERO_DIGIT { mZERO_DIGIT(); } break; case 2 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:604:4: NON_ZERO_DIGIT ( DIGIT )* + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:592:4: NON_ZERO_DIGIT ( DIGIT )* { mNON_ZERO_DIGIT(); - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:604:19: ( DIGIT )* + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:592:19: ( DIGIT )* loop12: do { int alt12=2; @@ -2452,7 +2414,7 @@ public class CMISLexer extends Lexer { switch (alt12) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:604:19: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:592:19: DIGIT { mDIGIT(); @@ -2478,7 +2440,7 @@ public class CMISLexer extends Lexer { // $ANTLR start DIGIT public final void mDIGIT() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:607:7: ( ZERO_DIGIT | NON_ZERO_DIGIT ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:595:7: ( ZERO_DIGIT | NON_ZERO_DIGIT ) // W:\\workspace-cmis2\\ANTLR\\CMIS.g: { if ( (input.LA(1)>='0' && input.LA(1)<='9') ) { @@ -2502,8 +2464,8 @@ public class CMISLexer extends Lexer { // $ANTLR start ZERO_DIGIT public final void mZERO_DIGIT() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:610:2: ( '0' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:610:4: '0' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:598:2: ( '0' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:598:4: '0' { match('0'); @@ -2518,8 +2480,8 @@ public class CMISLexer extends Lexer { // $ANTLR start NON_ZERO_DIGIT public final void mNON_ZERO_DIGIT() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:613:2: ( '1' .. '9' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:613:4: '1' .. '9' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:601:2: ( '1' .. '9' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:601:4: '1' .. '9' { matchRange('1','9'); @@ -2534,8 +2496,8 @@ public class CMISLexer extends Lexer { // $ANTLR start PLUS public final void mPLUS() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:615:6: ( '+' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:615:8: '+' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:603:6: ( '+' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:603:8: '+' { match('+'); @@ -2550,8 +2512,8 @@ public class CMISLexer extends Lexer { // $ANTLR start MINUS public final void mMINUS() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:617:7: ( '-' ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:617:9: '-' + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:605:7: ( '-' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:605:9: '-' { match('-'); @@ -2566,8 +2528,8 @@ public class CMISLexer extends Lexer { // $ANTLR start E public final void mE() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:620:3: ( ( 'e' | 'E' ) ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:620:5: ( 'e' | 'E' ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:608:3: ( ( 'e' | 'E' ) ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:608:5: ( 'e' | 'E' ) { if ( input.LA(1)=='E'||input.LA(1)=='e' ) { input.consume(); @@ -2590,8 +2552,8 @@ public class CMISLexer extends Lexer { // $ANTLR start EXPONENT public final void mEXPONENT() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:631:2: ( E SIGNED_INTEGER ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:631:4: E SIGNED_INTEGER + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:619:2: ( E SIGNED_INTEGER ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:619:4: E SIGNED_INTEGER { mE(); mSIGNED_INTEGER(); @@ -2607,10 +2569,10 @@ public class CMISLexer extends Lexer { // $ANTLR start SIGNED_INTEGER public final void mSIGNED_INTEGER() throws RecognitionException { try { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:635:2: ( ( PLUS | MINUS )? ( DIGIT )+ ) - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:635:4: ( PLUS | MINUS )? ( DIGIT )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:623:2: ( ( PLUS | MINUS )? ( DIGIT )+ ) + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:623:4: ( PLUS | MINUS )? ( DIGIT )+ { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:635:4: ( PLUS | MINUS )? + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:623:4: ( PLUS | MINUS )? int alt14=2; int LA14_0 = input.LA(1); @@ -2636,7 +2598,7 @@ public class CMISLexer extends Lexer { } - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:635:20: ( DIGIT )+ + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:623:20: ( DIGIT )+ int cnt15=0; loop15: do { @@ -2650,7 +2612,7 @@ public class CMISLexer extends Lexer { switch (alt15) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:635:20: DIGIT + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:623:20: DIGIT { mDIGIT(); @@ -2676,348 +2638,341 @@ public class CMISLexer extends Lexer { // $ANTLR end SIGNED_INTEGER public void mTokens() throws RecognitionException { - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:8: ( SINGLE_QUOTE | QUOTED_STRING | SELECT | AS | UPPER | LOWER | FROM | JOIN | INNER | LEFT | OUTER | ON | WHERE | OR | AND | NOT | IN | LIKE | IS | NULL | ANY | CONTAINS | IN_FOLDER | IN_TREE | ORDER | BY | ASC | DESC | SCORE | LPAREN | RPAREN | STAR | COMMA | DOTSTAR | DOT | DOTDOT | EQUALS | TILDA | NOTEQUALS | GREATERTHAN | LESSTHAN | GREATERTHANOREQUALS | LESSTHANOREQUALS | COLON | DOUBLE_QUOTE | DECIMAL_INTEGER_LITERAL | FLOATING_POINT_LITERAL | ID | WS ) - int alt16=49; + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:8: ( QUOTED_STRING | SELECT | AS | UPPER | LOWER | FROM | JOIN | INNER | LEFT | OUTER | ON | WHERE | OR | AND | NOT | IN | LIKE | IS | NULL | ANY | CONTAINS | IN_FOLDER | IN_TREE | ORDER | BY | ASC | DESC | SCORE | LPAREN | RPAREN | STAR | COMMA | DOTSTAR | DOT | DOTDOT | EQUALS | TILDA | NOTEQUALS | GREATERTHAN | LESSTHAN | GREATERTHANOREQUALS | LESSTHANOREQUALS | COLON | DOUBLE_QUOTE | DECIMAL_INTEGER_LITERAL | FLOATING_POINT_LITERAL | ID | WS ) + int alt16=48; alt16 = dfa16.predict(input); switch (alt16) { case 1 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:10: SINGLE_QUOTE - { - mSINGLE_QUOTE(); - - } - break; - case 2 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:23: QUOTED_STRING + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:10: QUOTED_STRING { mQUOTED_STRING(); } break; - case 3 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:37: SELECT + case 2 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:24: SELECT { mSELECT(); } break; - case 4 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:44: AS + case 3 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:31: AS { mAS(); } break; - case 5 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:47: UPPER + case 4 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:34: UPPER { mUPPER(); } break; - case 6 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:53: LOWER + case 5 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:40: LOWER { mLOWER(); } break; - case 7 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:59: FROM + case 6 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:46: FROM { mFROM(); } break; - case 8 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:64: JOIN + case 7 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:51: JOIN { mJOIN(); } break; - case 9 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:69: INNER + case 8 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:56: INNER { mINNER(); } break; - case 10 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:75: LEFT + case 9 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:62: LEFT { mLEFT(); } break; - case 11 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:80: OUTER + case 10 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:67: OUTER { mOUTER(); } break; - case 12 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:86: ON + case 11 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:73: ON { mON(); } break; - case 13 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:89: WHERE + case 12 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:76: WHERE { mWHERE(); } break; - case 14 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:95: OR + case 13 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:82: OR { mOR(); } break; - case 15 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:98: AND + case 14 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:85: AND { mAND(); } break; - case 16 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:102: NOT + case 15 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:89: NOT { mNOT(); } break; - case 17 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:106: IN + case 16 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:93: IN { mIN(); } break; - case 18 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:109: LIKE + case 17 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:96: LIKE { mLIKE(); } break; - case 19 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:114: IS + case 18 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:101: IS { mIS(); } break; - case 20 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:117: NULL + case 19 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:104: NULL { mNULL(); } break; - case 21 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:122: ANY + case 20 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:109: ANY { mANY(); } break; - case 22 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:126: CONTAINS + case 21 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:113: CONTAINS { mCONTAINS(); } break; - case 23 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:135: IN_FOLDER + case 22 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:122: IN_FOLDER { mIN_FOLDER(); } break; - case 24 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:145: IN_TREE + case 23 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:132: IN_TREE { mIN_TREE(); } break; - case 25 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:153: ORDER + case 24 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:140: ORDER { mORDER(); } break; - case 26 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:159: BY + case 25 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:146: BY { mBY(); } break; - case 27 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:162: ASC + case 26 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:149: ASC { mASC(); } break; - case 28 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:166: DESC + case 27 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:153: DESC { mDESC(); } break; - case 29 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:171: SCORE + case 28 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:158: SCORE { mSCORE(); } break; - case 30 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:177: LPAREN + case 29 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:164: LPAREN { mLPAREN(); } break; - case 31 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:184: RPAREN + case 30 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:171: RPAREN { mRPAREN(); } break; - case 32 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:191: STAR + case 31 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:178: STAR { mSTAR(); } break; - case 33 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:196: COMMA + case 32 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:183: COMMA { mCOMMA(); } break; - case 34 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:202: DOTSTAR + case 33 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:189: DOTSTAR { mDOTSTAR(); } break; - case 35 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:210: DOT + case 34 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:197: DOT { mDOT(); } break; - case 36 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:214: DOTDOT + case 35 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:201: DOTDOT { mDOTDOT(); } break; - case 37 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:221: EQUALS + case 36 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:208: EQUALS { mEQUALS(); } break; - case 38 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:228: TILDA + case 37 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:215: TILDA { mTILDA(); } break; - case 39 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:234: NOTEQUALS + case 38 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:221: NOTEQUALS { mNOTEQUALS(); } break; - case 40 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:244: GREATERTHAN + case 39 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:231: GREATERTHAN { mGREATERTHAN(); } break; - case 41 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:256: LESSTHAN + case 40 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:243: LESSTHAN { mLESSTHAN(); } break; - case 42 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:265: GREATERTHANOREQUALS + case 41 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:252: GREATERTHANOREQUALS { mGREATERTHANOREQUALS(); } break; - case 43 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:285: LESSTHANOREQUALS + case 42 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:272: LESSTHANOREQUALS { mLESSTHANOREQUALS(); } break; - case 44 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:302: COLON + case 43 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:289: COLON { mCOLON(); } break; - case 45 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:308: DOUBLE_QUOTE + case 44 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:295: DOUBLE_QUOTE { mDOUBLE_QUOTE(); } break; - case 46 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:321: DECIMAL_INTEGER_LITERAL + case 45 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:308: DECIMAL_INTEGER_LITERAL { mDECIMAL_INTEGER_LITERAL(); } break; - case 47 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:345: FLOATING_POINT_LITERAL + case 46 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:332: FLOATING_POINT_LITERAL { mFLOATING_POINT_LITERAL(); } break; - case 48 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:368: ID + case 47 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:355: ID { mID(); } break; - case 49 : - // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:371: WS + case 48 : + // W:\\workspace-cmis2\\ANTLR\\CMIS.g:1:358: WS { mWS(); @@ -3081,35 +3036,35 @@ public class CMISLexer extends Lexer { this.transition = DFA9_transition; } public String getDescription() { - return "586:1: FLOATING_POINT_LITERAL : ( ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | DOT ( DIGIT )+ ( EXPONENT )? | ( DIGIT )+ EXPONENT );"; + return "574:1: FLOATING_POINT_LITERAL : ( ( DIGIT )+ DOT ( DIGIT )* ( EXPONENT )? | DOT ( DIGIT )+ ( EXPONENT )? | ( DIGIT )+ EXPONENT );"; } } static final String DFA16_eotS = - "\1\uffff\1\37\15\35\4\uffff\1\70\2\uffff\1\74\1\76\3\uffff\2\32"+ - "\4\uffff\2\35\1\103\7\35\1\116\1\117\1\35\1\121\1\123\4\35\1\130"+ - "\1\35\11\uffff\1\32\2\35\1\134\1\uffff\1\135\1\136\10\35\2\uffff"+ - "\1\35\1\uffff\1\35\1\uffff\1\35\1\153\2\35\1\uffff\3\35\3\uffff"+ - "\2\35\1\163\1\164\1\165\1\166\6\35\1\uffff\1\175\1\35\1\177\1\35"+ - "\1\u0081\1\u0082\1\u0083\4\uffff\1\u0084\2\35\1\u0087\1\u0088\1"+ - "\u0089\1\uffff\1\35\1\uffff\1\u008b\4\uffff\2\35\3\uffff\1\35\1"+ - "\uffff\1\35\1\u0090\2\35\1\uffff\1\u0093\1\u0094\2\uffff"; + "\2\uffff\15\35\4\uffff\1\66\2\uffff\1\72\1\74\3\uffff\2\32\2\uffff"+ + "\2\35\1\101\7\35\1\114\1\115\1\35\1\117\1\121\4\35\1\126\1\35\11"+ + "\uffff\1\32\2\35\1\132\1\uffff\1\133\1\134\10\35\2\uffff\1\35\1"+ + "\uffff\1\35\1\uffff\1\35\1\151\2\35\1\uffff\3\35\3\uffff\2\35\1"+ + "\161\1\162\1\163\1\164\6\35\1\uffff\1\173\1\35\1\175\1\35\1\177"+ + "\1\u0080\1\u0081\4\uffff\1\u0082\2\35\1\u0085\1\u0086\1\u0087\1"+ + "\uffff\1\35\1\uffff\1\u0089\4\uffff\2\35\3\uffff\1\35\1\uffff\1"+ + "\35\1\u008e\2\35\1\uffff\1\u0091\1\u0092\2\uffff"; static final String DFA16_eofS = - "\u0095\uffff"; + "\u0093\uffff"; static final String DFA16_minS = - "\1\11\1\0\1\103\1\116\1\120\1\105\1\122\1\117\2\116\1\110\2\117"+ - "\1\131\1\105\4\uffff\1\52\2\uffff\2\75\3\uffff\2\56\4\uffff\1\114"+ - "\1\117\1\43\1\104\1\120\1\127\1\106\1\113\1\117\1\111\2\43\1\124"+ - "\2\43\1\105\1\124\1\114\1\116\1\43\1\123\11\uffff\1\56\1\105\1\122"+ - "\1\43\1\uffff\2\43\2\105\1\124\1\105\1\115\1\116\1\105\1\106\2\uffff"+ - "\1\105\1\uffff\1\105\1\uffff\1\122\1\43\1\114\1\124\1\uffff\2\103"+ - "\1\105\3\uffff\2\122\4\43\1\122\1\117\3\122\1\105\1\uffff\1\43\1"+ - "\101\1\43\1\124\3\43\4\uffff\1\43\1\114\1\105\3\43\1\uffff\1\111"+ - "\1\uffff\1\43\4\uffff\1\104\1\105\3\uffff\1\116\1\uffff\1\105\1"+ - "\43\1\123\1\122\1\uffff\2\43\2\uffff"; + "\1\11\1\uffff\1\103\1\116\1\120\1\105\1\122\1\117\2\116\1\110\2"+ + "\117\1\131\1\105\4\uffff\1\52\2\uffff\2\75\3\uffff\2\56\2\uffff"+ + "\1\114\1\117\1\43\1\104\1\120\1\127\1\106\1\113\1\117\1\111\2\43"+ + "\1\124\2\43\1\105\1\124\1\114\1\116\1\43\1\123\11\uffff\1\56\1\105"+ + "\1\122\1\43\1\uffff\2\43\2\105\1\124\1\105\1\115\1\116\1\105\1\106"+ + "\2\uffff\1\105\1\uffff\1\105\1\uffff\1\122\1\43\1\114\1\124\1\uffff"+ + "\2\103\1\105\3\uffff\2\122\4\43\1\122\1\117\3\122\1\105\1\uffff"+ + "\1\43\1\101\1\43\1\124\3\43\4\uffff\1\43\1\114\1\105\3\43\1\uffff"+ + "\1\111\1\uffff\1\43\4\uffff\1\104\1\105\3\uffff\1\116\1\uffff\1"+ + "\105\1\43\1\123\1\122\1\uffff\2\43\2\uffff"; static final String DFA16_maxS = - "\1\176\1\ufffe\1\145\1\163\1\160\1\157\1\162\1\157\1\163\1\165"+ + "\1\176\1\uffff\1\145\1\163\1\160\1\157\1\162\1\157\1\163\1\165"+ "\1\150\1\165\1\157\1\171\1\145\4\uffff\1\71\2\uffff\1\76\1\75\3"+ - "\uffff\2\145\4\uffff\1\154\1\157\1\172\1\171\1\160\1\167\1\146\1"+ + "\uffff\2\145\2\uffff\1\154\1\157\1\172\1\171\1\160\1\167\1\146\1"+ "\153\1\157\1\151\2\172\1\164\2\172\1\145\1\164\1\154\1\156\1\172"+ "\1\163\11\uffff\2\145\1\162\1\172\1\uffff\2\172\2\145\1\164\1\145"+ "\1\155\1\156\1\145\1\164\2\uffff\1\145\1\uffff\1\145\1\uffff\1\162"+ @@ -3119,15 +3074,15 @@ public class CMISLexer extends Lexer { "\1\145\3\uffff\1\156\1\uffff\1\145\1\172\1\163\1\162\1\uffff\2\172"+ "\2\uffff"; static final String DFA16_acceptS = - "\17\uffff\1\36\1\37\1\40\1\41\1\uffff\1\45\1\46\2\uffff\1\54\1"+ - "\55\1\56\2\uffff\1\60\1\61\1\1\1\2\25\uffff\1\42\1\44\1\43\1\57"+ - "\1\47\1\53\1\51\1\52\1\50\4\uffff\1\4\12\uffff\1\21\1\23\1\uffff"+ - "\1\14\1\uffff\1\16\4\uffff\1\32\3\uffff\1\33\1\17\1\25\14\uffff"+ - "\1\20\7\uffff\1\12\1\22\1\7\1\10\6\uffff\1\24\1\uffff\1\34\1\uffff"+ - "\1\35\1\5\1\6\1\11\2\uffff\1\13\1\31\1\15\1\uffff\1\3\4\uffff\1"+ - "\30\2\uffff\1\26\1\27"; + "\1\uffff\1\1\15\uffff\1\35\1\36\1\37\1\40\1\uffff\1\44\1\45\2\uffff"+ + "\1\53\1\54\1\55\2\uffff\1\57\1\60\25\uffff\1\41\1\43\1\42\1\56\1"+ + "\46\1\52\1\50\1\51\1\47\4\uffff\1\3\12\uffff\1\20\1\22\1\uffff\1"+ + "\13\1\uffff\1\15\4\uffff\1\31\3\uffff\1\32\1\16\1\24\14\uffff\1"+ + "\17\7\uffff\1\11\1\21\1\6\1\7\6\uffff\1\23\1\uffff\1\33\1\uffff"+ + "\1\34\1\4\1\5\1\10\2\uffff\1\12\1\30\1\14\1\uffff\1\2\4\uffff\1"+ + "\27\2\uffff\1\25\1\26"; static final String DFA16_specialS = - "\u0095\uffff}>"; + "\u0093\uffff}>"; static final String[] DFA16_transitionS = { "\2\36\2\uffff\1\36\22\uffff\1\36\1\uffff\1\31\4\uffff\1\1\1"+ "\17\1\20\1\21\1\32\1\22\1\32\1\23\1\uffff\1\33\11\34\1\30\1"+ @@ -3136,79 +3091,77 @@ public class CMISLexer extends Lexer { "\1\12\3\35\4\uffff\1\35\1\uffff\1\3\1\15\1\14\1\16\1\35\1\6"+ "\2\35\1\10\1\7\1\35\1\5\1\35\1\13\1\11\3\35\1\2\1\35\1\4\1\35"+ "\1\12\3\35\3\uffff\1\25", - "\uffff\40", - "\1\42\1\uffff\1\41\35\uffff\1\42\1\uffff\1\41", - "\1\44\4\uffff\1\43\32\uffff\1\44\4\uffff\1\43", - "\1\45\37\uffff\1\45", - "\1\47\3\uffff\1\50\5\uffff\1\46\25\uffff\1\47\3\uffff\1\50"+ - "\5\uffff\1\46", - "\1\51\37\uffff\1\51", - "\1\52\37\uffff\1\52", - "\1\53\4\uffff\1\54\32\uffff\1\53\4\uffff\1\54", - "\1\56\3\uffff\1\57\2\uffff\1\55\30\uffff\1\56\3\uffff\1\57"+ - "\2\uffff\1\55", - "\1\60\37\uffff\1\60", - "\1\61\5\uffff\1\62\31\uffff\1\61\5\uffff\1\62", + "", + "\1\40\1\uffff\1\37\35\uffff\1\40\1\uffff\1\37", + "\1\42\4\uffff\1\41\32\uffff\1\42\4\uffff\1\41", + "\1\43\37\uffff\1\43", + "\1\45\3\uffff\1\46\5\uffff\1\44\25\uffff\1\45\3\uffff\1\46"+ + "\5\uffff\1\44", + "\1\47\37\uffff\1\47", + "\1\50\37\uffff\1\50", + "\1\51\4\uffff\1\52\32\uffff\1\51\4\uffff\1\52", + "\1\54\3\uffff\1\55\2\uffff\1\53\30\uffff\1\54\3\uffff\1\55"+ + "\2\uffff\1\53", + "\1\56\37\uffff\1\56", + "\1\57\5\uffff\1\60\31\uffff\1\57\5\uffff\1\60", + "\1\61\37\uffff\1\61", + "\1\62\37\uffff\1\62", "\1\63\37\uffff\1\63", - "\1\64\37\uffff\1\64", - "\1\65\37\uffff\1\65", "", "", "", "", - "\1\66\3\uffff\1\67\1\uffff\12\71", + "\1\64\3\uffff\1\65\1\uffff\12\67", "", "", - "\1\73\1\72", - "\1\75", + "\1\71\1\70", + "\1\73", "", "", "", - "\1\71\1\uffff\12\71\13\uffff\1\71\37\uffff\1\71", - "\1\71\1\uffff\12\77\13\uffff\1\71\37\uffff\1\71", + "\1\67\1\uffff\12\67\13\uffff\1\67\37\uffff\1\67", + "\1\67\1\uffff\12\75\13\uffff\1\67\37\uffff\1\67", "", "", - "", - "", - "\1\100\37\uffff\1\100", - "\1\101\37\uffff\1\101", - "\2\35\13\uffff\1\35\20\uffff\2\35\1\102\27\35\4\uffff\1\35"+ - "\1\uffff\2\35\1\102\27\35", - "\1\104\24\uffff\1\105\12\uffff\1\104\24\uffff\1\105", + "\1\76\37\uffff\1\76", + "\1\77\37\uffff\1\77", + "\2\35\13\uffff\1\35\20\uffff\2\35\1\100\27\35\4\uffff\1\35"+ + "\1\uffff\2\35\1\100\27\35", + "\1\102\24\uffff\1\103\12\uffff\1\102\24\uffff\1\103", + "\1\104\37\uffff\1\104", + "\1\105\37\uffff\1\105", "\1\106\37\uffff\1\106", "\1\107\37\uffff\1\107", "\1\110\37\uffff\1\110", "\1\111\37\uffff\1\111", - "\1\112\37\uffff\1\112", - "\1\113\37\uffff\1\113", - "\2\35\13\uffff\1\35\20\uffff\15\35\1\114\14\35\4\uffff\1\115"+ - "\1\uffff\15\35\1\114\14\35", + "\2\35\13\uffff\1\35\20\uffff\15\35\1\112\14\35\4\uffff\1\113"+ + "\1\uffff\15\35\1\112\14\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", - "\1\120\37\uffff\1\120", + "\1\116\37\uffff\1\116", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", - "\2\35\13\uffff\1\35\20\uffff\3\35\1\122\26\35\4\uffff\1\35"+ - "\1\uffff\3\35\1\122\26\35", + "\2\35\13\uffff\1\35\20\uffff\3\35\1\120\26\35\4\uffff\1\35"+ + "\1\uffff\3\35\1\120\26\35", + "\1\122\37\uffff\1\122", + "\1\123\37\uffff\1\123", "\1\124\37\uffff\1\124", "\1\125\37\uffff\1\125", - "\1\126\37\uffff\1\126", + "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ + "\35", "\1\127\37\uffff\1\127", - "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ - "\35", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "\1\67\1\uffff\12\75\13\uffff\1\67\37\uffff\1\67", + "\1\130\37\uffff\1\130", "\1\131\37\uffff\1\131", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "\1\71\1\uffff\12\77\13\uffff\1\71\37\uffff\1\71", - "\1\132\37\uffff\1\132", - "\1\133\37\uffff\1\133", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", "", @@ -3216,34 +3169,34 @@ public class CMISLexer extends Lexer { "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", + "\1\135\37\uffff\1\135", + "\1\136\37\uffff\1\136", "\1\137\37\uffff\1\137", "\1\140\37\uffff\1\140", "\1\141\37\uffff\1\141", "\1\142\37\uffff\1\142", "\1\143\37\uffff\1\143", - "\1\144\37\uffff\1\144", - "\1\145\37\uffff\1\145", - "\1\146\15\uffff\1\147\21\uffff\1\146\15\uffff\1\147", + "\1\144\15\uffff\1\145\21\uffff\1\144\15\uffff\1\145", "", "", + "\1\146\37\uffff\1\146", + "", + "\1\147\37\uffff\1\147", + "", "\1\150\37\uffff\1\150", - "", - "\1\151\37\uffff\1\151", - "", - "\1\152\37\uffff\1\152", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", + "\1\152\37\uffff\1\152", + "\1\153\37\uffff\1\153", + "", "\1\154\37\uffff\1\154", "\1\155\37\uffff\1\155", - "", "\1\156\37\uffff\1\156", + "", + "", + "", "\1\157\37\uffff\1\157", "\1\160\37\uffff\1\160", - "", - "", - "", - "\1\161\37\uffff\1\161", - "\1\162\37\uffff\1\162", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ @@ -3252,21 +3205,21 @@ public class CMISLexer extends Lexer { "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", + "\1\165\37\uffff\1\165", + "\1\166\37\uffff\1\166", "\1\167\37\uffff\1\167", "\1\170\37\uffff\1\170", "\1\171\37\uffff\1\171", "\1\172\37\uffff\1\172", - "\1\173\37\uffff\1\173", - "\1\174\37\uffff\1\174", "", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", + "\1\174\37\uffff\1\174", + "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ + "\35", "\1\176\37\uffff\1\176", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", - "\1\u0080\37\uffff\1\u0080", - "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ - "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ @@ -3277,8 +3230,8 @@ public class CMISLexer extends Lexer { "", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", - "\1\u0085\37\uffff\1\u0085", - "\1\u0086\37\uffff\1\u0086", + "\1\u0083\37\uffff\1\u0083", + "\1\u0084\37\uffff\1\u0084", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ @@ -3286,26 +3239,26 @@ public class CMISLexer extends Lexer { "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", "", + "\1\u0088\37\uffff\1\u0088", + "", + "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ + "\35", + "", + "", + "", + "", "\1\u008a\37\uffff\1\u008a", - "", - "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ - "\35", - "", + "\1\u008b\37\uffff\1\u008b", "", "", "", "\1\u008c\37\uffff\1\u008c", + "", "\1\u008d\37\uffff\1\u008d", - "", - "", - "", - "\1\u008e\37\uffff\1\u008e", - "", - "\1\u008f\37\uffff\1\u008f", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", - "\1\u0091\37\uffff\1\u0091", - "\1\u0092\37\uffff\1\u0092", + "\1\u008f\37\uffff\1\u008f", + "\1\u0090\37\uffff\1\u0090", "", "\2\35\13\uffff\1\35\20\uffff\32\35\4\uffff\1\35\1\uffff\32"+ "\35", @@ -3345,7 +3298,7 @@ public class CMISLexer extends Lexer { this.transition = DFA16_transition; } public String getDescription() { - return "1:1: Tokens : ( SINGLE_QUOTE | QUOTED_STRING | SELECT | AS | UPPER | LOWER | FROM | JOIN | INNER | LEFT | OUTER | ON | WHERE | OR | AND | NOT | IN | LIKE | IS | NULL | ANY | CONTAINS | IN_FOLDER | IN_TREE | ORDER | BY | ASC | DESC | SCORE | LPAREN | RPAREN | STAR | COMMA | DOTSTAR | DOT | DOTDOT | EQUALS | TILDA | NOTEQUALS | GREATERTHAN | LESSTHAN | GREATERTHANOREQUALS | LESSTHANOREQUALS | COLON | DOUBLE_QUOTE | DECIMAL_INTEGER_LITERAL | FLOATING_POINT_LITERAL | ID | WS );"; + return "1:1: Tokens : ( QUOTED_STRING | SELECT | AS | UPPER | LOWER | FROM | JOIN | INNER | LEFT | OUTER | ON | WHERE | OR | AND | NOT | IN | LIKE | IS | NULL | ANY | CONTAINS | IN_FOLDER | IN_TREE | ORDER | BY | ASC | DESC | SCORE | LPAREN | RPAREN | STAR | COMMA | DOTSTAR | DOT | DOTDOT | EQUALS | TILDA | NOTEQUALS | GREATERTHAN | LESSTHAN | GREATERTHANOREQUALS | LESSTHANOREQUALS | COLON | DOUBLE_QUOTE | DECIMAL_INTEGER_LITERAL | FLOATING_POINT_LITERAL | ID | WS );"; } } diff --git a/source/java/org/alfresco/repo/search/impl/parsers/CMISParser.java b/source/java/org/alfresco/repo/search/impl/parsers/CMISParser.java index 1996216852..b36b46be0a 100644 --- a/source/java/org/alfresco/repo/search/impl/parsers/CMISParser.java +++ b/source/java/org/alfresco/repo/search/impl/parsers/CMISParser.java @@ -1,4 +1,4 @@ -// $ANTLR 3.1b1 W:\\workspace-cmis2\\ANTLR\\CMIS.g 2008-07-29 14:25:59 +// $ANTLR 3.1b1 W:\\workspace-cmis2\\ANTLR\\CMIS.g 2008-08-07 14:37:14 package org.alfresco.repo.search.impl.parsers; import org.antlr.runtime.*; @@ -12,11 +12,11 @@ import org.antlr.runtime.tree.*; public class CMISParser extends Parser { public static final String[] tokenNames = new String[] { - "", "", "", "", "QUERY", "ALL_COLUMNS", "COLUMN", "COLUMNS", "COLUMN_REF", "QUALIFIER", "FUNCTION", "SOURCE", "TABLE", "TABLE_REF", "PARAMETER", "CONJUNCTION", "DISJUNCTION", "NEGATION", "PRED_COMPARISON", "PRED_IN", "PRED_EXISTS", "PRED_LIKE", "PRED_FTS", "LIST", "PRED_CHILD", "PRED_DESCENDANT", "SORT_SPECIFICATION", "NUMERIC_LITERAL", "STRING_LITERAL", "SELECT", "STAR", "COMMA", "AS", "DOTSTAR", "DOT", "LPAREN", "RPAREN", "FROM", "JOIN", "INNER", "LEFT", "OUTER", "ON", "EQUALS", "WHERE", "OR", "AND", "NOT", "NOTEQUALS", "LESSTHAN", "GREATERTHAN", "LESSTHANOREQUALS", "GREATERTHANOREQUALS", "IN", "LIKE", "IS", "NULL", "ANY", "CONTAINS", "IN_FOLDER", "IN_TREE", "ORDER", "BY", "ASC", "DESC", "COLON", "QUOTED_STRING", "ID", "DOUBLE_QUOTE", "FLOATING_POINT_LITERAL", "DECIMAL_INTEGER_LITERAL", "UPPER", "LOWER", "SCORE", "SINGLE_QUOTE", "ESCAPED_SINGLE_QUOTE", "DOTDOT", "TILDA", "PLUS", "MINUS", "DECIMAL_NUMERAL", "DIGIT", "EXPONENT", "WS", "ZERO_DIGIT", "NON_ZERO_DIGIT", "E", "SIGNED_INTEGER" + "", "", "", "", "QUERY", "ALL_COLUMNS", "COLUMN", "COLUMNS", "COLUMN_REF", "QUALIFIER", "FUNCTION", "SOURCE", "TABLE", "TABLE_REF", "PARAMETER", "CONJUNCTION", "DISJUNCTION", "NEGATION", "PRED_COMPARISON", "PRED_IN", "PRED_EXISTS", "PRED_LIKE", "PRED_FTS", "LIST", "PRED_CHILD", "PRED_DESCENDANT", "SORT_SPECIFICATION", "NUMERIC_LITERAL", "STRING_LITERAL", "SELECT", "STAR", "COMMA", "AS", "DOTSTAR", "DOT", "LPAREN", "RPAREN", "FROM", "JOIN", "INNER", "LEFT", "OUTER", "ON", "EQUALS", "WHERE", "OR", "AND", "NOT", "NOTEQUALS", "LESSTHAN", "GREATERTHAN", "LESSTHANOREQUALS", "GREATERTHANOREQUALS", "IN", "LIKE", "IS", "NULL", "ANY", "CONTAINS", "IN_FOLDER", "IN_TREE", "ORDER", "BY", "ASC", "DESC", "COLON", "QUOTED_STRING", "ID", "DOUBLE_QUOTE", "FLOATING_POINT_LITERAL", "DECIMAL_INTEGER_LITERAL", "UPPER", "LOWER", "SCORE", "DOTDOT", "TILDA", "PLUS", "MINUS", "DECIMAL_NUMERAL", "DIGIT", "EXPONENT", "WS", "ZERO_DIGIT", "NON_ZERO_DIGIT", "E", "SIGNED_INTEGER" }; public static final int FUNCTION=10; public static final int WHERE=44; - public static final int EXPONENT=82; + public static final int EXPONENT=80; public static final int PRED_FTS=22; public static final int STAR=30; public static final int INNER=39; @@ -27,7 +27,7 @@ public class CMISParser extends Parser { public static final int CONTAINS=58; public static final int TABLE=12; public static final int SOURCE=11; - public static final int DOTDOT=76; + public static final int DOTDOT=74; public static final int EQUALS=43; public static final int NOT=47; public static final int ID=67; @@ -36,42 +36,41 @@ public class CMISParser extends Parser { public static final int LPAREN=35; public static final int LESSTHANOREQUALS=51; public static final int AS=32; - public static final int SINGLE_QUOTE=74; public static final int RPAREN=36; - public static final int TILDA=77; + public static final int TILDA=75; public static final int PRED_LIKE=21; public static final int STRING_LITERAL=28; public static final int IN=53; - public static final int DECIMAL_NUMERAL=80; + public static final int DECIMAL_NUMERAL=78; public static final int FLOATING_POINT_LITERAL=69; public static final int COMMA=31; public static final int IS=55; public static final int LEFT=40; - public static final int SIGNED_INTEGER=87; + public static final int SIGNED_INTEGER=85; public static final int PARAMETER=14; public static final int COLUMN=6; - public static final int PLUS=78; + public static final int PLUS=76; public static final int QUOTED_STRING=66; - public static final int ZERO_DIGIT=84; - public static final int DIGIT=81; + public static final int ZERO_DIGIT=82; + public static final int DIGIT=79; public static final int DOT=34; public static final int COLUMN_REF=8; public static final int SELECT=29; public static final int LIKE=54; public static final int GREATERTHAN=50; public static final int DOTSTAR=33; - public static final int E=86; + public static final int E=84; public static final int OUTER=41; public static final int BY=62; public static final int LESSTHAN=49; - public static final int NON_ZERO_DIGIT=85; + public static final int NON_ZERO_DIGIT=83; public static final int ASC=63; public static final int QUALIFIER=9; public static final int CONJUNCTION=15; public static final int NULL=56; public static final int ON=42; public static final int NOTEQUALS=48; - public static final int MINUS=79; + public static final int MINUS=77; public static final int LIST=23; public static final int PRED_DESCENDANT=25; public static final int JOIN=38; @@ -80,7 +79,7 @@ public class CMISParser extends Parser { public static final int GREATERTHANOREQUALS=52; public static final int DISJUNCTION=16; public static final int COLUMNS=7; - public static final int WS=83; + public static final int WS=81; public static final int ANY=57; public static final int SCORE=73; public static final int NEGATION=17; @@ -98,7 +97,6 @@ public class CMISParser extends Parser { public static final int FROM=37; public static final int UPPER=71; public static final int PRED_IN=19; - public static final int ESCAPED_SINGLE_QUOTE=75; // delegates // delegators @@ -278,7 +276,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: whereClause, selectList, fromClause, orderByClause + // elements: whereClause, orderByClause, selectList, fromClause // token labels: // rule labels: retval // token list labels: @@ -1104,7 +1102,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: columnName, qualifier + // elements: qualifier, columnName // token labels: // rule labels: retval // token list labels: @@ -1375,7 +1373,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: LPAREN, RPAREN, functionName, functionArgument + // elements: functionArgument, RPAREN, LPAREN, functionName // token labels: // rule labels: retval, functionName // token list labels: @@ -1587,7 +1585,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: columnName, qualifier + // elements: qualifier, columnName // token labels: // rule labels: retval // token list labels: @@ -2035,7 +2033,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: joinedTable, singleTable + // elements: singleTable, joinedTable // token labels: // rule labels: retval // token list labels: @@ -2384,7 +2382,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: tableReference, joinSpecification, JOIN, joinType + // elements: joinSpecification, joinType, tableReference, JOIN // token labels: // rule labels: retval // token list labels: @@ -2511,7 +2509,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: joinedTable, singleTable + // elements: singleTable, joinedTable // token labels: // rule labels: retval // token list labels: @@ -2767,7 +2765,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: rhs, ON, lhs, EQUALS + // elements: rhs, ON, EQUALS, lhs // token labels: // rule labels: retval, rhs, lhs // token list labels: @@ -3609,7 +3607,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: valueExpression, compOp, literalOrParameterName + // elements: literalOrParameterName, compOp, valueExpression // token labels: // rule labels: retval // token list labels: @@ -3969,7 +3967,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: columnReference, NOT, inValueList + // elements: inValueList, NOT, columnReference // token labels: // rule labels: retval // token list labels: @@ -4212,7 +4210,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: columnReference, characterStringLiteral, NOT + // elements: NOT, columnReference, characterStringLiteral // token labels: // rule labels: retval // token list labels: @@ -4710,7 +4708,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: ANY, multiValuedColumnReference, compOp, literalOrParameterName + // elements: multiValuedColumnReference, ANY, compOp, literalOrParameterName // token labels: // rule labels: retval // token list labels: @@ -4845,7 +4843,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: multiValuedColumnReference, ANY, NOT, inValueList + // elements: ANY, multiValuedColumnReference, NOT, inValueList // token labels: // rule labels: retval // token list labels: @@ -4993,7 +4991,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: qualifier, textSearchExpression + // elements: textSearchExpression, qualifier // token labels: // rule labels: retval // token list labels: @@ -5407,7 +5405,7 @@ public class CMISParser extends Parser { // AST REWRITE - // elements: ORDER, sortSpecification + // elements: sortSpecification, ORDER // token labels: // rule labels: retval // token list labels: @@ -7219,7 +7217,7 @@ public class CMISParser extends Parser { public static final BitSet FOLLOW_correlationName_in_qualifier583 = new BitSet(new long[]{0x0000000000000002L}); public static final BitSet FOLLOW_FROM_in_fromClause620 = new BitSet(new long[]{0xFFE0F7E960000000L,0x0000000000000399L}); public static final BitSet FOLLOW_tableReference_in_fromClause622 = new BitSet(new long[]{0x0000000000000002L}); - public static final BitSet FOLLOW_singleTable_in_tableReference640 = new BitSet(new long[]{0x000001C000000002L}); + public static final BitSet FOLLOW_singleTable_in_tableReference640 = new BitSet(new long[]{0x000001C000000000L}); public static final BitSet FOLLOW_joinedTable_in_tableReference649 = new BitSet(new long[]{0x000001C000000002L}); public static final BitSet FOLLOW_tableName_in_singleTable678 = new BitSet(new long[]{0xFFE0F7E160000002L,0x0000000000000399L}); public static final BitSet FOLLOW_AS_in_singleTable682 = new BitSet(new long[]{0xFFE0F7E160000000L,0x0000000000000399L}); @@ -7284,7 +7282,7 @@ public class CMISParser extends Parser { public static final BitSet FOLLOW_literalOrParameterName_in_inValueList1256 = new BitSet(new long[]{0x0000000080000002L}); public static final BitSet FOLLOW_columnReference_in_likePredicate1282 = new BitSet(new long[]{0x0040800000000000L}); public static final BitSet FOLLOW_NOT_in_likePredicate1284 = new BitSet(new long[]{0x0040000000000000L}); - public static final BitSet FOLLOW_LIKE_in_likePredicate1287 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000064L}); + public static final BitSet FOLLOW_LIKE_in_likePredicate1287 = new BitSet(new long[]{0xFFE0F7E1E0000000L,0x00000000000003FDL}); public static final BitSet FOLLOW_characterStringLiteral_in_likePredicate1289 = new BitSet(new long[]{0x0000000000000002L}); public static final BitSet FOLLOW_columnReference_in_nullPredicate1323 = new BitSet(new long[]{0x0080000000000000L}); public static final BitSet FOLLOW_multiValuedColumnReference_in_nullPredicate1327 = new BitSet(new long[]{0x0080000000000000L}); 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 18f2ea1c7b..1712395ace 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/FunctionEvaluationContext.java @@ -25,6 +25,7 @@ package org.alfresco.repo.search.impl.querymodel; import java.io.Serializable; +import java.util.Collection; import java.util.Map; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; @@ -36,21 +37,36 @@ import org.apache.lucene.search.Query; /** * @author andyh - * */ public interface FunctionEvaluationContext { public Map getNodeRefs(); - + public Map getScores(); - + public Serializable getProperty(NodeRef nodeRef, QName propertyQName); - + public NodeService getNodeService(); - + public Float getScore(); - public Query buildLuceneEquality(LuceneQueryParser lqp, QName propertyQName, Serializable value) throws ParseException; + public Query buildLuceneEquality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; public Query buildLuceneExists(LuceneQueryParser lqp, QName propertyQName, Boolean not) throws ParseException; + + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLessThan(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneLike(LuceneQueryParser lqp, QName propertyQName, Serializable value, Boolean not) throws ParseException; + + public Query buildLuceneInequality(LuceneQueryParser lqp, QName propertyQName, Serializable value, PredicateMode mode) throws ParseException; + + public Query buildLuceneIn(LuceneQueryParser lqp, QName propertyQName, Collection values, Boolean not, PredicateMode mode) throws ParseException; + + public String getLuceneSortField(QName propertyQName); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/PredicateMode.java b/source/java/org/alfresco/repo/search/impl/querymodel/PredicateMode.java new file mode 100644 index 0000000000..0da02c4c42 --- /dev/null +++ b/source/java/org/alfresco/repo/search/impl/querymodel/PredicateMode.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.repo.search.impl.querymodel; + +/** + * @author andyh + * + */ +public enum PredicateMode +{ + ANY, ALL; +} diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseComparison.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseComparison.java index d28e47d604..722dc181b4 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseComparison.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/BaseComparison.java @@ -25,9 +25,14 @@ package org.alfresco.repo.search.impl.querymodel.impl; import java.util.LinkedHashMap; +import java.util.Map; +import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.ArgumentDefinition; import org.alfresco.repo.search.impl.querymodel.Multiplicity; +import org.alfresco.repo.search.impl.querymodel.PropertyArgument; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; +import org.alfresco.repo.search.impl.querymodel.StaticArgument; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.namespace.QName; @@ -37,12 +42,16 @@ import org.alfresco.service.namespace.QName; public abstract class BaseComparison extends BaseFunction { public final static String ARG_LHS = "LHS"; - + public final static String ARG_RHS = "RHS"; - + public static LinkedHashMap args; + + private PropertyArgument propertyArgument; - static + private StaticArgument staticArgument; + + static { args = new LinkedHashMap(); args.put(ARG_LHS, new BaseArgumentDefinition(Multiplicity.ANY, ARG_LHS, DataTypeDefinition.ANY, true)); @@ -59,4 +68,61 @@ public abstract class BaseComparison extends BaseFunction super(name, returnType, argumentDefinitions); } + public void setPropertyAndStaticArguments(Map functionArgs) + { + Argument lhs = functionArgs.get(ARG_LHS); + Argument rhs = functionArgs.get(ARG_RHS); + + if (lhs instanceof PropertyArgument) + { + if (rhs instanceof PropertyArgument) + { + throw new QueryModelException("Implicit join is not supported"); + } + else if (rhs instanceof StaticArgument) + { + propertyArgument = (PropertyArgument) lhs; + staticArgument = (StaticArgument) rhs; + } + else + { + throw new QueryModelException("Argument of type " + rhs.getClass().getName() + " is not supported"); + } + } + else if (rhs instanceof PropertyArgument) + { + if (lhs instanceof StaticArgument) + { + propertyArgument = (PropertyArgument) rhs; + staticArgument = (StaticArgument) lhs; + } + else + { + throw new QueryModelException("Argument of type " + lhs.getClass().getName() + " is not supported"); + } + } + else + { + throw new QueryModelException("Equals must have one property argument"); + } + } + + /** + * @return the propertyArgument + */ + protected PropertyArgument getPropertyArgument() + { + return propertyArgument; + } + + /** + * @return the staticArgument + */ + protected StaticArgument getStaticArgument() + { + return staticArgument; + } + + + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/In.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/In.java index 5510cd44c1..7f9d98a799 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/In.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/In.java @@ -46,7 +46,7 @@ public class In extends BaseFunction public final static String ARG_PROPERTY = "Property"; - public final static String ARG_COLLECTION = "Collection"; + public final static String ARG_LIST = "List"; public final static String ARG_NOT = "Not"; @@ -59,7 +59,7 @@ public class In extends BaseFunction args = new LinkedHashMap(); args.put(ARG_MODE, new BaseArgumentDefinition(Multiplicity.ANY, ARG_MODE, DataTypeDefinition.ANY, true)); args.put(ARG_PROPERTY, new BaseArgumentDefinition(Multiplicity.ANY, ARG_PROPERTY, DataTypeDefinition.ANY, true)); - args.put(ARG_COLLECTION, new BaseArgumentDefinition(Multiplicity.ANY, ARG_COLLECTION, DataTypeDefinition.ANY, true)); + args.put(ARG_LIST, new BaseArgumentDefinition(Multiplicity.ANY, ARG_LIST, DataTypeDefinition.ANY, true)); args.put(ARG_NOT, new BaseArgumentDefinition(Multiplicity.ANY, ARG_NOT, DataTypeDefinition.ANY, false)); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Lower.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Lower.java index cc95344281..72717589e4 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Lower.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Lower.java @@ -32,8 +32,6 @@ import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.ArgumentDefinition; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.Multiplicity; -import org.alfresco.repo.search.impl.querymodel.PropertyArgument; -import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.BaseArgumentDefinition; import org.alfresco.repo.search.impl.querymodel.impl.BaseFunction; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -46,14 +44,14 @@ public class Lower extends BaseFunction { public final static String NAME = "Lower"; - public final static String ARG_PROPERTY = "Arg"; + public final static String ARG_ARG = "Arg"; public static LinkedHashMap args; static { args = new LinkedHashMap(); - args.put(ARG_PROPERTY, new BaseArgumentDefinition(Multiplicity.SINGLE_VALUED, ARG_PROPERTY, DataTypeDefinition.ANY, true)); + args.put(ARG_ARG, new BaseArgumentDefinition(Multiplicity.SINGLE_VALUED, ARG_ARG, DataTypeDefinition.ANY, true)); } /** @@ -73,11 +71,7 @@ public class Lower extends BaseFunction */ public Serializable getValue(Map args, FunctionEvaluationContext context) { - Argument arg = args.get(ARG_PROPERTY); - if(!(arg instanceof PropertyArgument)) - { - throw new QueryModelException("Function "+NAME+" requires a property argument"); - } + Argument arg = args.get(ARG_ARG); Serializable value = arg.getValue(context); String stringValue = DefaultTypeConverter.INSTANCE.convert(String.class, value); return stringValue.toLowerCase(); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Upper.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Upper.java index fa393d5fa9..7d8943557e 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Upper.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/functions/Upper.java @@ -32,8 +32,6 @@ import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.ArgumentDefinition; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.Multiplicity; -import org.alfresco.repo.search.impl.querymodel.PropertyArgument; -import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.BaseArgumentDefinition; import org.alfresco.repo.search.impl.querymodel.impl.BaseFunction; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -46,14 +44,14 @@ public class Upper extends BaseFunction { public final static String NAME = "Upper"; - public final static String ARG_PROPERTY = "Property"; + public final static String ARG_ARG = "Arg"; public static LinkedHashMap args; static { args = new LinkedHashMap(); - args.put(ARG_PROPERTY, new BaseArgumentDefinition(Multiplicity.SINGLE_VALUED, ARG_PROPERTY, DataTypeDefinition.ANY, true)); + args.put(ARG_ARG, new BaseArgumentDefinition(Multiplicity.SINGLE_VALUED, ARG_ARG, DataTypeDefinition.ANY, true)); } /** @@ -73,11 +71,7 @@ public class Upper extends BaseFunction */ public Serializable getValue(Map args, FunctionEvaluationContext context) { - Argument arg = args.get(ARG_PROPERTY); - if(!(arg instanceof PropertyArgument)) - { - throw new QueryModelException("Function "+NAME+" requires a property argument"); - } + Argument arg = args.get(ARG_ARG); Serializable value = arg.getValue(context); String stringValue = DefaultTypeConverter.INSTANCE.convert(String.class, value); return stringValue.toUpperCase(); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneConjunction.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneConjunction.java index fc3e8c8265..31d3ebc3df 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneConjunction.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneConjunction.java @@ -79,6 +79,10 @@ public class LuceneConjunction extends BaseConjunction implements LuceneQueryBui query.add(constraintQuery, Occur.MUST); } } + else + { + throw new UnsupportedOperationException(); + } } else { diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneDisjunction.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneDisjunction.java index 9cf8789d8b..fb9588249b 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneDisjunction.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneDisjunction.java @@ -39,7 +39,6 @@ import org.apache.lucene.search.BooleanClause.Occur; /** * @author andyh - * */ public class LuceneDisjunction extends BaseDisjunction implements LuceneQueryBuilderComponent { @@ -52,14 +51,18 @@ public class LuceneDisjunction extends BaseDisjunction implements LuceneQueryBui super(constraints); } - /* (non-Javadoc) - * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(java.lang.String, java.util.Map, org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext, org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext) + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(java.lang.String, + * java.util.Map, org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext, + * org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext) */ public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) throws ParseException { BooleanQuery query = new BooleanQuery(); - for(Constraint constraint : getConstraints()) + for (Constraint constraint : getConstraints()) { if (constraint instanceof LuceneQueryBuilderComponent) { @@ -76,6 +79,10 @@ public class LuceneDisjunction extends BaseDisjunction implements LuceneQueryBui query.add(constraintQuery, Occur.SHOULD); } } + else + { + throw new UnsupportedOperationException(); + } } else { @@ -83,8 +90,7 @@ public class LuceneDisjunction extends BaseDisjunction implements LuceneQueryBui } } return query; - - + } } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneNegation.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneNegation.java index 9f88b39d27..1a62220aae 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneNegation.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneNegation.java @@ -35,7 +35,6 @@ import org.apache.lucene.search.Query; /** * @author andyh - * */ public class LuceneNegation extends BaseNegation implements LuceneQueryBuilderComponent { @@ -48,8 +47,12 @@ public class LuceneNegation extends BaseNegation implements LuceneQueryBuilderCo super(constraint); } - /* (non-Javadoc) - * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(java.lang.String, java.util.Map, org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext, org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext) + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(java.lang.String, + * java.util.Map, org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext, + * org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext) */ public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) throws ParseException @@ -58,6 +61,10 @@ public class LuceneNegation extends BaseNegation implements LuceneQueryBuilderCo { LuceneQueryBuilderComponent luceneQueryBuilderComponent = (LuceneQueryBuilderComponent) getConstraint(); Query constraintQuery = luceneQueryBuilderComponent.addComponent(selector, functionArgs, luceneContext, functionContext); + if (constraintQuery == null) + { + throw new UnsupportedOperationException(); + } return constraintQuery; } else 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 62dd58eee1..2797d31ac4 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 @@ -31,12 +31,19 @@ import org.alfresco.repo.search.impl.querymodel.Column; import org.alfresco.repo.search.impl.querymodel.Constraint; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.alfresco.repo.search.impl.querymodel.Negation; +import org.alfresco.repo.search.impl.querymodel.Order; import org.alfresco.repo.search.impl.querymodel.Ordering; +import org.alfresco.repo.search.impl.querymodel.PropertyArgument; import org.alfresco.repo.search.impl.querymodel.Selector; import org.alfresco.repo.search.impl.querymodel.Source; import org.alfresco.repo.search.impl.querymodel.impl.BaseQuery; +import org.alfresco.repo.search.impl.querymodel.impl.functions.PropertyAccessor; +import org.alfresco.repo.search.impl.querymodel.impl.functions.Score; +import org.alfresco.service.namespace.QName; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.Sort; +import org.apache.lucene.search.SortField; import org.apache.lucene.search.BooleanClause.Occur; /** @@ -105,6 +112,10 @@ public class LuceneQuery extends BaseQuery implements LuceneQueryBuilder luceneQuery.add(constraintQuery, Occur.MUST); } } + else + { + throw new UnsupportedOperationException(); + } } else { @@ -116,4 +127,59 @@ public class LuceneQuery extends BaseQuery implements LuceneQueryBuilder } + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilder#buildSort(java.lang.String, + * org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext, + * org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext) + */ + public Sort buildSort(String selectorName, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + { + if ((getOrderings() == null) || (getOrderings().size() == 0)) + { + return null; + } + + int index = 0; + SortField[] fields = new SortField[getOrderings().size()]; + + for (Ordering ordering : getOrderings()) + { + if (ordering.getColumn().getFunction().getName().equals(PropertyAccessor.NAME)) + { + PropertyArgument property = (PropertyArgument) ordering.getColumn().getFunctionArguments().get(PropertyAccessor.ARG_PROPERTY); + + if (property == null) + { + throw new IllegalStateException(); + } + + QName propertyQName = property.getPropertyName(); + + String luceneField = functionContext.getLuceneSortField(propertyQName); + + if (luceneField != null) + { + fields[index++] = new SortField(luceneField, (ordering.getOrder() == Order.DESCENDING)); + } + else + { + throw new IllegalStateException(); + } + } + else if(ordering.getColumn().getFunction().getName().equals(Score.NAME)) + { + fields[index++] = new SortField(null, SortField.SCORE, !(ordering.getOrder() == Order.DESCENDING)); + } + else + { + throw new IllegalStateException(); + } + + } + + return new Sort(fields); + } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilder.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilder.java index 554f0e215b..e2819edfd8 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilder.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilder.java @@ -27,6 +27,7 @@ package org.alfresco.repo.search.impl.querymodel.impl.lucene; import org.alfresco.repo.search.impl.lucene.ParseException; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; import org.apache.lucene.search.Query; +import org.apache.lucene.search.Sort; /** * @author andyh @@ -34,4 +35,6 @@ import org.apache.lucene.search.Query; public interface LuceneQueryBuilder { public Query buildQuery(String selectorName, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) throws ParseException; + + public Sort buildSort(String selectorName, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilderContext.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilderContext.java index ddcc271b06..eb5d0f20a6 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilderContext.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/LuceneQueryBuilderContext.java @@ -32,6 +32,7 @@ import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.namespace.NamespacePrefixResolver; +import org.apache.lucene.index.IndexReader; /** * @author andyh @@ -39,11 +40,11 @@ import org.alfresco.service.namespace.NamespacePrefixResolver; public class LuceneQueryBuilderContext { private LuceneQueryParser lqp; - + private NamespacePrefixResolver namespacePrefixResolver; public LuceneQueryBuilderContext(DictionaryService dictionaryService, NamespacePrefixResolver namespacePrefixResolver, TenantService tenantService, - SearchParameters searchParameters, LuceneConfig config) + SearchParameters searchParameters, LuceneConfig config, IndexReader indexReader) { LuceneAnalyser analyzer = new LuceneAnalyser(dictionaryService, searchParameters.getMlAnalaysisMode() == null ? config.getDefaultMLSearchAnalysisMode() : searchParameters .getMlAnalaysisMode()); @@ -54,7 +55,7 @@ public class LuceneQueryBuilderContext lqp.setTenantService(tenantService); lqp.setSearchParameters(searchParameters); lqp.setLuceneConfig(config); - + lqp.setIndexReader(indexReader); this.namespacePrefixResolver = namespacePrefixResolver; } @@ -71,7 +72,7 @@ public class LuceneQueryBuilderContext */ public NamespacePrefixResolver getNamespacePrefixResolver() { - return namespacePrefixResolver; + return namespacePrefixResolver; } } 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 0b02ec02cf..8e33468c82 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 @@ -47,6 +47,7 @@ import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.namespace.NamespaceService; import org.apache.lucene.search.Hits; +import org.apache.lucene.search.Sort; /** * @author andyh @@ -120,13 +121,14 @@ public class LuceneQueryEngine implements QueryEngine searchParameters.setBulkFetchSize(options.getFetchSize()); if (options.getMaxItems() > 0) { + searchParameters.setLimitBy(LimitBy.FINAL_SIZE); searchParameters.setLimit(options.getMaxItems() + options.getSkipCount()); } else { searchParameters.setLimitBy(LimitBy.UNLIMITED); } - LuceneQueryBuilderContext luceneContext = new LuceneQueryBuilderContext(dictionaryService, namespaceService, tenantService, searchParameters, indexAndSearcher); + try { StoreRef storeRef = options.getStores().get(0); @@ -137,11 +139,26 @@ public class LuceneQueryEngine implements QueryEngine { LuceneSearcher luceneSearcher = (LuceneSearcher) searchService; ClosingIndexSearcher searcher = luceneSearcher.getClosingIndexSearcher(); + LuceneQueryBuilderContext luceneContext = new LuceneQueryBuilderContext(dictionaryService, namespaceService, tenantService, searchParameters, indexAndSearcher, + searcher.getIndexReader()); + LuceneQueryBuilder builder = (LuceneQueryBuilder) query; org.apache.lucene.search.Query luceneQuery = builder.buildQuery(selectorName, luceneContext, functionContext); System.out.println(luceneQuery); - - Hits hits = searcher.search(luceneQuery); + + Sort sort = builder.buildSort(selectorName, luceneContext, functionContext); + + Hits hits; + + if (sort == null) + { + hits = searcher.search(luceneQuery); + } + else + { + hits = searcher.search(luceneQuery, sort); + } + return new LuceneResultSet(hits, searcher, nodeService, tenantService, null, searchParameters, indexAndSearcher); } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneEquals.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneEquals.java index d1e3c7ceb7..9366086b9a 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneEquals.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneEquals.java @@ -30,9 +30,8 @@ import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.search.impl.lucene.ParseException; import org.alfresco.repo.search.impl.querymodel.Argument; import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; -import org.alfresco.repo.search.impl.querymodel.PropertyArgument; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; import org.alfresco.repo.search.impl.querymodel.QueryModelException; -import org.alfresco.repo.search.impl.querymodel.StaticArgument; import org.alfresco.repo.search.impl.querymodel.impl.functions.Equals; import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; @@ -60,50 +59,13 @@ public class LuceneEquals extends Equals implements LuceneQueryBuilderComponent throws ParseException { LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); - Argument lhs = functionArgs.get(ARG_LHS); - Argument rhs = functionArgs.get(ARG_RHS); - - PropertyArgument propertyArgument; - StaticArgument staticArgument; - - if(lhs instanceof PropertyArgument) - { - if(rhs instanceof PropertyArgument) - { - throw new QueryModelException("Implicit join is not supported"); - } - else if(rhs instanceof StaticArgument) - { - propertyArgument = (PropertyArgument)lhs; - staticArgument = (StaticArgument) rhs; - } - else - { - throw new QueryModelException("Argument of type "+rhs.getClass().getName()+" is not supported"); - } - } - else if(rhs instanceof PropertyArgument) - { - if(lhs instanceof StaticArgument) - { - propertyArgument = (PropertyArgument)rhs; - staticArgument = (StaticArgument) lhs; - } - else - { - throw new QueryModelException("Argument of type "+lhs.getClass().getName()+" is not supported"); - } - } - else - { - throw new QueryModelException("Equals must have one property argument"); - } + setPropertyAndStaticArguments(functionArgs); - Query query = functionContext.buildLuceneEquality(lqp, propertyArgument.getPropertyName(), staticArgument.getValue(functionContext)); + Query query = functionContext.buildLuceneEquality(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); if(query == null) { - throw new QueryModelException("No query time mapping for property "+propertyArgument.getPropertyName()+", it should not be allowed in predicates"); + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it should not be allowed in predicates"); } return query; diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThan.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThan.java index 483e3a1eea..0d34cbfb1b 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThan.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThan.java @@ -24,13 +24,23 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.GreaterThan; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.apache.lucene.search.Query; /** * @author andyh - * */ -public class LuceneGreaterThan extends GreaterThan +public class LuceneGreaterThan extends GreaterThan implements LuceneQueryBuilderComponent { /** @@ -41,4 +51,27 @@ public class LuceneGreaterThan extends GreaterThan super(); } + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + setPropertyAndStaticArguments(functionArgs); + + Query query = functionContext.buildLuceneGreaterThan(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); + + if(query == null) + { + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it should not be allowed in predicates"); + } + + return query; + } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThanOrEquals.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThanOrEquals.java index eb02205fd3..03cbbe8f5e 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThanOrEquals.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneGreaterThanOrEquals.java @@ -24,13 +24,24 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.GreaterThanOrEquals; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.apache.lucene.search.Query; /** * @author andyh * */ -public class LuceneGreaterThanOrEquals extends GreaterThanOrEquals +public class LuceneGreaterThanOrEquals extends GreaterThanOrEquals implements LuceneQueryBuilderComponent { /** @@ -40,5 +51,29 @@ public class LuceneGreaterThanOrEquals extends GreaterThanOrEquals { super(); } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + setPropertyAndStaticArguments(functionArgs); + + Query query = functionContext.buildLuceneGreaterThanOrEquals(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); + + if(query == null) + { + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it should not be allowed in predicates"); + } + + return query; + } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneIn.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneIn.java index 37138ca1dd..8016e80e18 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneIn.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneIn.java @@ -24,13 +24,28 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.ListArgument; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.PropertyArgument; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.In; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.apache.lucene.search.Query; /** * @author andyh - * */ -public class LuceneIn extends In +public class LuceneIn extends In implements LuceneQueryBuilderComponent { /** * @@ -39,4 +54,33 @@ public class LuceneIn extends In { super(); } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + @SuppressWarnings("unchecked") + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + PropertyArgument propertyArgument = (PropertyArgument) functionArgs.get(ARG_PROPERTY); + Argument inverseArgument = functionArgs.get(ARG_NOT); + Boolean not = DefaultTypeConverter.INSTANCE.convert(Boolean.class, inverseArgument.getValue(functionContext)); + + ListArgument listArgument = (ListArgument)functionArgs.get(ARG_LIST); + Collection collection = (Collection)listArgument.getValue(functionContext); + + Query query = functionContext.buildLuceneIn(lqp, propertyArgument.getPropertyName(), collection, not, PredicateMode.ANY); + + if (query == null) + { + throw new QueryModelException("No query time mapping for property " + propertyArgument.getPropertyName() + ", it should not be allowed in predicates"); + } + + return query; + } } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThan.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThan.java index e8dbd1b60b..126902d343 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThan.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThan.java @@ -24,13 +24,24 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.LessThan; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.apache.lucene.search.Query; /** * @author andyh * */ -public class LuceneLessThan extends LessThan +public class LuceneLessThan extends LessThan implements LuceneQueryBuilderComponent { /** @@ -41,4 +52,28 @@ public class LuceneLessThan extends LessThan super(); } + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + setPropertyAndStaticArguments(functionArgs); + + Query query = functionContext.buildLuceneLessThan(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); + + if(query == null) + { + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it is not allowed in predicates"); + } + + return query; + } + + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThanOrEquals.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThanOrEquals.java index 89bb2b8bad..176cd70123 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThanOrEquals.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLessThanOrEquals.java @@ -24,13 +24,24 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.LessThanOrEquals; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.apache.lucene.search.Query; /** * @author andyh * */ -public class LuceneLessThanOrEquals extends LessThanOrEquals +public class LuceneLessThanOrEquals extends LessThanOrEquals implements LuceneQueryBuilderComponent { /** @@ -40,5 +51,28 @@ public class LuceneLessThanOrEquals extends LessThanOrEquals { super(); } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + setPropertyAndStaticArguments(functionArgs); + + Query query = functionContext.buildLuceneLessThanOrEquals(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); + if(query == null) + { + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it should not be allowed in predicates"); + } + + return query; + } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLike.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLike.java index 0b93d6b62c..44de816eb9 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLike.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLike.java @@ -24,13 +24,26 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.io.Serializable; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PropertyArgument; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.Like; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.apache.lucene.search.Query; /** * @author andyh * */ -public class LuceneLike extends Like +public class LuceneLike extends Like implements LuceneQueryBuilderComponent { /** @@ -40,5 +53,33 @@ public class LuceneLike extends Like { super(); } + + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + PropertyArgument propertyArgument = (PropertyArgument) functionArgs.get(ARG_PROPERTY); + Argument inverseArgument = functionArgs.get(ARG_NOT); + Boolean not = DefaultTypeConverter.INSTANCE.convert(Boolean.class, inverseArgument.getValue(functionContext)); + Argument expressionArgument = functionArgs.get(ARG_EXP); + Serializable expression = expressionArgument.getValue(functionContext); + + Query query = functionContext.buildLuceneLike(lqp, propertyArgument.getPropertyName(), expression, not); + + if (query == null) + { + throw new QueryModelException("No query time mapping for property " + propertyArgument.getPropertyName() + ", it should not be allowed in predicates"); + } + + return query; + } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLower.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLower.java index c7a590e0e9..e43ddcff71 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLower.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneLower.java @@ -28,7 +28,6 @@ import org.alfresco.repo.search.impl.querymodel.impl.functions.Lower; /** * @author andyh - * */ public class LuceneLower extends Lower { @@ -40,4 +39,5 @@ public class LuceneLower extends Lower { super(); } + } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneNotEquals.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneNotEquals.java index b50d8442b0..2f18d1ef7c 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneNotEquals.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/lucene/functions/LuceneNotEquals.java @@ -24,13 +24,24 @@ */ package org.alfresco.repo.search.impl.querymodel.impl.lucene.functions; +import java.util.Map; + +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.Argument; +import org.alfresco.repo.search.impl.querymodel.FunctionEvaluationContext; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.repo.search.impl.querymodel.QueryModelException; import org.alfresco.repo.search.impl.querymodel.impl.functions.NotEquals; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent; +import org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderContext; +import org.apache.lucene.search.Query; /** * @author andyh * */ -public class LuceneNotEquals extends NotEquals +public class LuceneNotEquals extends NotEquals implements LuceneQueryBuilderComponent { /** @@ -41,4 +52,28 @@ public class LuceneNotEquals extends NotEquals super(); } + /* + * (non-Javadoc) + * + * @see org.alfresco.repo.search.impl.querymodel.impl.lucene.LuceneQueryBuilderComponent#addComponent(org.apache.lucene.search.BooleanQuery, + * org.apache.lucene.search.BooleanQuery, org.alfresco.service.cmr.dictionary.DictionaryService, + * java.lang.String) + */ + public Query addComponent(String selector, Map functionArgs, LuceneQueryBuilderContext luceneContext, FunctionEvaluationContext functionContext) + throws ParseException + { + LuceneQueryParser lqp = luceneContext.getLuceneQueryParser(); + setPropertyAndStaticArguments(functionArgs); + + Query query = functionContext.buildLuceneInequality(lqp, getPropertyArgument().getPropertyName(), getStaticArgument().getValue(functionContext), PredicateMode.ANY); + + if(query == null) + { + throw new QueryModelException("No query time mapping for property "+getPropertyArgument().getPropertyName()+", it should not be allowed in predicates"); + } + + return query; + } + + } diff --git a/source/java/org/alfresco/util/SearchLanguageConversion.java b/source/java/org/alfresco/util/SearchLanguageConversion.java index 817b73cfa3..6c26f4a4d0 100644 --- a/source/java/org/alfresco/util/SearchLanguageConversion.java +++ b/source/java/org/alfresco/util/SearchLanguageConversion.java @@ -26,44 +26,60 @@ package org.alfresco.util; import org.alfresco.repo.search.impl.lucene.QueryParser; - /** * Helper class to provide conversions between different search languages + * * @author Derek Hulley */ public class SearchLanguageConversion { + /** + * SQL like query language summary: + *
    + *
  • Escape: \
  • + *
  • Single char search: _
  • + *
  • Multiple char search: %
  • + *
  • Reserved: \%_
  • + *
+ */ + public static LanguageDefinition DEF_SQL_LIKE = new SimpleLanguageDef('\\', "%", "_", "\\%_[]"); + /** * XPath like query language summary: *
    - *
  • Escape: \
  • - *
  • Single char search: _
  • - *
  • Multiple char search: %
  • - *
  • Reserved: \%_
  • + *
  • Escape: \
  • + *
  • Single char search: _
  • + *
  • Multiple char search: %
  • + *
  • Reserved: \%_
  • *
*/ public static LanguageDefinition DEF_XPATH_LIKE = new SimpleLanguageDef('\\', "%", "_", "\\%_[]"); + /** * Regular expression query language summary: *
    - *
  • Escape: \
  • - *
  • Single char search: .
  • - *
  • Multiple char search: .*
  • - *
  • Reserved: \*.+?^$(){}|
  • + *
  • Escape: \
  • + *
  • Single char search: .
  • + *
  • Multiple char search: .*
  • + *
  • Reserved: \*.+?^$(){}|
  • *
*/ public static LanguageDefinition DEF_REGEX = new SimpleLanguageDef('\\', ".*", ".", "\\*.+?^$(){}|"); + /** * Lucene syntax summary: {@link QueryParser#escape(String) Lucene Query Parser} */ - public static LanguageDefinition DEF_LUCENE = new LuceneLanguageDef(); + public static LanguageDefinition DEF_LUCENE = new LuceneLanguageDef(true); + + public static LanguageDefinition DEF_LUCENE_INTERNAL = new LuceneLanguageDef(false); + /** * CIFS name patch query language summary: *
    - *
  • Escape: \ (but not used)
  • - *
  • Single char search: ?
  • - *
  • Multiple char search: *
  • - *
  • Reserved: "*\<>?/:|¬£%&+;
  • + *
  • Escape: \ (but not used)
  • + *
  • Single char search: ?
  • + *
  • Multiple char search: *
  • + *
  • Reserved: "*\<>?/:|¬£%&+;
  • *
*/ public static LanguageDefinition DEF_CIFS = new SimpleLanguageDef('\\', "*", "?", "\"*\\<>?/:|£%&+;"); @@ -71,43 +87,46 @@ public class SearchLanguageConversion /** * Escape a string according to the XPath like function syntax. * - * @param str the string to escape + * @param str + * the string to escape * @return Returns the escaped string */ public static String escapeForXPathLike(String str) { return escape(DEF_XPATH_LIKE, str); } - + /** * Escape a string according to the regex language syntax. * - * @param str the string to escape + * @param str + * the string to escape * @return Returns the escaped string */ public static String escapeForRegex(String str) { return escape(DEF_REGEX, str); } - + /** * Escape a string according to the Lucene query syntax. * - * @param str the string to escape + * @param str + * the string to escape * @return Returns the escaped string */ public static String escapeForLucene(String str) { return escape(DEF_LUCENE, str); } - + /** * Generic escaping using the language definition */ private static String escape(LanguageDefinition def, String str) { StringBuilder sb = new StringBuilder(str.length() * 2); - + char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { @@ -121,124 +140,161 @@ public class SearchLanguageConversion } return sb.toString(); } - + /** * Convert an xpath like function clause into a regex query. * * @param xpathLikeClause - * @return Returns a valid regular expression that is equivalent to the - * given xpath like clause. + * @return Returns a valid regular expression that is equivalent to the given xpath like clause. */ public static String convertXPathLikeToRegex(String xpathLikeClause) { return "(?s)" + convert(DEF_XPATH_LIKE, DEF_REGEX, xpathLikeClause); } - + /** * Convert an xpath like function clause into a Lucene query. * * @param xpathLikeClause - * @return Returns a valid Lucene expression that is equivalent to the - * given xpath like clause. + * @return Returns a valid Lucene expression that is equivalent to the given xpath like clause. */ public static String convertXPathLikeToLucene(String xpathLikeClause) { return convert(DEF_XPATH_LIKE, DEF_LUCENE, xpathLikeClause); } - + + /** + * Convert a sql like function clause into a Lucene query. + * + * @param sqlLikeClause + * @return Returns a valid Lucene expression that is equivalent to the given sql like clause. + */ + public static String convertSQLLikeToLucene(String sqlLikeClause) + { + return convert(DEF_SQL_LIKE, DEF_LUCENE_INTERNAL, sqlLikeClause); + } + + /** + * Convert a sql like function clause into a regex query. + * + * @param sqlLikeClause + * @return Returns a valid regular expression that is equivalent to the given sql like clause. + */ + public static String convertSQLLikeToRegex(String sqlLikeClause) + { + return "(?s)" + convert(DEF_SQL_LIKE, DEF_REGEX, sqlLikeClause); + } + /** * Convert a CIFS name path into the equivalent Lucene query. * - * @param cifsNamePath the CIFS named path - * @return Returns a valid Lucene expression that is equivalent to the - * given CIFS name path + * @param cifsNamePath + * the CIFS named path + * @return Returns a valid Lucene expression that is equivalent to the given CIFS name path */ public static String convertCifsToLucene(String cifsNamePath) { return convert(DEF_CIFS, DEF_LUCENE, cifsNamePath); } - + public static String convert(LanguageDefinition from, LanguageDefinition to, String query) { char[] chars = query.toCharArray(); - + StringBuilder sb = new StringBuilder(chars.length * 2); - + boolean escaping = false; - + for (int i = 0; i < chars.length; i++) { - if (escaping) // if we are currently escaping, just escape the current character + if (escaping) // if we are currently escaping, just escape the current character { - sb.append(to.escapeChar); // the to format escape char - sb.append(chars[i]); // the current char + sb.append(to.escapeChar); // the to format escape char + sb.append(chars[i]); // the current char escaping = false; } - else if (chars[i] == from.escapeChar) // not escaping and have escape char + else if (chars[i] == from.escapeChar) // not escaping and have escape char { escaping = true; } - else if (query.startsWith(from.multiCharWildcard, i)) // not escaping but have multi-char wildcard + else if (query.startsWith(from.multiCharWildcard, i)) // not escaping but have multi-char wildcard { // translate the wildcard sb.append(to.multiCharWildcard); } - else if (query.startsWith(from.singleCharWildcard, i)) // have single-char wildcard + else if (query.startsWith(from.singleCharWildcard, i)) // have single-char wildcard { // translate the wildcard sb.append(to.singleCharWildcard); } - else if (to.isReserved(chars[i])) // reserved character + else if (to.isReserved(chars[i])) // reserved character { sb.append(to.escapeChar).append(chars[i]); } - else // just a normal char in both + else + // just a normal char in both { sb.append(chars[i]); } } return sb.toString(); } - + /** * Simple store of special characters for a given query language */ public static abstract class LanguageDefinition { public final char escapeChar; + public final String multiCharWildcard; + public final String singleCharWildcard; - + public LanguageDefinition(char escapeChar, String multiCharWildcard, String singleCharWildcard) { this.escapeChar = escapeChar; this.multiCharWildcard = multiCharWildcard; this.singleCharWildcard = singleCharWildcard; } + public abstract boolean isReserved(char ch); } + private static class SimpleLanguageDef extends LanguageDefinition { private String reserved; + public SimpleLanguageDef(char escapeChar, String multiCharWildcard, String singleCharWildcard, String reserved) { super(escapeChar, multiCharWildcard, singleCharWildcard); - this.reserved = reserved; + this.reserved = reserved; } + @Override public boolean isReserved(char ch) { return (reserved.indexOf(ch) > -1); } } + private static class LuceneLanguageDef extends LanguageDefinition { private String reserved; - public LuceneLanguageDef() + + public LuceneLanguageDef(boolean reserve) { super('\\', "*", "?"); - init(); + if (reserve) + { + init(); + } + else + { + reserved = ""; + } } + /** * Discovers all the reserved chars */ @@ -247,7 +303,7 @@ public class SearchLanguageConversion StringBuilder sb = new StringBuilder(20); for (char ch = 0; ch < 256; ch++) { - char[] chars = new char[] {ch}; + char[] chars = new char[] { ch }; String unescaped = new String(chars); // check it String escaped = QueryParser.escape(unescaped); @@ -259,6 +315,7 @@ public class SearchLanguageConversion } reserved = sb.toString(); } + @Override public boolean isReserved(char ch) {