Author: ito
Date: Mon May 23 11:50:40 2011
New Revision: 1126455

URL: http://svn.apache.org/viewvc?rev=1126455&view=rev
Log:
CLEREZZA-501: sort facets functionality implemented

Added:
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/SortedCountFacetCollector.java
Modified:
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/CountFacetCollector.java
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/FacetCollector.java
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GenericCondition.java
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
    
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/test/java/org/apache/clerezza/rdf/cris/GraphIndexerTest.java

Modified: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/CountFacetCollector.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/CountFacetCollector.java?rev=1126455&r1=1126454&r2=1126455&view=diff
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/CountFacetCollector.java
 (original)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/CountFacetCollector.java
 Mon May 23 11:50:40 2011
@@ -20,16 +20,18 @@
 package org.apache.clerezza.rdf.cris;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * A FacetCollector that counts members of a facet.
  *
  * @author daniel
  */
-public class CountFacetCollector implements FacetCollector<Integer> {
-       final private Map<VirtualProperty, Map<String, Integer>> facetMap;
+public class CountFacetCollector extends FacetCollector<Integer> {
+       final Map<VirtualProperty, Map<String, Integer>> facetMap;
 
        /**
         * Creates a new CountFacetCollector that collects facet data over the 
@@ -57,24 +59,34 @@ public class CountFacetCollector impleme
        }
        
        @Override
-       public Map<VirtualProperty, Map<String, Integer>> getFacetMap() {
-               return facetMap;
+       public Collection<VirtualProperty> getProperties() {
+               return Collections.unmodifiableCollection(facetMap.keySet());
        }
 
        @Override
-       public void addFacetValue(VirtualProperty field, String value) {
+       void addFacetValue(VirtualProperty field, String value) {
                Map<String, Integer> propertyMap = facetMap.get(field);
                Integer old = propertyMap.get(value);
                propertyMap.put(value, old == null ? 1 : old + 1);
        }
 
        @Override
-       public Map<String, Integer> getFacets(VirtualProperty property) {
-               return facetMap.get(property);
+       public Set<Map.Entry<String, Integer>> getFacets(VirtualProperty 
property) {
+               return 
Collections.unmodifiableSet(facetMap.get(property).entrySet());
        }
 
        @Override
        public Integer getFacetValue(VirtualProperty property, String facet) {
                return facetMap.get(property).get(facet);
        }
+       
+       @Override
+       Map<VirtualProperty, Map<String, Integer>> getFacetMap() {
+               return facetMap;
+       }
+       
+       @Override
+       void postProcess() {
+               //do nothing
+       }
 }

Modified: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/FacetCollector.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/FacetCollector.java?rev=1126455&r1=1126454&r2=1126455&view=diff
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/FacetCollector.java
 (original)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/FacetCollector.java
 Mon May 23 11:50:40 2011
@@ -19,7 +19,9 @@
 
 package org.apache.clerezza.rdf.cris;
 
+import java.util.Collection;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * This class is a container that defines facets that should be collected and 
@@ -27,7 +29,7 @@ import java.util.Map;
  *
  * @author daniel
  */
-public interface FacetCollector<T> {
+public abstract class FacetCollector<T> {
 
        /**
         * Add a property over which facets are collected.
@@ -36,30 +38,23 @@ public interface FacetCollector<T> {
         * 
         * @param property      A virtual property over which facets are 
collected. 
         */
-       public void addFacetProperty(VirtualProperty property);
+       public abstract void addFacetProperty(VirtualProperty property);
 
-       /**
-        * This method adds a new data to the facet map.
-        * 
-        * @param property      The property.
-        * @param value The value of the property as returned by Lucene.
-        */
-       public void addFacetValue(VirtualProperty property, String value);
        
        /**
-        * Returns the collected data.
+        * Returns the properties for which facets are collected..
         * 
-        * @return The collected data.
+        * @return The properties.
         */
-       public Map<VirtualProperty, Map<String, T>> getFacetMap();
+       public abstract Collection<VirtualProperty> getProperties();
        
        /**
         * Returns all facets for the given property.
         * 
         * @param property      the property.
-        * @return      A map with facets and facet values.
+        * @return      A set with facets and facet values.
         */
-       public Map<String, T> getFacets(VirtualProperty property);
+       public abstract Set<Map.Entry<String, T>> getFacets(VirtualProperty 
property);
        
        /**
         * Returns a facet value.
@@ -68,5 +63,28 @@ public interface FacetCollector<T> {
         * @param facet The facet.
         * @return The facet value.
         */
-       public T getFacetValue(VirtualProperty property, String facet);
+       public abstract T getFacetValue(VirtualProperty property, String facet);
+       
+       /**
+        * Expert: This method returns the underlying data structure as a 
nested map.
+        * It is intended for fast access to the underlying data, not for users.
+        * 
+        * @return the facetMap
+        */
+       abstract Map<VirtualProperty, Map<String, T>> getFacetMap();
+       
+       /**
+        * This method adds a new data to the facet map.
+        * 
+        * @param property      The property.
+        * @param value The value of the property as returned by Lucene.
+        */
+       abstract void addFacetValue(VirtualProperty property, String value);
+       
+       /**
+        * Expert: This method performs post processing on the FacetCollector. 
+        * Users should not call it. It is intended for avoiding time consuming 
tasks 
+        * until changes are written to the collector.
+        */
+       abstract void postProcess();
 }

Modified: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GenericCondition.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GenericCondition.java?rev=1126455&r1=1126454&r2=1126455&view=diff
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GenericCondition.java
 (original)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GenericCondition.java
 Mon May 23 11:50:40 2011
@@ -70,7 +70,6 @@ public class GenericCondition extends Co
                
                if(escapeQuery) {
                        searchQuery = QueryParser.escape(searchQuery);
-                       System.out.println("ESCAPED: " + searchQuery);
                }
                this.searchQuery = searchQuery;
 

Modified: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java?rev=1126455&r1=1126454&r2=1126455&view=diff
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
 (original)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
 Mon May 23 11:50:40 2011
@@ -84,7 +84,7 @@ public class GraphIndexer extends Resour
        private final GraphListener listener1;
        private final GraphListener listener2;
        
-       static final String SORT_PREFIX = "PRE";
+       static final String SORT_PREFIX = "_STORED_";
        
        private Map<SortFieldArrayWrapper, Sort> sortCache = new 
HashMap<SortFieldArrayWrapper, Sort>();
        
@@ -195,7 +195,7 @@ public class GraphIndexer extends Resour
                                                if (stop) {
                                                        break;
                                                }
-                                               logger.info("{}: registered 
write - waiting for more writes to follow.", getName());
+                                               logger.debug("{}: registered 
write - waiting for more writes to follow.", getName());
                                                waitUntilStable();
                                                set = new 
HashSet<Resource>(resourcesToProcess);
                                                resourcesToProcess.clear();
@@ -220,7 +220,7 @@ public class GraphIndexer extends Resour
                        while (!resourcesClean) {
                                resourcesClean = true;
                                indexResources.awaitNanos(stableThreshold);
-                               if(++counter > resourceCacheCapacity) {
+                               if(resourceCacheCapacity >= 0 && ++counter > 
resourceCacheCapacity) {
                                        break;
                                }
                        }
@@ -576,10 +576,17 @@ public class GraphIndexer extends Resour
                                collectFacets(facetCollectors, d);
                                result.add(getResource(d));
                        } catch (CorruptIndexException ex) {
+                               logger.error("CRIS Error: ", ex);
                        } catch (IOException ex) {
+                               logger.error("CRIS Error: ", ex);
                        }
 
                }
+               
+               for(FacetCollector facetCollector : facetCollectors) {
+                       facetCollector.postProcess();
+               }
+               
                return result;
        }
 
@@ -604,9 +611,11 @@ public class GraphIndexer extends Resour
                                Map<VirtualProperty, Map<String, Object>> 
facetMap = 
                                                facetCollector.getFacetMap();
                                for(VirtualProperty property : 
facetMap.keySet()) {
-                                       String[] values = 
d.getValues(property.getStringKey());
-                                       if(values.length > 0) {
-                                               
facetCollector.addFacetValue(property, values[0]);
+                                       String[] values = 
d.getValues(SORT_PREFIX + property.getStringKey());
+                                       if(values != null) {
+                                               for(String value : values) {
+                                                       
facetCollector.addFacetValue(property, value);
+                                               }
                                        }
                                }
                        }
@@ -654,18 +663,20 @@ public class GraphIndexer extends Resour
                                        new GraphNode(resource, 
this.baseGraph))).size());
                        for (String propertyValue : vProperty.value(new 
GraphNode(resource, this.baseGraph))) {
                                logger.info("indexing " + vProperty + "(" + 
vProperty.stringKey + ") with value " + (propertyValue));
-                               doc.add(new Field(vProperty.stringKey,
+                               //for sorting
+                               doc.add(new Field(SORT_PREFIX + 
vProperty.stringKey,
                                                propertyValue,
                                                Field.Store.YES,
+                                               
Field.Index.NOT_ANALYZED_NO_NORMS));
+                               //for searching (the extra field doesn't cost 
much time)
+                               doc.add(new Field(vProperty.stringKey,
+                                               propertyValue,
+                                               Field.Store.NO,
                                                Field.Index.NOT_ANALYZED));
                                doc.add(new Field(vProperty.stringKey,
                                                propertyValue,
-                                               Field.Store.YES,
+                                               Field.Store.NO,
                                                Field.Index.ANALYZED));
-                               doc.add(new Field(SORT_PREFIX + 
vProperty.stringKey,
-                                               propertyValue,
-                                               Field.Store.YES,
-                                               Field.Index.NOT_ANALYZED));
                        }
                }
                return doc;

