Author: jens
Date: Fri Dec 14 15:41:54 2012
New Revision: 1421942
URL: http://svn.apache.org/viewvc?rev=1421942&view=rev
Log:
InMemory: support of secondary types in query
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
URL:
http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java?rev=1421942&r1=1421941&r2=1421942&view=diff
==============================================================================
---
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
(original)
+++
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
Fri Dec 14 15:41:54 2012
@@ -148,7 +148,9 @@ public class InMemoryQueryProcessor {
TypeDefinition fromType = queryObj.getMainFromName();
for (StoredObject so : matches) {
- TypeDefinition td =
tm.getTypeById(so.getTypeId()).getTypeDefinition();
+ String queryName = queryObj.getTypes().values().iterator().next();
+ TypeDefinition td =
queryObj.getTypeDefinitionFromQueryName(queryName);
+
ObjectData od =
PropertyCreationHelper.getObjectDataQueryResult(td, so, user, props, funcs,
fromType, includeAllowableActions, includeRelationships,
renditionFilter);
@@ -164,6 +166,13 @@ public class InMemoryQueryProcessor {
if (typeId.equals(td.getId())) {
return true;
}
+ // check secondary types
+ List<String> secTypeIds = so.getSecondaryTypeIds();
+ for (String secTypeId: secTypeIds) {
+ if (secTypeId.equals(td.getId())) {
+ return true;
+ }
+ }
// check parent type
TypeDefinition parentTD = queryObj.getParentType(typeId);
typeId = parentTD == null ? null : parentTD.getId();
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java
URL:
http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java?rev=1421942&r1=1421941&r2=1421942&view=diff
==============================================================================
---
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java
(original)
+++
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java
Fri Dec 14 15:41:54 2012
@@ -44,6 +44,7 @@ import org.apache.chemistry.opencmis.com
import
org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyUriDefinitionImpl;
import
org.apache.chemistry.opencmis.inmemory.types.InMemoryDocumentTypeDefinition;
import
org.apache.chemistry.opencmis.inmemory.types.InMemoryFolderTypeDefinition;
+import
org.apache.chemistry.opencmis.inmemory.types.InMemorySecondaryTypeDefinition;
import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
public class UnitTestTypeSystemCreator implements TypeCreator {
@@ -55,6 +56,7 @@ public class UnitTestTypeSystemCreator i
public static final String VERSIONED_TYPE = "MyVersionedType";
public static final String VERSION_PROPERTY_ID = "StringProp";
public static final String FOLDER_TYPE = "FolderType";
+ public static final String SECONDARY_TYPE = "MySecondaryType";
public static final String PROP_ID_BOOLEAN = "BooleanProp";
public static final String PROP_ID_DATETIME = "DateTimeProp";
@@ -72,6 +74,8 @@ public class UnitTestTypeSystemCreator i
public static final String PROP_ID_INT_MULTI_VALUE = "IntPropMV";
public static final String PROP_ID_STRING_MULTI_VALUE = "StringPropMV";
public static final String PROP_ID_URI_MULTI_VALUE = "UriPropMV";
+ public static final String SECONDARY_STRING_PROP = "SecondaryStringProp";
+ public static final String SECONDARY_INTEGER_PROP = "SecondaryIntegerProp";
/**
* in the public interface of this class we return the singleton containing
@@ -312,13 +316,29 @@ public class UnitTestTypeSystemCreator i
propertyDefinitions.put(prop7.getId(), prop7);
cmisFolderType.addCustomPropertyDefinitions(propertyDefinitions);
-
+ // CMIS 1.1 create a secondary type
+ InMemorySecondaryTypeDefinition cmisSecondaryType = new
InMemorySecondaryTypeDefinition(SECONDARY_TYPE,
+ "MySecondaryType");
+ // create a single String property definition
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl propStr =
PropertyCreationHelper.createStringDefinition(SECONDARY_STRING_PROP,
+ "Secondary String Property", Updatability.READWRITE);
+ propertyDefinitions.put(propStr.getId(), propStr);
+ PropertyIntegerDefinitionImpl propInt =
PropertyCreationHelper.createIntegerDefinition(SECONDARY_INTEGER_PROP,
+ "Secondary Integer Property", Updatability.READWRITE);
+ propInt.setIsRequired(true);
+ propertyDefinitions.put(propInt.getId(), propInt);
+ cmisSecondaryType.addCustomPropertyDefinitions(propertyDefinitions);
+
+
// add type to types collection
typesList.add(cmisDocTypeTopLevel);
typesList.add(cmisDocTypeLevel1);
typesList.add(cmisDocTypeLevel2);
typesList.add(cmisVersionedType);
typesList.add(cmisFolderType);
+ typesList.add(cmisSecondaryType);
return typesList;
}
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
URL:
http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java?rev=1421942&r1=1421941&r2=1421942&view=diff
==============================================================================
---
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
(original)
+++
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
Fri Dec 14 15:41:54 2012
@@ -23,6 +23,7 @@ import static org.apache.chemistry.openc
import static
org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator.PROP_ID_DATETIME;
import static
org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator.PROP_ID_DECIMAL;
import static
org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator.PROP_ID_INT;
+import static
org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator.SECONDARY_TYPE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -30,10 +31,12 @@ import static org.junit.Assert.assertTru
import static org.junit.Assert.fail;
import java.math.BigDecimal;
+import java.math.BigInteger;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
+import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.inmemory.AbstractServiceTest;
import org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator;
@@ -837,13 +840,36 @@ public class EvalQueryTest extends Abstr
assertTrue(resultContains(1.0, "SEARCH_SCORE", res));
}
+ @Test
+ public void testSecondaryTypes() {
+ // create documents with secondary types in addition
+ dataCreator.createSecondaryTestDocuments();
+
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " WHERE " +
UnitTestTypeSystemCreator.PROP_ID_STRING + "= 'Secondary'";
+ ObjectList res = doQuery(statement);
+ assertEquals(1, res.getObjects().size());
+ assertTrue(resultContains("docwithsecondary", res));
+
assertFalse(resultContains(UnitTestTypeSystemCreator.SECONDARY_STRING_PROP,
res));
+
+ statement = "SELECT * FROM " + SECONDARY_TYPE + " WHERE " +
UnitTestTypeSystemCreator.SECONDARY_INTEGER_PROP + "= 100";
+ res = doQuery(statement);
+ assertEquals(1, res.getObjects().size());
+ assertFalse(resultContains("docwithsecondary", res));
+ assertTrue(resultContains("Secondary Property Value",
UnitTestTypeSystemCreator.SECONDARY_STRING_PROP, res));
+ assertTrue(resultContains(BigInteger.valueOf(100),
UnitTestTypeSystemCreator.SECONDARY_INTEGER_PROP, res));
+ }
+
private ObjectList doQuery(String queryString) {
log.debug("\nExecuting query: " + queryString);
ObjectList res = fDiscSvc.query(fRepositoryId, queryString, false,
false,
IncludeRelationships.NONE, null, null, null, null);
log.debug("Query result, number of matching objects: " +
res.getNumItems());
for (ObjectData od : res.getObjects()) {
- log.debug("Found matching object: " +
od.getProperties().getProperties().get(PropertyIds.NAME).getFirstValue());
+ PropertyData<?> propData =
od.getProperties().getProperties().get(PropertyIds.NAME);
+ if (null != propData)
+ log.debug("Found matching object: " +
propData.getFirstValue());
+ else
+ log.debug("Found matching object: (unknown, no name)");
}
return res;
}
@@ -859,11 +885,14 @@ public class EvalQueryTest extends Abstr
return res;
}
- private static boolean resultContains(String name, String propId,
ObjectList results) {
+ private static boolean resultContains(Object value, String propId,
ObjectList results) {
for (ObjectData od : results.getObjects()) {
- String nameProp = (String)
od.getProperties().getProperties().get(propId).getFirstValue();
- if (name.equals(nameProp)) {
- return true;
+ PropertyData<?> propData =
od.getProperties().getProperties().get(propId);
+ if (null != propData) {
+ Object propVal = propData.getFirstValue();
+ if (value.equals(propVal)) {
+ return true;
+ }
}
}
return false;
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java
URL:
http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java?rev=1421942&r1=1421941&r2=1421942&view=diff
==============================================================================
---
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java
(original)
+++
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java
Fri Dec 14 15:41:54 2012
@@ -41,14 +41,18 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import
org.apache.chemistry.opencmis.commons.impl.dataobjects.BindingsObjectFactoryImpl;
+import
org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl;
+import
org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.apache.chemistry.opencmis.commons.spi.ObjectService;
import org.apache.chemistry.opencmis.commons.spi.VersioningService;
import org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator;
import
org.apache.chemistry.opencmis.inmemory.storedobj.impl.ContentStreamDataImpl;
+import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
import static
org.apache.chemistry.opencmis.inmemory.UnitTestTypeSystemCreator.*;
@@ -329,6 +333,51 @@ public class QueryTestDataCreator {
return verIdSer;
}
+ @SuppressWarnings("serial")
+ public void createSecondaryTestDocuments() {
+
+ final int intPropVal1 = 100;
+ final String stringPropVal1 = "Secondary Property Value";
+ final int intPropVal2 = 200;
+ final String stringPropVal2 = "Secondary String";
+
+ final GregorianCalendar gc1 = new GregorianCalendar(TZ);
+ gc1.clear();
+ gc1.set(1945, 4, 8);
+
+ final Map<String, Object> propertyMap1 =
+ new HashMap<String, Object>() {
+ {
+ put(PROP_ID_STRING, "Secondary");
+ put(PROP_ID_INT, Integer.valueOf(-100));
+ put(PROP_ID_DECIMAL, Double.valueOf(-4.0E24d));
+ put(PROP_ID_DATETIME, gc1);
+ put(PROP_ID_BOOLEAN, true);
+ put(SECONDARY_STRING_PROP, stringPropVal1);
+ put(SECONDARY_INTEGER_PROP,intPropVal1);
+ put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, SECONDARY_TYPE);
+ }};
+ ContentStream content1 = createContent("Some more content.");
+ doc1 = createDocument("docwithsecondary", rootFolderId, COMPLEX_TYPE,
propertyMap1, content1);
+ assertNotNull(doc1);
+
+ final Map<String, Object> propertyMap2 =
+ new HashMap<String, Object>() {
+ {
+ put(PROP_ID_STRING, "Secondary 2");
+ put(PROP_ID_INT, Integer.valueOf(123));
+ put(PROP_ID_DECIMAL, Double.valueOf(1.23E24d));
+ put(PROP_ID_BOOLEAN, false);
+ put(SECONDARY_STRING_PROP, stringPropVal2);
+ put(SECONDARY_INTEGER_PROP,intPropVal2);
+ put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS,
SECONDARY_TYPE);
+ }};
+ ContentStream content2 = createContent("Even still some more
content.");
+ doc1 = createDocument("docwithsecondary2", rootFolderId,
COMPLEX_TYPE, propertyMap2, content2);
+ assertNotNull(doc1);
+ }
+
+
private String createFolder(String folderName, String parentFolderId,
String typeId, Map<String, Object> properties) {
Properties props = createFolderProperties(folderName, typeId,
properties);
String id = null;