From c16a9548f05099dc8a67568a86a970f30aa84e61 Mon Sep 17 00:00:00 2001 From: David Caruana Date: Fri, 30 Oct 2009 14:53:18 +0000 Subject: [PATCH] Merged CMIS063 to HEAD 17143: Add Alfresco Restful Binding Reference link to CMIS Front Page 17144: Fix up link - not hard code to localhost. 17150: Updates for CMIS going to Public Review. 17151: CMIS 1.0cd04 update 17186: CMIS Query updates - part of MOB-232 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@17261 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/cmis/CMISDictionaryService.java | 14 +- .../CMISAbstractDictionaryService.java | 20 ++- .../alfresco/cmis/search/CMISQueryParser.java | 136 ++++++++++++++---- .../org/alfresco/cmis/search/QueryTest.java | 105 ++++++++++---- 4 files changed, 209 insertions(+), 66 deletions(-) diff --git a/source/java/org/alfresco/cmis/CMISDictionaryService.java b/source/java/org/alfresco/cmis/CMISDictionaryService.java index 7b4921d499..4f530d8a8d 100644 --- a/source/java/org/alfresco/cmis/CMISDictionaryService.java +++ b/source/java/org/alfresco/cmis/CMISDictionaryService.java @@ -60,12 +60,20 @@ public interface CMISDictionaryService public CMISTypeDefinition findTypeForClass(QName clazz, CMISScope... matchingScopes); /** - * Find type for table + * Find a type by its query name * - * @param tableName + * @param queryName * @return */ - public CMISTypeDefinition findTypeForTable(String tableName); + public CMISTypeDefinition findTypeByQueryName(String queryName); + + /** + * Find a property by its query name + * + * @param queryName + * @return + */ + public CMISPropertyDefinition findPropertyByQueryName(String queryName); /** * Get Base Types diff --git a/source/java/org/alfresco/cmis/dictionary/CMISAbstractDictionaryService.java b/source/java/org/alfresco/cmis/dictionary/CMISAbstractDictionaryService.java index 87d76989ae..66e150c278 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISAbstractDictionaryService.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISAbstractDictionaryService.java @@ -126,13 +126,14 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea Map assocDefsByQName = new HashMap(); Map objectDefsByTypeId = new HashMap(); Map typeDefsByTypeId = new HashMap(); - Map typeDefsByTable = new HashMap(); + Map typeDefsByQueryName = new HashMap(); List baseTypes = new ArrayList(); // Property Definitions Index Map propDefsById = new HashMap(); Map propDefsByQName = new HashMap(); Map propDefsByPropId = new HashMap(); + Map propDefsByQueryName = new HashMap(); /** * Register Type Definition @@ -163,7 +164,7 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea } } typeDefsByTypeId.put(typeDef.getTypeId(), typeDef); - typeDefsByTable.put(typeDef.getQueryName().toLowerCase(), typeDef); + typeDefsByQueryName.put(typeDef.getQueryName().toLowerCase(), typeDef); } if (logger.isDebugEnabled()) @@ -191,6 +192,7 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea propDefsByPropId.put(propDef.getPropertyId(), propDef); propDefsByQName.put(propDef.getPropertyId().getQName(), propDef); propDefsById.put(propDef.getPropertyId().getId().toLowerCase(), propDef); + propDefsByQueryName.put(propDef.getQueryName().toLowerCase(), propDef); if (logger.isDebugEnabled()) { @@ -304,12 +306,22 @@ public abstract class CMISAbstractDictionaryService extends AbstractLifecycleBea * (non-Javadoc) * @see org.alfresco.cmis.dictionary.CMISDictionaryService#findTypeForTable(java.lang.String) */ - public CMISTypeDefinition findTypeForTable(String tableName) + public CMISTypeDefinition findTypeByQueryName(String queryName) { - CMISTypeDefinition typeDef = getRegistry().typeDefsByTable.get(tableName.toLowerCase()); + CMISTypeDefinition typeDef = getRegistry().typeDefsByQueryName.get(queryName.toLowerCase()); return typeDef; } + + /* (non-Javadoc) + * @see org.alfresco.cmis.CMISDictionaryService#findPropertyByQueryName(java.lang.String) + */ + public CMISPropertyDefinition findPropertyByQueryName(String queryName) + { + CMISPropertyDefinition propertyDef = getRegistry().propDefsByQueryName.get(queryName.toLowerCase()); + return propertyDef; + } + /* * (non-Javadoc) * @see org.alfresco.cmis.CMISDictionaryService#getBaseTypes() diff --git a/source/java/org/alfresco/cmis/search/CMISQueryParser.java b/source/java/org/alfresco/cmis/search/CMISQueryParser.java index fe61bb12f0..df6dbb2106 100644 --- a/source/java/org/alfresco/cmis/search/CMISQueryParser.java +++ b/source/java/org/alfresco/cmis/search/CMISQueryParser.java @@ -126,6 +126,7 @@ public class CMISQueryParser CMISLexer lexer = new CMISLexer(cs); CommonTokenStream tokens = new CommonTokenStream(lexer); parser = new CMISParser(tokens); + parser.setStrict(options.getQueryMode() == CMISQueryMode.CMS_STRICT); CommonTree queryNode = (CommonTree) parser.query().getTree(); CommonTree sourceNode = (CommonTree) queryNode.getFirstChildWithType(CMISParser.SOURCE); @@ -365,6 +366,14 @@ public class CMISQueryParser case CMISParser.PRED_FTS: String ftsExpression = predicateNode.getChild(0).getText(); FTSQueryParser ftsQueryParser = new FTSQueryParser(); + if (options.getQueryMode() == CMISQueryMode.CMS_STRICT) + { + // set default AND + } + else + { + // set default from the options + } Selector selector; if (predicateNode.getChildCount() > 1) { @@ -468,6 +477,11 @@ public class CMISQueryParser break; } } + // in strict mode the ordered column must be selected + if ((options.getQueryMode() == CMISQueryMode.CMS_STRICT) && (match == null)) + { + throw new CMISQueryException("Ordered column is not selected: " + qualifier + "." + columnName); + } if (match == null) { @@ -489,12 +503,35 @@ public class CMISQueryParser { throw new CMISQueryException("Type unsupported in CMIS queries: " + selector.getAlias()); } - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(columnName, typeDef); + CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(columnName); if (propDef == null) { throw new CMISQueryException("Invalid column for " + typeDef.getQueryName() + "." + columnName); } + // check there is a matching selector + + if (options.getQueryMode() == CMISQueryMode.CMS_STRICT) + { + boolean found = false; + for (Column column : columns) + { + if (column.getFunction().getName().equals(PropertyAccessor.NAME)) + { + PropertyArgument pa = (PropertyArgument) column.getFunctionArguments().get(PropertyAccessor.ARG_PROPERTY); + if (pa.getPropertyName().equals(propDef.getPropertyId().getId())) + { + found = true; + break; + } + } + } + if (!found) + { + throw new CMISQueryException("Ordered column is not selected: " + qualifier + "." + columnName); + } + } + Function function = factory.getFunction(PropertyAccessor.NAME); Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef .getPropertyId().getId()); @@ -528,12 +565,35 @@ public class CMISQueryParser { throw new CMISQueryException("Type unsupported in CMIS queries: " + selector.getAlias()); } - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(columnName, typeDef); + CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(columnName); if (propDef == null) { throw new CMISQueryException("Invalid column for " + typeDef.getQueryName() + "." + columnName + " selector alias " + selector.getAlias()); } + // check there is a matching selector + + if (options.getQueryMode() == CMISQueryMode.CMS_STRICT) + { + boolean found = false; + for (Column column : columns) + { + if (column.getFunction().getName().equals(PropertyAccessor.NAME)) + { + PropertyArgument pa = (PropertyArgument) column.getFunctionArguments().get(PropertyAccessor.ARG_PROPERTY); + if (pa.getPropertyName().equals(propDef.getPropertyId().getId())) + { + found = true; + break; + } + } + } + if (!found) + { + throw new CMISQueryException("Ordered column is not selected: " + qualifier + "." + columnName); + } + } + Function function = factory.getFunction(PropertyAccessor.NAME); Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, propDef.isQueryable(), propDef.isOrderable(), selector.getAlias(), propDef .getPropertyId().getId()); @@ -545,7 +605,7 @@ public class CMISQueryParser orderColumn = factory.createColumn(function, functionArguments, alias); } - if (!orderColumn.isOrderable()) + if (!orderColumn.isOrderable() || !orderColumn.isQueryable()) { throw new CMISQueryException("Ordering is not support for " + orderColumn.getAlias()); } @@ -585,7 +645,10 @@ public class CMISQueryParser functionArguments.put(arg.getName(), arg); String alias = (selector.getAlias().length() > 0) ? selector.getAlias() + "." + definition.getPropertyId().getId() : definition.getPropertyId().getId(); Column column = factory.createColumn(function, functionArguments, alias); - columns.add(column); + if (column.isQueryable()) + { + columns.add(column); + } } } } @@ -629,7 +692,10 @@ public class CMISQueryParser functionArguments.put(arg.getName(), arg); String alias = (selector.getAlias().length() > 0) ? selector.getAlias() + "." + definition.getPropertyId().getId() : definition.getPropertyId().getId(); Column column = factory.createColumn(function, functionArguments, alias); - columns.add(column); + if (column.isQueryable()) + { + columns.add(column); + } } } } @@ -663,7 +729,7 @@ public class CMISQueryParser { throw new CMISQueryException("Type unsupported in CMIS queries: " + selector.getAlias()); } - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(columnName, typeDef); + CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(columnName); if (propDef == null) { throw new CMISQueryException("Invalid column for " + typeDef.getQueryName() + "." + columnName); @@ -682,6 +748,12 @@ public class CMISQueryParser } Column column = factory.createColumn(function, functionArguments, alias); + + if (!column.isQueryable()) + { + throw new CMISQueryException("Column is not queryable " + typeDef.getQueryName() + "." + columnName); + } + columns.add(column); } @@ -691,9 +763,9 @@ public class CMISQueryParser { CommonTree functionNameNode = (CommonTree) functionNode.getChild(0); Function function = factory.getFunction(functionNameNode.getText()); - if(function == null) + if (function == null) { - throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); + throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); } Collection definitions = function.getArgumentDefinitions().values(); Map functionArguments = new LinkedHashMap(); @@ -731,7 +803,7 @@ public class CMISQueryParser int end = getStringPosition(query, rparenNode.getLine(), rparenNode.getCharPositionInLine()); String alias; - if(function.getName().equals(Score.NAME)) + if (function.getName().equals(Score.NAME)) { alias = "SEARCH_SCORE"; // check no args @@ -813,7 +885,7 @@ public class CMISQueryParser } else { - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(id, null); + CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(id); if (propDef == null || !propDef.isQueryable()) { throw new CMISQueryException("Column refers to unqueryable property " + definition.getName()); @@ -875,24 +947,23 @@ public class CMISQueryParser String text = argNode.getChild(0).getText(); text = text.substring(1, text.length() - 1); StringBuilder builder = new StringBuilder(); - if(text.endsWith("Z")) - { - builder.append(text.substring(0, text.length() - 1)); + if (text.endsWith("Z")) + { + builder.append(text.substring(0, text.length() - 1)); builder.append("+0000"); } else { - if(text.charAt( text.length() - 3) != ':') + if (text.charAt(text.length() - 3) != ':') { throw new CMISQueryException("Invalid datetime literal " + text); } // remove TZ colon .... - builder.append(text.substring(0, text.length() - 3)); + builder.append(text.substring(0, text.length() - 3)); builder.append(text.substring(text.length() - 2, text.length())); } text = builder.toString(); - - + SimpleDateFormat df = CachingDateFormat.getCmisSqlDatetimeFormat(); Date date; try @@ -911,16 +982,16 @@ public class CMISQueryParser else if (argNode.getType() == CMISParser.BOOLEAN_LITERAL) { String text = argNode.getChild(0).getText(); - if(text.equalsIgnoreCase("TRUE") || text.equalsIgnoreCase("FALSE")) + if (text.equalsIgnoreCase("TRUE") || text.equalsIgnoreCase("FALSE")) { LiteralArgument arg = factory.createLiteralArgument(definition.getName(), DataTypeDefinition.TEXT, text); - return arg; + return arg; } else { throw new CMISQueryException("Invalid boolean literal " + text); } - + } else if (argNode.getType() == CMISParser.LIST) { @@ -951,9 +1022,9 @@ public class CMISQueryParser { CommonTree functionNameNode = (CommonTree) argNode.getChild(0); Function function = factory.getFunction(functionNameNode.getText()); - if(function == null) + if (function == null) { - throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); + throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); } Collection definitions = function.getArgumentDefinitions().values(); Map functionArguments = new LinkedHashMap(); @@ -1023,7 +1094,7 @@ public class CMISQueryParser alias = singleTableNode.getChild(1).getText(); } - CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForTable(tableName); + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeByQueryName(tableName); if (typeDef == null) { throw new CMISQueryException("Type is unsupported in query: " + tableName); @@ -1054,7 +1125,7 @@ public class CMISQueryParser { alias = singleTableNode.getChild(1).getText(); } - CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForTable(tableName); + CMISTypeDefinition typeDef = cmisDictionaryService.findTypeByQueryName(tableName); if (typeDef == null) { throw new CMISQueryException("Type is unsupported in query " + tableName); @@ -1098,14 +1169,14 @@ public class CMISQueryParser throw new CMISQueryException("No table with alias " + arg1.getSelector()); } CommonTree functionNameNode = (CommonTree) joinConditionNode.getChild(1); - if(functionNameNode.getType()!= CMISParser.EQUALS) + if (functionNameNode.getType() != CMISParser.EQUALS) { - throw new CMISQueryException("Only Equi-join is supported " + functionNameNode.getText()); + throw new CMISQueryException("Only Equi-join is supported " + functionNameNode.getText()); } Function function = factory.getFunction(Equals.NAME); - if(function == null) + if (function == null) { - throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); + throw new CMISQueryException("Unknown function: " + functionNameNode.getText()); } PropertyArgument arg2 = buildColumnReference(Equals.ARG_RHS, (CommonTree) joinConditionNode.getChild(2), factory); if (!lhs.getSelectors().containsKey(arg2.getSelector()) && !rhs.getSelectors().containsKey(arg2.getSelector())) @@ -1136,11 +1207,18 @@ public class CMISQueryParser { qualifer = columnReferenceNode.getChild(1).getText(); } - CMISPropertyDefinition propDef = cmisDictionaryService.findProperty(cmisPropertyName, null); + CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(cmisPropertyName); if (propDef == null) { throw new CMISQueryException("Unknown column/property " + cmisPropertyName); } + if (options.getQueryMode() == CMISQueryMode.CMS_STRICT) + { + if (!propDef.isQueryable()) + { + throw new CMISQueryException("Column is not queryable " + qualifer + "." + cmisPropertyName); + } + } return factory.createPropertyArgument(argumentName, propDef.isQueryable(), propDef.isOrderable(), qualifer, propDef.getPropertyId().getId()); } diff --git a/source/java/org/alfresco/cmis/search/QueryTest.java b/source/java/org/alfresco/cmis/search/QueryTest.java index ee03fd0e4e..b83ecc081a 100644 --- a/source/java/org/alfresco/cmis/search/QueryTest.java +++ b/source/java/org/alfresco/cmis/search/QueryTest.java @@ -35,6 +35,7 @@ import java.util.Locale; import java.util.Map; import org.alfresco.cmis.CMISDictionaryModel; +import org.alfresco.cmis.CMISPropertyDefinition; import org.alfresco.cmis.CMISQueryException; import org.alfresco.cmis.CMISQueryOptions; import org.alfresco.cmis.CMISResultSet; @@ -305,6 +306,11 @@ public class QueryTest extends BaseCMISTest { return testQuery(query, size, dump, returnPropertyName, returnType, shouldThrow, CMISQueryMode.CMS_STRICT); } + + private T testExtendedQuery(String query, int size, boolean dump, String returnPropertyName, T returnType, boolean shouldThrow) + { + return testQuery(query, size, dump, returnPropertyName, returnType, shouldThrow, CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS); + } @SuppressWarnings("unchecked") private T testQuery(String query, int size, boolean dump, String returnPropertyName, T returnType, boolean shouldThrow, CMISQueryMode mode) @@ -1345,9 +1351,9 @@ public class QueryTest extends BaseCMISTest public void testOrderBy() { - String query = "SELECT cmis:objectId FROM cmis:document ORDER BY cmis:objectId"; - CMISResultSet rs = cmisQueryService.query(query); - // assertEquals(1, rs.getLength()); + CMISQueryOptions options = new CMISQueryOptions("SELECT cmis:objectId FROM cmis:folder ORDER BY cmis:objectId", rootNodeRef.getStoreRef()); + CMISResultSet rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); @@ -1355,9 +1361,9 @@ public class QueryTest extends BaseCMISTest rs.close(); rs = null; - query = "SELECT cmis:objectId FROM cmis:document ORDER BY cmis:objectId ASC"; - rs = cmisQueryService.query(query); - // assertEquals(1, rs.getLength()); + options = new CMISQueryOptions("SELECT cmis:objectId FROM cmis:folder ORDER BY cmis:objectId ASC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); @@ -1365,9 +1371,19 @@ public class QueryTest extends BaseCMISTest rs.close(); rs = null; - query = "SELECT cmis:objectId FROM cmis:document ORDER BY cmis:objectId DESC"; - rs = cmisQueryService.query(query); - // assertEquals(1, rs.getLength()); + options = new CMISQueryOptions("SELECT cmis:objectId FROM cmis:folder ORDER BY cmis:objectId DESC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + options = new CMISQueryOptions("SELECT D.cmis:objectId FROM cmis:folder D ORDER BY D.cmis:objectId DESC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); @@ -1375,9 +1391,19 @@ public class QueryTest extends BaseCMISTest rs.close(); rs = null; - query = "SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name IN ('company', 'home') ORDER BY MEEP ASC"; - rs = cmisQueryService.query(query); - // assertEquals(1, rs.getLength()); + options = new CMISQueryOptions("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder ORDER BY MEEP ASC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); + for (CMISResultSetRow row : rs) + { + System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); + } + rs.close(); + rs = null; + + options = new CMISQueryOptions("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder ORDER BY MEEP ASC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); @@ -1385,9 +1411,9 @@ public class QueryTest extends BaseCMISTest rs.close(); rs = null; - query = "SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name IN ('company', 'home') ORDER BY MEEP DESC"; - rs = cmisQueryService.query(query); - // assertEquals(1, rs.getLength()); + options = new CMISQueryOptions("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder ORDER BY MEEP DESC", rootNodeRef.getStoreRef()); + rs = cmisQueryService.query(options); + assertEquals(folder_count, rs.getLength()); for (CMISResultSetRow row : rs) { System.out.println(row.getValue("cmis:objectId") + " Score " + row.getScore() + " " + row.getScores()); @@ -1395,26 +1421,36 @@ public class QueryTest extends BaseCMISTest rs.close(); rs = null; + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name = 'compan home') ORDER BY SCORE() DESC", 1, false, "cmis:objectId", new String(), true); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name IN ('company', 'home') ORDER BY MEEEP DESC", 1, false, "cmis:objectId", new String(), true); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name IN ('company', 'home') ORDER BY cmis:parentId DESC", 1, false, "cmis:objectId", new String(), true); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId, cmis:parentId FROM cmis:folder ORDER BY cmis:parentId DESC", folder_count, false, "cmis:objectId", new String(), false); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder WHERE cmis:name IN ('company', 'home') ORDER BY cmis:notThere DESC", 1, false, "cmis:objectId", new String(), true); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder as F WHERE cmis:name IN ('company', 'home') ORDER BY F.cmis:parentId DESC", 1, false, "cmis:objectId", new String(), true); + testQuery("SELECT SCORE() AS MEEP, cmis:objectId FROM cmis:folder F WHERE cmis:name IN ('company', 'home') ORDER BY F.cmis:notThere DESC", 1, false, "cmis:objectId", new String(), true); + } public void testUpperAndLower() { - testQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'Folder 1'", 1, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'FOLDER 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'folder 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'FOLDER 1'", 1, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'folder 1'", 1, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'folder 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'FOLDER 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'Folder 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'Folder 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'Folder 1'", 1, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'FOLDER 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE cmis:name = 'folder 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'FOLDER 1'", 1, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'folder 1'", 1, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'folder 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'FOLDER 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) = 'Folder 1'", 0, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Lower(cmis:name) = 'Folder 1'", 0, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) <> 'FOLDER 1'", 9, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) <> 'FOLDER 1'", 9, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) <= 'FOLDER 1'", 2, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) < 'FOLDER 1'", 1, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) >= 'FOLDER 1'", 9, false, "cmis:objectId", new String(), false); - testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) > 'FOLDER 1'", 8, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) <= 'FOLDER 1'", 2, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) < 'FOLDER 1'", 1, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) >= 'FOLDER 1'", 9, false, "cmis:objectId", new String(), false); + testExtendedQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) > 'FOLDER 1'", 8, false, "cmis:objectId", new String(), false); + + testQuery("SELECT * FROM cmis:folder WHERE Upper(cmis:name) > 'FOLDER 1'", 8, false, "cmis:objectId", new String(), true); } public void testAllSimpleTextPredicates() @@ -1536,7 +1572,15 @@ public class QueryTest extends BaseCMISTest CMISResultSetMetaData md = rs.getMetaData(); assertNotNull(md.getQueryOptions()); CMISTypeDefinition typeDef = cmisDictionaryService.findType(CMISDictionaryModel.DOCUMENT_TYPE_ID); - assertEquals(typeDef.getPropertyDefinitions().size(), md.getColumnNames().length); + int count = 0; + for(CMISPropertyDefinition pdef : typeDef.getPropertyDefinitions().values()) + { + if(pdef.isQueryable()) + { + count++; + } + } + assertEquals(count, md.getColumnNames().length); assertNotNull(md.getColumn(CMISDictionaryModel.PROP_OBJECT_ID)); assertEquals(1, md.getSelectors().length); assertNotNull(md.getSelector("")); @@ -1637,6 +1681,7 @@ public class QueryTest extends BaseCMISTest CMISQueryOptions options = new CMISQueryOptions( "SELECT DOC.cmis:name AS cmis:name, \nLOWER(\tDOC.cmis:name \n), LOWER ( DOC.cmis:name ) AS Lcmis:name, UPPER ( DOC.cmis:name ) , UPPER(DOC.cmis:name) AS Ucmis:name, Score(), SCORE() AS S1, SCORE() AS SCORED FROM cmis:folder AS DOC", rootNodeRef.getStoreRef()); + options.setQueryMode(CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS); CMISResultSet rs = cmisQueryService.query(options); CMISResultSetMetaData md = rs.getMetaData();