Added: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/SortedCountFacetCollector.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/SortedCountFacetCollector.java?rev=1126455&view=auto
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/SortedCountFacetCollector.java
 (added)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/SortedCountFacetCollector.java
 Mon May 23 11:50:40 2011
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.rdf.cris;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+
+
+/**
+ * A FacetCollector that counts members of a facet and returns ordered facets.
+ * 
+ * Uses the comparable interface to determine order between facets. 
+ * 
+ * Note: Facets are always ordered first by value and only when 
+ * values are equal according to keys.
+ *
+ * @author daniel
+ */
+public class SortedCountFacetCollector extends CountFacetCollector {
+
+       private Map<VirtualProperty, SortedSet<Map.Entry<String, Integer>>> 
sortedFacetMap;
+       private boolean reverseValues = false; 
+       private boolean reverseKeys = false; 
+       
+       /**
+        * Default Constructor.
+        * 
+        * Creates a facet collector that orders keys in ascending and values 
in descending order.
+        */
+       public SortedCountFacetCollector() {
+               this(false, true);
+       }
+
+       /**
+        * Creates a facet collector that orders according to the supplied 
parameters.
+        * 
+        * Note: Facets are always ordered first by value and only when 
+        * values are equal according to keys.
+        * 
+        * @param reverseKeyOrder true = descending order, false = ascending 
order.
+        * @param reverseValueOrder true = descending order, false = ascending 
order.
+        */
+       public SortedCountFacetCollector(boolean reverseKeyOrder, boolean 
reverseValueOrder) {
+               super();
+               sortedFacetMap = Collections.emptyMap();
+               this.reverseValues = reverseValueOrder;
+               this.reverseKeys = reverseKeyOrder;
+       }
+
+       /**
+        * Whether the collector orders values in ascending or descending order.
+        * 
+        * @return true = descending order, false = ascending order.
+        */
+       public boolean valuesReversed() {
+               return reverseValues;
+       }
+       
+       /**
+        * Whether the collector orders keys in ascending or descending order.
+        * 
+        * @return true = descending order, false = ascending order.
+        */
+       public boolean keysReversed() {
+               return reverseKeys;
+       }
+       
+       @Override
+       public Set<Entry<String, Integer>> getFacets(VirtualProperty property) {
+               return sortedFacetMap.get(property);
+       }
+
+       @Override
+       void postProcess() {
+               super.postProcess();
+               
+               Collection<VirtualProperty> properties = facetMap.keySet();
+               sortedFacetMap = new HashMap<VirtualProperty, 
+                                       SortedSet<Entry<String, 
Integer>>>(properties.size());
+               for(VirtualProperty property : properties) {
+                       
+                       TreeSet<Entry<String, Integer>> sortedSet = 
+                                       new TreeSet<Entry<String, Integer>>(new 
EntrySetComparator());
+                       Set<Entry<String, Integer>> entrySet = 
facetMap.get(property).entrySet();
+                       sortedSet.addAll(entrySet);
+                       sortedFacetMap.put(property, sortedSet);
+               }
+       }
+       
+       
+       private class EntrySetComparator implements Comparator<Entry<String, 
Integer>> {
+               @Override
+               public int compare(Entry<String, Integer> e1, Entry<String, 
Integer> e2) {
+                       String key1, key2;
+                       if(reverseKeys) {
+                               key1 = e2.getKey();
+                               key2 = e1.getKey();
+                       } else{
+                               key1 = e1.getKey();
+                               key2 = e2.getKey();
+                       }
+                       
+                       Integer val1, val2;
+                       Entry<String, Integer> o2 = e2;
+                       if(reverseValues) {
+                               val1 = e2.getValue();
+                               val2 = e1.getValue();
+                       } else {
+                               val1 = e1.getValue();
+                               val2 = e2.getValue();
+                       }
+                       
+                       
+                       int val;
+                       if(key1.equals(key2)) {
+                               val = 0;
+                       } else {
+                               val = val1.compareTo(val2);
+                               if(val == 0) {
+                                       val = key1.compareTo(key2);
+                               }
+                       }
+                       
+                       return val;
+               }
+               
+       }
+}

