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;


Reply via email to