Author: natalia
Date: Thu Aug 16 17:35:14 2007
New Revision: 566891

URL: http://svn.apache.org/viewvc?view=rev&rev=566891
Log:
New service for executing text searches

Added:
    xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java  
 (with props)
    
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
   (with props)
    
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
   (with props)
Modified:
    
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java
    
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/IntegrationTests.java

Added: 
xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java?view=auto&rev=566891
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java 
(added)
+++ xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java 
Thu Aug 16 17:35:14 2007
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.client;
+
+import org.xmldb.api.base.Service;
+import org.xmldb.api.base.ResourceSet;
+import org.xmldb.api.base.XMLDBException;
+
+/**
+ * TextQueryService allows using full text search against a collection. The
+ * context collection must have LuceneIndexer in order to execute a search.
+ *
+ * @version $Revision$, $Date$
+ */
+public interface TextQueryService extends Service {
+    ResourceSet query(String string) throws XMLDBException;
+    ResourceSet queryResource(String string, String string1) throws 
XMLDBException;
+}

Propchange: 
xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xml/xindice/trunk/java/src/org/apache/xindice/client/TextQueryService.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date

Modified: 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java?view=diff&rev=566891&r1=566890&r2=566891
==============================================================================
--- 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java
 (original)
+++ 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java
 Thu Aug 16 17:35:14 2007
@@ -23,6 +23,7 @@
 import org.apache.xindice.client.xmldb.resources.BinaryResourceImpl;
 import 
org.apache.xindice.client.xmldb.services.CollectionManagementServiceImpl;
 import org.apache.xindice.client.xmldb.services.MetaService;
+import org.apache.xindice.client.xmldb.services.TextQueryServiceImpl;
 import org.apache.xindice.client.xmldb.services.XPathQueryServiceImpl;
 import org.apache.xindice.client.xmldb.services.XUpdateQueryServiceImpl;
 import org.apache.xindice.core.FaultCodes;
@@ -81,22 +82,21 @@
 
         // Register all services supported by this collection implementation.
         final XPathQueryServiceImpl xpath = new XPathQueryServiceImpl();
-        xpath.setCollection(this);
         // xpath.setSymbolDeserializer(syms);
         registerService(xpath);
 
         final XUpdateQueryServiceImpl xupdate = new XUpdateQueryServiceImpl();
-        xupdate.setCollection(this);
         registerService(xupdate);
 
+        final TextQueryServiceImpl text = new TextQueryServiceImpl();
+        registerService(text);
+
         // TODO  if (this.col.isMetaEnabled()) {
         final MetaService meta = new MetaService();