Modified: 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/test/java/org/apache/clerezza/rdf/cris/GraphIndexerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/test/java/org/apache/clerezza/rdf/cris/GraphIndexerTest.java?rev=1126455&r1=1126454&r2=1126455&view=diff
==============================================================================
--- 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/test/java/org/apache/clerezza/rdf/cris/GraphIndexerTest.java
 (original)
+++ 
incubator/clerezza/issues/CLEREZZA-501/rdf.cris/core/src/test/java/org/apache/clerezza/rdf/cris/GraphIndexerTest.java
 Mon May 23 11:50:40 2011
@@ -20,7 +20,11 @@
 package org.apache.clerezza.rdf.cris;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
 import org.apache.clerezza.rdf.cris.ontologies.CRIS;
 import org.apache.clerezza.rdf.core.*;
 import org.apache.clerezza.rdf.utils.*;
@@ -356,4 +360,263 @@ public class GraphIndexerTest {
                } catch (InterruptedException ex) {
                }
        }
+       
+       @Test
+       public void facetCollectorTest() throws InterruptedException, 
ParseException {
+               IndexDefinitionManager indexDefinitionManager = new 
IndexDefinitionManager(definitions);
+               final PropertyHolder firstName = new 
PropertyHolder(FOAF.firstName);
+               List<VirtualProperty> properties = new 
ArrayList<VirtualProperty>();
+               properties.add(firstName);
+               properties.add(new PropertyHolder(FOAF.lastName));
+               indexDefinitionManager.addDefinitionVirtual(FOAF.Person, 
properties);
+               service.reCreateIndex();
+               
+               //count occurence of distinct firstnames
+               CountFacetCollector facetCollector = new CountFacetCollector();
+               facetCollector.addFacetProperty(firstName);
+               
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, facetCollector);
+                       Assert.assertTrue(results.size() > 0);
+                       
+                       //there are 7 distinct firsst names
+                       Assert.assertEquals(7, 
facetCollector.getFacets(firstName).size());
+                       //the firstname "Frank" appears once
+                       Assert.assertEquals(new Integer(1), 
facetCollector.getFacetValue(firstName, "Frank"));
+                       //the firstname "frank" never appears
+                       
Assert.assertNull(facetCollector.getFacetValue(firstName, "frank"));
+                       //the firstname "Jane" appears twice
+                       Assert.assertEquals(new Integer(2), 
facetCollector.getFacetValue(firstName, "Jane"));
+                       //the firstname "Harry" appears once
+                       Assert.assertEquals(new Integer(1), 
facetCollector.getFacetValue(firstName, "Harry"));
+                       //the firstname "Harry Joe" appears once
+                       Assert.assertEquals(new Integer(1), 
facetCollector.getFacetValue(firstName, "Harry Joe"));
+                       //the firstname "William" appears once
+                       Assert.assertEquals(new Integer(1), 
facetCollector.getFacetValue(firstName, "William"));
+                       //the firstname "John" appears twice
+                       Assert.assertEquals(new Integer(2), 
facetCollector.getFacetValue(firstName, "John"));
+               }
+       }
+       
+       @Test
+       public void sortedfacetCollectorTest() throws InterruptedException, 
ParseException {
+               IndexDefinitionManager indexDefinitionManager = new 
IndexDefinitionManager(definitions);
+               final PropertyHolder firstName = new 
PropertyHolder(FOAF.firstName);
+               List<VirtualProperty> properties = new 
ArrayList<VirtualProperty>();
+               properties.add(firstName);
+               properties.add(new PropertyHolder(FOAF.lastName));
+               indexDefinitionManager.addDefinitionVirtual(FOAF.Person, 
properties);
+               
+               createPerson("Aaron", "Ignore");
+               createPerson("Aaron", "IgnoreMore");
+               createPerson("Alpha", "Ignore");
+               createPerson("Alpha", "IgnoreMore");
+               createPerson("Beta", "Ignore");
+               
+               service.reCreateIndex();
+               
+               CountFacetCollector facetCollector = new 
SortedCountFacetCollector(false, true);
+               facetCollector.addFacetProperty(firstName);
+               
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, facetCollector);
+                       Assert.assertTrue(results.size() > 0);
+                       
+                       Set<Entry<String, Integer>> facets = 
facetCollector.getFacets(firstName);
+                       Integer old = Integer.MAX_VALUE;
+                       String oldKey = null;
+                       for(Entry<String, Integer> facet : facets) {
+                               if(old == facet.getValue() && 
+                                               oldKey != null && 
+                                               
(facet.getKey().compareTo(oldKey) < 0)) {
+                                       
+                                       Assert.fail("Facet keys are not ordered 
in ascending order.");
+                               }
+                               if(facet.getValue() > old) {
+                                       Assert.fail("Facet values are not 
ordered in descending order.");
+                               }
+                               old = facet.getValue();
+                               oldKey = facet.getKey();
+                       }
+               }
+               
+               facetCollector = new SortedCountFacetCollector(false, false);
+               facetCollector.addFacetProperty(firstName);
+
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, facetCollector);
+                       Assert.assertTrue(results.size() > 0);
+
+                       Set<Entry<String, Integer>> facets = 
facetCollector.getFacets(firstName);
+                       Integer old = -1;
+                       String oldKey = null;
+                       for (Entry<String, Integer> facet : facets) {
+                               if (old == facet.getValue()
+                                               && oldKey != null
+                                               && 
(facet.getKey().compareTo(oldKey) < 0)) {
+                                       Assert.fail("Facet keys are not ordered 
in ascending order.");
+                               }
+                               if (facet.getValue() < old) {
+                                       Assert.fail("Facet values are not 
ordered in ascending order.");
+                               }
+                               old = facet.getValue();
+                               oldKey = facet.getKey();
+                       }
+               }
+
+               facetCollector = new SortedCountFacetCollector(true, false);
+               facetCollector.addFacetProperty(firstName);
+
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, facetCollector);
+                       Assert.assertTrue(results.size() > 0);
+
+                       Set<Entry<String, Integer>> facets = 
facetCollector.getFacets(firstName);
+                       Integer old = -1;
+                       String oldKey = null;
+                       for (Entry<String, Integer> facet : facets) {
+                               if (old == facet.getValue()
+                                               && oldKey != null
+                                               && 
(facet.getKey().compareTo(oldKey) > 0)) {
+                                       Assert.fail("Facet keys are not ordered 
in descending order.");
+                               }
+                               if (facet.getValue() < old) {
+                                       Assert.fail("Facet values are not 
ordered in ascending order.");
+                               }
+                               old = facet.getValue();
+                               oldKey = facet.getKey();
+                       }
+               }
+
+               facetCollector = new SortedCountFacetCollector(true, true);
+               facetCollector.addFacetProperty(firstName);
+
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, facetCollector);
+                       Assert.assertTrue(results.size() > 0);
+
+                       Set<Entry<String, Integer>> facets = 
facetCollector.getFacets(firstName);
+                       Integer old = Integer.MAX_VALUE;
+                       String oldKey = null;
+                       for (Entry<String, Integer> facet : facets) {
+                               if (old == facet.getValue()
+                                               && oldKey != null
+                                               && 
(facet.getKey().compareTo(oldKey) > 0)) {
+                                       Assert.fail("Facet keys are not ordered 
in descending order.");
+                               }
+                               if (facet.getValue() > old) {
+                                       Assert.fail("Facet values are not 
ordered in descending order.");
+                               }
+                               old = facet.getValue();
+                               oldKey = facet.getKey();
+                       }
+               }
+       }
+       
+       @Test
+       public void sortResultsTest() throws InterruptedException, 
ParseException {
+               IndexDefinitionManager indexDefinitionManager = new 
IndexDefinitionManager(definitions);
+               final PropertyHolder firstName = new 
PropertyHolder(FOAF.firstName);
+               List<VirtualProperty> properties = new 
ArrayList<VirtualProperty>();
+               properties.add(firstName);
+               indexDefinitionManager.addDefinitionVirtual(FOAF.Person, 
properties);
+               service.reCreateIndex();
+               
+               SortSpecification sortSpecification = new SortSpecification();
+               sortSpecification.add(firstName, 
SortSpecification.STRING_COMPARETO);
+               sortSpecification.add(SortSpecification.INDEX_ORDER);
+               
+               Thread.sleep(1000);
+               {
+                       List<NonLiteral> results = 
service.findResources(firstName, "*", false, sortSpecification);
+                       Assert.assertTrue(results.size() > 0);
+                       
+                       List<String> expected = new ArrayList<String>(7);
+                       expected.add("Frank");
+                       expected.add("Harry");
+                       expected.add("Harry Joe");
+                       expected.add("Jane");
+                       expected.add("Jane");
+                       expected.add("Joe");
+                       expected.add("John");
+                       
+                       
+                       
+                       List<String> actual = new 
ArrayList<String>(results.size());
+                       for(NonLiteral result : results) {
+                               GraphNode node = new GraphNode(result, 
dataGraph);
+                               Iterator<Literal> it = 
node.getLiterals(FOAF.firstName);
+                               while(it.hasNext()) {
+                                       actual.add(it.next().getLexicalForm());
+                               }
+                       }
+                       
+                       //ignore "John William" because we can not make 
assumptions about 
+                       //the order of properties
+                       Assert.assertArrayEquals(expected.toArray(), 
+                                       Arrays.copyOfRange(actual.toArray(), 0, 
7));
+               }
+       }
+       
+       @Test
+       public void genericConditionTest() throws InterruptedException, 
ParseException {
+               IndexDefinitionManager indexDefinitionManager = new 
IndexDefinitionManager(definitions);
+               final PropertyHolder firstName = new 
PropertyHolder(FOAF.firstName);
+               List<VirtualProperty> properties = new 
ArrayList<VirtualProperty>();
+               properties.add(firstName);
+               indexDefinitionManager.addDefinitionVirtual(FOAF.Person, 
properties);
+               service.reCreateIndex();
+               
+               
+               Thread.sleep(1000);
+               {
+                       List<Condition> conditions = new 
ArrayList<Condition>(1);
+                       //exact match --> exact expression match on untokenized
+                       conditions.add(new GenericCondition(properties, 
"\"Harry Joe\""));
+                       List<NonLiteral> results = 
service.findResources(conditions);
+                       Assert.assertEquals(1, results.size());
+                       conditions.clear();
+                       //case-insensitive exact match
+                       conditions.add(new GenericCondition(properties, 
"\"harry joe\""));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(1, results.size());
+                       conditions.clear();
+                       //tokenized term match (Harry or Joe)
+                       conditions.add(new GenericCondition(properties, "Harry 
Joe"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(3, results.size());
+                       conditions.clear();
+                       //case-insensitive tokenized term
+                       conditions.add(new GenericCondition(properties, "harry 
joe"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(3, results.size());
+                       conditions.clear();
+                       //tokenized term match (Harry and Joe)
+                       conditions.add(new GenericCondition(properties, "+Harry 
+Joe"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(1, results.size());
+                       conditions.clear();
+                       //tokenized term match (Joe and and not Harry)
+                       conditions.add(new GenericCondition(properties, "-harry 
+joe"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(1, results.size());
+                       conditions.clear();
+                       //wildcard match
+                       conditions.add(new GenericCondition(properties, 
"harry*"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(2, results.size());
+                       conditions.clear();
+                       //leading wildcard match
+                       conditions.add(new GenericCondition(properties, 
"*joe"));
+                       results = service.findResources(conditions);
+                       Assert.assertEquals(2, results.size());
+                       conditions.clear();
+               }
+               
+       }
 }


Reply via email to