You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2011/01/17 14:03:49 UTC

svn commit: r1059908 - in /incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core: ./ src/ src/main/ src/main/resources/ src/main/resources/OSGI-INF/ src/main/scala/ src/main/scala/org/ src/main/scala/org/apache/ src/main/scala/org/ap...

Author: reto
Date: Mon Jan 17 13:03:48 2011
New Revision: 1059908

URL: http://svn.apache.org/viewvc?rev=1059908&view=rev
Log:
CLEREZZA-388: first lucene based implementation

Added:
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/   (with props)
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/pom.xml
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/serviceComponents.xml
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/Condition.scala
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/IndexService.scala
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/WilcardCondition.scala
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/
    incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/IndexServiceTest.scala

Propchange: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Jan 17 13:03:48 2011
@@ -0,0 +1 @@
+target

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/pom.xml?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/pom.xml (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/pom.xml Mon Jan 17 13:03:48 2011
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.clerezza</groupId>
+		<artifactId>org.apache.clerezza.rdf.cris</artifactId>
+		<version>0.1-incubating-SNAPSHOT</version>
+	</parent>
+	<groupId>org.apache.clerezza</groupId>
+	<artifactId>org.apache.clerezza.rdf.cris.core</artifactId>
+	<version>0.1-incubating-SNAPSHOT</version>
+	<packaging>bundle</packaging>
+	<name>Clerezza - RDF Composite Resource Index Service Core</name>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.cris.ontologies</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.utils</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.scala.utils</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.scala-lang</groupId>
+			<artifactId>scala-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.lucene</groupId>
+			<artifactId>lucene-highlighter</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.lucene</groupId>
+			<artifactId>lucene-analyzers</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.lucene</groupId>
+			<artifactId>lucene-memory</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.lucene</groupId>
+			<artifactId>lucene-queries</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.lucene</groupId>
+			<artifactId>lucene-core</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.wymiwyg</groupId>
+			<artifactId>wymiwyg-commons-core</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<sourceDirectory>src/main/scala</sourceDirectory>
+		<testSourceDirectory>src/test/scala</testSourceDirectory>
+		<plugins>
+			<plugin>
+				<groupId>org.scala-tools</groupId>
+				<artifactId>maven-scala-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>compile</goal>
+							<goal>testCompile</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<configuration>
+					<instructions>
+						<Service-Component>OSGI-INF/serviceComponents.xml</Service-Component>
+						<Export-Package>org.apache.clerezza.rdf.cris.*</Export-Package>
+						<Bundle-SymbolicName>org.apache.clerezza.rdf.cris</Bundle-SymbolicName>
+					</instructions>
+				</configuration>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/serviceComponents.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/serviceComponents.xml?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/serviceComponents.xml (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/resources/OSGI-INF/serviceComponents.xml Mon Jan 17 13:03:48 2011
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+	<scr:component enabled="true" immediate="true" name="org.apache.clerezza.rdf.cris.IndexService">
+		<implementation class="org.apache.clerezza.rdf.cris.IndexService"/>
+		<service servicefactory="false">
+			<provide interface="org.apache.clerezza.rdf.cris.IndexService"/>
+		</service>
+	</scr:component>
+</components>

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/Condition.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/Condition.scala?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/Condition.scala (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/Condition.scala Mon Jan 17 13:03:48 2011
@@ -0,0 +1,28 @@
+/*
+ * 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 org.apache.lucene.search.Query
+
+abstract class Condition {
+
+	def query: Query
+
+}

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/IndexService.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/IndexService.scala?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/IndexService.scala (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/IndexService.scala Mon Jan 17 13:03:48 2011
@@ -0,0 +1,211 @@
+/*
+ * 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 org.apache.clerezza.rdf.cris.ontologies.CRIS
+import org.apache.clerezza.rdf.core.event._
+import org.apache.clerezza.rdf.core.TripleCollection
+import org.apache.clerezza.rdf.core.Resource
+import org.apache.clerezza.rdf.core.UriRef
+import org.apache.clerezza.rdf.core.Triple
+import org.apache.clerezza.rdf.utils._
+import org.apache.clerezza.rdf.scala.utils._
+import org.apache.clerezza.rdf.ontologies._
+import org.apache.lucene.analysis.standard.StandardAnalyzer
+import org.apache.lucene.document._
+import org.apache.lucene.store._
+import org.apache.lucene.index._
+import org.apache.lucene.search._
+import org.apache.lucene.util.Version
+import org.slf4j._
+import java.util.ArrayList
+import java.util.List
+import scala.actors.DaemonActor
+import scala.actors.TIMEOUT
+
+/**
+ *
+ * Provides access to indexed resources
+ *
+ * @author reto
+ */
+//while implemented in scala we don't expose any scala-library classes in the
+//public interface
+class IndexService(definitions: TripleCollection, baseGraph: TripleCollection) {
+
+	private val URI_FIELD_NAME = "resource-uri"
+	private val logger = LoggerFactory.getLogger(classOf[IndexService])
+	private val definitionsPreamble = new Preamble(definitions)
+	import definitionsPreamble._
+	val indexDefinitions = CRIS.IndexDefinition/-RDF.`type`
+	val indexedTypes = for (d <- indexDefinitions) yield d/CRIS.indexedType!
+	val indexedProperties = for (p <- (for (d <- indexDefinitions)
+		yield (d/CRIS.indexedProperty)).flatten) yield (p!).asInstanceOf[UriRef]
+	val index: Directory = new RAMDirectory
+	val analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
+
+	baseGraph.addGraphListener(new GraphListener() {
+		def graphChanged(events: List[GraphEvent]) {
+			import scala.collection.JavaConversions._
+			for (e <- events) {
+				val triple = e.getTriple
+				logger.info("processing addition of type "+triple.getObject)
+				if (indexedTypes.contains(triple.getObject)) {
+					scheduleForReindex(triple.getSubject)
+				}
+			}
+		}
+	}, new FilterTriple(null, RDF.`type`, null))
+
+	baseGraph.addGraphListener(new GraphListener() {
+		def graphChanged(events: List[GraphEvent]) {
+			import scala.collection.JavaConversions._
+			for (e <- events) {
+				val triple = e.getTriple
+				val resource = triple.getSubject
+				val types = for (tn <- resource/RDF.`type`) yield tn! ;
+				if (types.exists(t => indexedTypes.contains(t))) {
+					scheduleForReindex(resource)
+				}
+			}
+		}
+	}, new FilterTriple(null, null, null) {
+		override def `match`(triple: Triple) = {
+			val predicate = triple.getPredicate
+			indexedProperties.contains(predicate)
+		}
+	})
+   
+	def scheduleForReindex(r: Resource) {
+		logger.info("Scheduling for reindex: "+r)
+		reindexActor ! r
+	}
+
+	val reindexActor = new DaemonActor {
+
+		val resourcesToProcess = new scala.collection.mutable.HashSet[Resource]
+		def act() {
+			while(true) {
+				receive {
+					case r: Resource => {
+						resourcesToProcess.add(r)
+						receiveSubsequentResources()
+						val writer = new IndexWriter(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
+						for (instance <- resourcesToProcess) indexResource(instance!, writer)
+						writer.close
+						resourcesToProcess.clear()
+					}
+				}
+			}
+		}
+
+		def	receiveSubsequentResources() {
+			receiveWithin(100) {
+				case r: Resource => {
+					resourcesToProcess.add(r)
+					receiveSubsequentResources()
+				}
+				case TIMEOUT => {}//do nothing, return
+			}
+		}
+	}
+	reindexActor.start()
+
+	def indexResource(resource: Resource, writer: IndexWriter) {
+		val basePreamble = new Preamble(baseGraph)
+		import basePreamble._
+		def resourceToDocument(resource: Resource) = {
+			val doc = new Document
+			for (property <- indexedProperties) {
+				logger.info("indexing "+property+" with values "+(resource/property).length)
+				for (propertyValue <- resource/property) {
+					logger.info("indexing "+property+" with value "+(propertyValue*))
+					doc.add(new Field(property.getUnicodeString,
+									  propertyValue*,
+									  Field.Store.YES,
+									  Field.Index.NOT_ANALYZED))
+				}
+			}
+			doc
+		}
+		def indexNamedResource(uriRef: UriRef) {
+			val doc = resourceToDocument(uriRef)
+			doc.add(new Field(URI_FIELD_NAME, uriRef.getUnicodeString, Field.Store.YES, Field.Index.ANALYZED))
+			writer.addDocument(doc)
+		}
+		def indexAnonymousResource(resource: Resource) {
+			logger.warn("Currently only indexing named resources is supported")
+			/*val doc = resourceToDocument(resource)
+			doc.add(new Field(URI_FIELD_NAME, getIdentifier(resource), Field.Store.YES, Field.Index.ANALYZED))
+			writer.addDocument(doc)*/
+		}
+		resource match {
+			case u: UriRef => indexNamedResource(u)
+			case r => indexAnonymousResource(r)
+		}
+	}
+
+	def indexExistingResources() {
+		val basePreamble = new Preamble(baseGraph)
+		import basePreamble._
+		val instances = (for (indexedType <- indexedTypes) yield (indexedType)/-RDF.`type`).flatten
+		logger.info("instances "+instances.length)
+		val writer = new IndexWriter(index, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
+		for (instance <- instances) indexResource(instance!, writer)
+		writer.close
+
+	}
+
+	indexExistingResources()
+
+	def findResources(conditions: Condition*) = {
+		val booleanQuery = new BooleanQuery()
+		for (c <- conditions) {
+			booleanQuery.add(c.query, BooleanClause.Occur.MUST)
+		}
+		val searcher = new IndexSearcher(index, true);
+		val hitsPerPage = 10
+		val collector = TopScoreDocCollector.create(hitsPerPage, true);
+		searcher.search(booleanQuery, collector)
+		val hits = collector.topDocs().scoreDocs;
+		//logger.info("Found " + hits.length + " hits for "+pattern);
+		def getResource(d: Document): Resource = {
+			new UriRef(d.get(URI_FIELD_NAME))
+		}
+		val result = new ArrayList[Resource]()
+		for(hit <- hits) {
+			val docId = hit.doc;
+			val d = searcher.doc(docId);
+			result.add(getResource(d))
+		}
+		result
+	}
+
+	def findResources(property: UriRef, pattern: String): List[Resource] = {
+		
+		/*val query: Query = new TermQuery(new Term(
+				FOAF.firstName.getUnicodeString, something))*/
+		val query: Query = new WildcardQuery(new Term(
+				property.getUnicodeString, pattern))
+		/*val query: Query = new FuzzyQuery(new Term(
+				FOAF.firstName.getUnicodeString, something))*/
+		findResources(WildcardCondition(property, pattern))
+	}
+}

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/WilcardCondition.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/WilcardCondition.scala?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/WilcardCondition.scala (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/main/scala/org/apache/clerezza/rdf/cris/WilcardCondition.scala Mon Jan 17 13:03:48 2011
@@ -0,0 +1,32 @@
+/*
+ * 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 org.apache.clerezza.rdf.core.UriRef
+import org.apache.lucene.search.Query
+import org.apache.lucene.search.WildcardQuery
+import org.apache.lucene.index.Term
+
+case class WildcardCondition(property: UriRef, pattern: String) extends Condition {
+
+	def query: Query = new WildcardQuery(new Term(
+				property.getUnicodeString, pattern))
+
+}

Added: incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/IndexServiceTest.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/IndexServiceTest.scala?rev=1059908&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/IndexServiceTest.scala (added)
+++ incubator/clerezza/issues/CLEREZZA-388/org.apache.clerezza.rdf.cris/core/src/test/scala/org/apache/clerezza/rdf/cris/IndexServiceTest.scala Mon Jan 17 13:03:48 2011
@@ -0,0 +1,123 @@
+/*
+ * 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 org.apache.clerezza.rdf.cris.ontologies.CRIS
+import org.apache.clerezza.rdf.core._
+import org.apache.clerezza.rdf.core.impl._
+import org.apache.clerezza.rdf.utils._
+import org.apache.clerezza.rdf.scala.utils._
+import org.apache.clerezza.rdf.ontologies._
+import org.apache.clerezza.rdf.ontologies.FOAF
+import org.apache.lucene.analysis.standard.StandardAnalyzer
+import org.apache.lucene.document._
+import org.apache.lucene.store._
+import org.apache.lucene.index.IndexWriter
+import org.apache.lucene.util.Version
+import org.wymiwyg.commons.util.Util
+import java.util.List
+import org.junit._
+
+class IndexServiceTest {
+
+	val definitions = new SimpleMGraph
+	val dataGraph = new SimpleMGraph
+	var service: IndexService = null
+
+	def createPerson(firstName: String, lastName: String) {
+		val node = new GraphNode(new UriRef(Util.createURN5), dataGraph)
+		node.addProperty(RDF.`type`, FOAF.Person)
+		node.addPropertyValue(FOAF.firstName, firstName)
+		node.addPropertyValue(FOAF.lastName, lastName)
+	}
+
+	@Before
+	def prepare() {
+		def createDefinition(rdfType: UriRef, properties: UriRef*) {
+			val node = new GraphNode(new BNode, definitions)
+			node.addProperty(RDF.`type`, CRIS.IndexDefinition)
+			node.addProperty(CRIS.indexedType, rdfType)
+			for (p <- properties) {
+				node.addProperty(CRIS.indexedProperty, p)
+			}
+		}
+		createDefinition(FOAF.Person, FOAF.firstName, FOAF.lastName)
+		
+		createPerson("John", "Doe")
+		createPerson("Jane", "Doe")
+		createPerson("Frank", "Capra")
+		createPerson("Joe", "Bloggs")
+		createPerson("Jane", "Bloggs")
+		createPerson("Harry", "Wotsit")
+		createPerson("Harry Joe", "Wotsit-Bloggs")
+		//a person with two first-names
+		val node = new GraphNode(new UriRef(Util.createURN5), dataGraph)
+		node.addProperty(RDF.`type`, FOAF.Person)
+		node.addPropertyValue(FOAF.firstName, "John")
+		node.addPropertyValue(FOAF.firstName, "William")
+		node.addPropertyValue(FOAF.lastName, "Smith")
+		service = new IndexService(definitions, dataGraph)
+	}
+
+
+	@Test
+	def findResources() {
+		import scala.collection.JavaConversions._
+		val results = service.findResources(FOAF.firstName, "*Joe*")
+		Assert.assertEquals(2, results.length)
+	}
+
+	@Test
+	def findMultiProperties() {
+		import scala.collection.JavaConversions._
+		val results = service.findResources(WildcardCondition(FOAF.firstName, "*Joe*"),
+											WildcardCondition(FOAF.lastName, "*Wotsit*"))
+		/*val basePreamble = new Preamble(dataGraph)
+		import basePreamble._
+		for (r <- results) {
+			println(r/FOAF.firstName)
+			println(r/FOAF.lastName)
+		}*/
+		Assert.assertEquals(1, results.length)
+	}
+
+	@Test
+	def findMultiProperties2() {
+		import scala.collection.JavaConversions._
+		val results = service.findResources(WildcardCondition(FOAF.firstName, "*Jo*"),
+											WildcardCondition(FOAF.firstName, "*Wil*"))
+		/*val basePreamble = new Preamble(dataGraph)
+		import basePreamble._
+		for (r <- results) {
+			println(r/FOAF.firstName)
+			println(r/FOAF.lastName)
+		}*/
+		Assert.assertEquals(1, results.length)
+	}
+
+	@Test
+	def lateAddition() {
+		import scala.collection.JavaConversions._
+		createPerson("Another Joe", "Simpsons")
+		Thread.sleep(1000)
+		val results = service.findResources(FOAF.firstName, "*Joe*")
+		Assert.assertEquals(3, results.length)
+	}
+}