-        meta.setCollection(this);
         registerService(meta);
 
         try {
             final CollectionManagementServiceImpl manager = new 
CollectionManagementServiceImpl();
-            manager.setCollection(this);
             registerService(manager);
 
             // CollectionManagementServiceImpl provides both standard access 
as a
@@ -152,9 +152,7 @@
     public org.xmldb.api.base.Service getService(String name, String version) 
throws XMLDBException {
         checkOpen();
 
-        Service result = (Service) services.get(name + version);
-
-        return result;
+        return (Service) services.get(name + version);
     }
 
     /**

Added: 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java?view=auto&rev=566891
==============================================================================
--- 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
 (added)
+++ 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
 Thu Aug 16 17:35:14 2007
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.client.xmldb.services;
+
+import org.apache.xindice.client.TextQueryService;
+
+/**
+ * XML:DB TextQueryService implementation that uses XML-RPC communication
+ * with server
+ *
+ * @version $Revision$, $Date$
+ */
+public class TextQueryServiceImpl extends QueryService implements 
TextQueryService {
+
+    /**
+     * Creates new TextQueryService
+     */
+    public TextQueryServiceImpl() {
+        super();
+        queryLang = "Text";
+    }
+}

Propchange: 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xml/xindice/trunk/java/src/org/apache/xindice/client/xmldb/services/TextQueryServiceImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date

Modified: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/IntegrationTests.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/IntegrationTests.java?view=diff&rev=566891&r1=566890&r2=566891
==============================================================================
--- 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/IntegrationTests.java
 (original)
+++ 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/IntegrationTests.java
 Thu Aug 16 17:35:14 2007
@@ -27,6 +27,7 @@
 import org.apache.xindice.integration.client.services.MetaTest;
 import org.apache.xindice.integration.client.services.XPathQueryTest;
 import org.apache.xindice.integration.client.services.XUpdateQueryTest;
+import org.apache.xindice.integration.client.services.TextQueryTest;
 
 import junit.framework.TestSuite;
 
@@ -43,6 +44,7 @@
         suite.addTestSuite(DocumentTest.class);
         suite.addTestSuite(XUpdateQueryTest.class);
         suite.addTestSuite(XPathQueryTest.class);
+        suite.addTestSuite(TextQueryTest.class);
         suite.addTestSuite(MetaTest.class);
         suite.addTestSuite(IndexedSearchTest.class);
         suite.addTestSuite(BinaryResourceTest.class);

Added: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java?view=auto&rev=566891
==============================================================================
--- 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
 (added)
+++ 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
 Thu Aug 16 17:35:14 2007
@@ -0,0 +1,290 @@
+/*
+ * 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.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.integration.client.services;
+
+import org.apache.xindice.integration.client.AbstractXmlDbClientTest;
+import org.apache.xindice.client.TextQueryService;
+import org.apache.xindice.xml.TextWriter;
+import org.xmldb.api.base.Collection;
+import org.xmldb.api.base.ResourceSet;
+import org.xmldb.api.modules.XMLResource;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.w3c.dom.Node;
+
+import java.util.HashSet;
+
+/**
+ * Tests for TextService
+ * @version $Revision$, $Date$
+ */
+public class TextQueryTest extends AbstractXmlDbClientTest {
+
+    private TextQueryService textService;
+
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Collection col = client.getCollection(TEST_COLLECTION_PATH);
+        textService = (TextQueryService) col.getService("TextQueryService", 
"1.0");
+
+        String doc1 =
+                "<?xml version='1.0'?>" +
+                "<section>\n" +
+                "   <title>What Is Xindice</title>\n" +
+                "   <p>\n" +
+                "      The Xindice Core server is a database server designed 
from the\n" +
+                "      ground up to store XML data. The\n" +
+                "      Xindice server is what is termed by\n" +
+                "      the\n" +
+                "      <link href=\"http://xmldb-org.sourceforge.net/\";>XML:DB 
Initiative</link>\n" +
+                "      as a Native XML Database. You could also refer to it as 
a\n" +
+                "      seamless XML database which might be an easier to 
understand\n" +
+                "      description.\n" +
+                "   </p>\n" +
+                "   <p>\n" +
+                "      What this means is that to the largest extent possible 
you work\n" +
+                "      with XML tools and technologies when working with the 
data in the\n" +
+                "      server. All data that goes into and out of the server 
is XML. The\n" +
+                "      query language used is XPath and the programming APIs 
support DOM\n" +
+                "      and SAX. All things that should be familiar to a 
developer used\n" +
+                "      to using XML in their applications. When working with 
XML data and\n" +
+                "      Xindice there is no mapping between different data 
models. You simply\n" +
+                "      design your data as XML and store it as XML.\n" +
+                "   </p>\n" +
+                "</section>";
+        String doc2 =
+                "<?xml version='1.0'?>" +
+                "<section>\n" +
+                "   <title>Current Status</title>\n" +
+                "   <p>\n" +
+                "      Native XML database technology is a very new area and 
Xindice is very\n" +
+                "      much a project still in development.\n" +
+                "      The server currently supports storing well formed XML 
documents.\n" +
+                "      This means it does not have any schema that constrains 
what\n" +
+                "      can be placed into a document collection. This makes 
Xindice a\n" +
+                "      semi-structured database and provides tremendous\n" +
+                "      flexiblity in how you store your data, but, also means 
you give up\n" +
+                "      some common database functionality such as data\n" +
+                "      types.\n" +
+                "      In its current state Xindice is already a powerful tool 
for managing\n" +
+                "      XML data. However, there is still much that needs to be 
done.\n" +
+                "      Feedback and contributions are actively encouraged.\n" +
+                "   </p>\n" +
+                "</section>";
+        String doc3 =
+                "<?xml version='1.0'?>" +
+                "<section>\n" +
+                "   <title>Feature Summary</title>\n" +
+                "   <p>\n" +
+                "      <strong>Document Collections</strong>: Documents are 
stored in\n" +
+                "      collections that can be queried as a whole. You can 
create\n" +
+                "      collections that contain just documents of the same 
type or you\n" +
+                "      can create a collection to store all your documents 
together.\n" +
+                "      The database doesn't care.\n" +
+                "   </p>\n" +
+                "   <p>\n" +
+                "      <strong>Command Line Management Tools</strong>: To aid 
the administrator\n" +
+                "      Xindice provides a full suite of command line driven 
management tools.\n" +
+                "      Just about everything you can do through the XML:DB API 
can also be\n" +
+                "      done from the command line.\n" +
+                "   </p>\n" +
+                "</section>";
+        String doc4 =
+                "<?xml version='1.0'?>" +
+                "<section>\n" +
+                "   <title>Introducing the Command Line Tools</title>\n" +
+                "   <p>\n" +
+                "      The Xindice server includes a command line program 
named\n" +
+                "      <code>xindice</code> that allows you to manage the\n" +
+                "      data stored in the server.\n" +
+                "      A complete list of available commands and more\n" +
+                "      detail about each command can be found in the\n" +
+                "      <link href=\"guide-tools.html\">Command Line Tools 
Reference Guide</link>.\n" +
+                "   </p>\n" +
+                "</section>";
+        String doc5 =
+                "<?xml version='1.0'?>" +
+                " <section>\n" +
+                "    <title>Retrieving Documents</title>\n" +
+                "    <p>\n" +
+                "       Documents can be retrieved from the database using the 
ID that\n" +
+                "       they were inserted under.\n" +
+                "    </p>\n" +
+                " </section>";
+        String doc6 =
+                "<?xml version='1.0'?>" +
+                " <section>\n" +
+                "    <title>Deleting Documents</title>\n" +
+                "    <p>\n" +
+                "       The document identified by the key fx102 will be 
removed from the\n" +
+                "       collection /db/data/products.\n" +
+                "    </p>\n" +
+                " </section>";
+
+        String config =
+                "<index name='text' 
class='org.apache.xindice.core.indexer.LuceneIndexer'> " +
+                "<pattern pattern='title' alias='title'/>" +
+                "<pattern pattern='p' alias='text'/>" +
+                "</index>";
+        this.client.createIndexer(TEST_COLLECTION_PATH, config);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc1", doc1);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc2", doc2);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", doc3);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc4", doc4);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc5", doc5);
+        this.client.insertDocument(TEST_COLLECTION_PATH, "doc6", doc6);
+    }
+
+    public void tearDown() throws Exception {
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc1");
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc2");
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc4");
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc5");
+        this.client.removeDocument(TEST_COLLECTION_PATH, "doc6");
+
+        super.tearDown();
+    }
+
+    public void testTermQuery() throws Exception {
+        String query = "text:xml";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(3, resultSet.getSize());
+
+        HashSet actual = new HashSet();
+        actual.add(((XMLResource) resultSet.getResource(0)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(1)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(2)).getDocumentId());
+
+        HashSet expected = new HashSet();
+        expected.add("doc1");
+        expected.add("doc2");
+        expected.add("doc3");
+        assertEquals(expected, actual);
+    }
+
+    public void testPhraseQuery() throws Exception {
+        String query = "text:\"command line\"";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(2, resultSet.getSize());
+
+        HashSet actual = new HashSet();
+        actual.add(((XMLResource) resultSet.getResource(0)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(1)).getDocumentId());
+
+        HashSet expected = new HashSet();
+        expected.add("doc3");
+        expected.add("doc4");
+        assertEquals(expected, actual);
+    }
+
+    public void testAndQuery() throws Exception {
+        // By default indexer uses SimpleAnalyzer that does not stem words,
+        // so query has to exact
+        String query = "title:documents AND text:removed";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(1, resultSet.getSize());
+
+        String key = ((XMLResource) resultSet.getResource(0)).getDocumentId();
+        assertEquals("doc6", key);
+    }
+
+    public void testOrQuery() throws Exception {
+        String query = "text:server OR text:database";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(5, resultSet.getSize());
+
+        HashSet actual = new HashSet();
+        actual.add(((XMLResource) resultSet.getResource(0)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(1)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(2)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(3)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(4)).getDocumentId());
+
+        HashSet expected = new HashSet();
+        expected.add("doc1");
+        expected.add("doc2");
+        expected.add("doc3");
+        expected.add("doc4");
+        expected.add("doc5");
+        assertEquals(expected, actual);
+    }
+
+    public void testWildcardQuery() throws Exception {
+        String query = "text:program*";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(2, resultSet.getSize());
+
+        HashSet actual = new HashSet();
+        actual.add(((XMLResource) resultSet.getResource(0)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(1)).getDocumentId());
+
+        HashSet expected = new HashSet();
+        expected.add("doc1");
+        expected.add("doc4");
+        assertEquals(expected, actual);
+    }
+
+    public void testProximityQuery() throws Exception {
+        String query = "text:\"xindice database\"~5";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(2, resultSet.getSize());
+
+        HashSet actual = new HashSet();
+        actual.add(((XMLResource) resultSet.getResource(0)).getDocumentId());
+        actual.add(((XMLResource) resultSet.getResource(1)).getDocumentId());
+
+        HashSet expected = new HashSet();
+        expected.add("doc1");
+        expected.add("doc2");
+        assertEquals(expected, actual);
+    }
+
+    public void testResultDoc() throws Exception {
+        String query = "title:\"deleting documents\"";
+
+        ResourceSet resultSet = textService.query(query);
+        assertEquals(1, resultSet.getSize());
+
+        XMLResource resource = (XMLResource) resultSet.getResource(0);
+
+        assertEquals("doc6", resource.getDocumentId());
+
+        Node node = resource.getContentAsDOM();
+
+        // modify the document to add source node information
+        String doc =
+                "<?xml version='1.0'?>" +
+                " <section xmlns:src='http://xml.apache.org/xindice/Query' 
src:col='/db/testing/current' src:key='doc6'>\n" +
+                "    <title>Deleting Documents</title>\n" +
+                "    <p>\n" +
+                "       The document identified by the key fx102 will be 
removed from the\n" +
+                "       collection /db/data/products.\n" +
+                "    </p>\n" +
+                " </section>";
+        XMLAssert.assertXMLEqual(doc, TextWriter.toString(node));
+    }
+}

Propchange: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/integration/client/services/TextQueryTest.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date


Reply via email to