You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/06/15 11:14:41 UTC
svn commit: r954775 - in
/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src:
main/java/org/apache/chemistry/opencmis/inmemory/query/
test/java/org/apache/chemistry/opencmis/inmemory/query/
Author: jens
Date: Tue Jun 15 09:14:41 2010
New Revision: 954775
URL: http://svn.apache.org/viewvc?rev=954775&view=rev
Log:
CMIS-216
implement order by for one sort spec in in-memory
Modified:
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
Modified: incubator/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/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java?rev=954775&r1=954774&r2=954775&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java Tue Jun 15 09:14:41 2010
@@ -21,6 +21,8 @@ package org.apache.chemistry.opencmis.in
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
@@ -35,6 +37,7 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectListImpl;
import org.apache.chemistry.opencmis.inmemory.TypeManager;
+import org.apache.chemistry.opencmis.inmemory.query.QueryObject.SortSpec;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
import org.apache.chemistry.opencmis.server.support.query.CalendarHelper;
@@ -90,7 +93,9 @@ public class InMemoryQueryProcessor impl
public ObjectList buildResultList(TypeManager tm, String user,
Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
BigInteger maxItems, BigInteger skipCount) {
- // TODO sort according to order by criteria
+
+ sortMatches();
+
ObjectListImpl res = new ObjectListImpl();
List<ObjectData> objDataList = new ArrayList<ObjectData>();
Map<String, String> props = queryObj.getRequestedProperties();
@@ -120,6 +125,45 @@ public class InMemoryQueryProcessor impl
}
return false;
}
+
+ private void sortMatches() {
+ final List<SortSpec> orderBy = queryObj.getOrderBys();
+ if (orderBy.size() > 1)
+ LOG.warn("ORDER BY has more than one sort criterium, all but the first are ignored.");
+ class ResultComparator implements Comparator<StoredObject> {
+
+ public int compare(StoredObject so1, StoredObject so2) {
+ SortSpec s = orderBy.get(0);
+ CmisSelector sel = s.getSelector();
+ int result;
+
+ if (sel instanceof ColumnReference) {
+ String propId = ((ColumnReference)sel).getPropertyId();
+ Object propVal1 = so1.getProperties().get(propId).getFirstValue();
+ Object propVal2 = so2.getProperties().get(propId).getFirstValue();
+ if (propVal1 == null && propVal2 == null)
+ result = 0;
+ else if (propVal1 == null)
+ result = -1;
+ else if (propVal2 == null)
+ result = 1;
+ else
+ result = ((Comparable)propVal1).compareTo(propVal2);
+ } else {
+ String funcName = ((FunctionReference)sel).getName();
+ // evaluate function here, currently ignore
+ result = 0;
+ }
+ if (!s.isAscending())
+ result = -result;
+ return result;
+ }
+ }
+
+ if (orderBy.size() > 0)
+ Collections.sort(matches, new ResultComparator());
+
+ }
private void match(StoredObject so) {
// log.debug("Tree is: " + (whereTree == null ? "(empty)" : whereTree.toStringTree()));
Modified: incubator/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/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java?rev=954775&r1=954774&r2=954775&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java Tue Jun 15 09:14:41 2010
@@ -365,6 +365,111 @@ public class EvalQueryTest extends Abstr
assertTrue(resultContains("epsilon", res));
}
+ @Test
+ public void testOrderByString() {
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + UnitTestTypeSystemCreator.PROP_ID_STRING;
+ ObjectList res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 0, res));
+ assertTrue(resultContainsAtPos("beta", 1, res));
+ assertTrue(resultContainsAtPos("delta", 2, res));
+ assertTrue(resultContainsAtPos("epsilon", 3, res));
+ assertTrue(resultContainsAtPos("gamma", 4, res));
+
+ statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + UnitTestTypeSystemCreator.PROP_ID_STRING + " DESC";
+ res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 4, res));
+ assertTrue(resultContainsAtPos("beta", 3, res));
+ assertTrue(resultContainsAtPos("delta", 2, res));
+ assertTrue(resultContainsAtPos("epsilon", 1, res));
+ assertTrue(resultContainsAtPos("gamma", 0, res));
+}
+
+ @Test
+ public void testOrderByInteger() {
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_INT;
+ ObjectList res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 0, res));
+ assertTrue(resultContainsAtPos("beta", 1, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res));
+ assertTrue(resultContainsAtPos("delta", 3, res));
+ assertTrue(resultContainsAtPos("epsilon", 4, res));
+
+ statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_INT + " DESC";
+ res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 4, res));
+ assertTrue(resultContainsAtPos("beta", 3, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res));
+ assertTrue(resultContainsAtPos("delta", 1, res));
+ assertTrue(resultContainsAtPos("epsilon", 0, res));
+}
+
+ @Test
+ public void testOrderByDecimal() {
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_DECIMAL;
+ ObjectList res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 0, res));
+ assertTrue(resultContainsAtPos("beta", 1, res));
+ assertTrue(resultContainsAtPos("delta", 2, res));
+ assertTrue(resultContainsAtPos("gamma", 3, res));
+ assertTrue(resultContainsAtPos("epsilon", 4, res));
+
+ statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_DECIMAL + " DESC";
+ res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("alpha", 4, res));
+ assertTrue(resultContainsAtPos("beta", 3, res));
+ assertTrue(resultContainsAtPos("delta", 2, res));
+ assertTrue(resultContainsAtPos("gamma", 1, res));
+ assertTrue(resultContainsAtPos("epsilon", 0, res));
+ }
+
+ @Test
+ public void testOrderByDate() {
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_DATETIME;
+ ObjectList res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("beta", 0, res));
+ assertTrue(resultContainsAtPos("alpha", 1, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res));
+ assertTrue(resultContainsAtPos("delta", 3, res));
+ assertTrue(resultContainsAtPos("epsilon", 4, res));
+
+ statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_DATETIME + " DESC";
+ res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("beta", 4, res));
+ assertTrue(resultContainsAtPos("alpha", 3, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res));
+ assertTrue(resultContainsAtPos("delta", 1, res));
+ assertTrue(resultContainsAtPos("epsilon", 0, res));
+ }
+
+ @Test
+ public void testOrderByBool() {
+ String statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_BOOLEAN;
+ ObjectList res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("beta", 0, res) || resultContainsAtPos("beta", 1, res));
+ assertTrue(resultContainsAtPos("epsilon", 0, res) || resultContainsAtPos("epsilon", 1, res));
+ assertTrue(resultContainsAtPos("alpha", 2, res) || resultContainsAtPos("alpha", 3, res) || resultContainsAtPos("alpha", 4, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res) || resultContainsAtPos("gamma", 3, res) || resultContainsAtPos("gamma", 4, res));
+ assertTrue(resultContainsAtPos("delta", 2, res) || resultContainsAtPos("delta", 3, res) || resultContainsAtPos("delta", 4, res));
+
+ statement = "SELECT * FROM " + COMPLEX_TYPE + " ORDER BY " + PROP_ID_BOOLEAN + " DESC";
+ res = doQuery(statement);
+ assertEquals(5, res.getObjects().size());
+ assertTrue(resultContainsAtPos("beta", 3, res) || resultContainsAtPos("beta", 4, res));
+ assertTrue(resultContainsAtPos("epsilon", 3, res) || resultContainsAtPos("epsilon", 4, res));
+ assertTrue(resultContainsAtPos("alpha", 2, res) || resultContainsAtPos("alpha", 1, res) || resultContainsAtPos("alpha", 0, res));
+ assertTrue(resultContainsAtPos("gamma", 2, res) || resultContainsAtPos("gamma", 1, res) || resultContainsAtPos("gamma", 0, res));
+ assertTrue(resultContainsAtPos("delta", 2, res) || resultContainsAtPos("delta", 1, res) || resultContainsAtPos("delta", 0, res));
+}
+
private ObjectList doQuery(String queryString) {
log.debug("\nExecuting query: " + queryString);
ObjectList res = fDiscSvc.query(fRepositoryId, queryString, false, false,
@@ -383,4 +488,9 @@ public class EvalQueryTest extends Abstr
}
return false;
}
+
+ private boolean resultContainsAtPos(String name, int index, ObjectList results) {
+ String nameProp = (String) results.getObjects().get(index).getProperties().getProperties().get(PropertyIds.NAME).getFirstValue();
+ return name.equals(nameProp);
+ }
}