vgritsenko    2004/02/24 07:44:01

  Modified:    java/tests/src/org/apache/xindice/integration/client/services
                        XPathQueryTest.java
               java/src/org/apache/xindice/core/query QueryUtil.java
               .        status.xml
  Log:
  XPath query resulting in attribute nodes will return attributes
  on the <result> element.
  
  Revision  Changes    Path
  1.12      +425 -530  
xml-xindice/java/tests/src/org/apache/xindice/integration/client/services/XPathQueryTest.java
  
  Index: XPathQueryTest.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/tests/src/org/apache/xindice/integration/client/services/XPathQueryTest.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- XPathQueryTest.java       8 Feb 2004 03:57:02 -0000       1.11
  +++ XPathQueryTest.java       24 Feb 2004 15:44:01 -0000      1.12
  @@ -20,545 +20,440 @@
   
   import org.apache.xindice.integration.client.AbstractXmlDbClientTest;
   import org.apache.xindice.xml.TextWriter;
  -import org.custommonkey.xmlunit.XMLAssert;
   
  +import org.custommonkey.xmlunit.XMLAssert;
   import org.w3c.dom.Node;
  +import org.w3c.dom.Document;
   import org.xmldb.api.base.Collection;
  -import org.xmldb.api.base.ResourceIterator;
   import org.xmldb.api.base.ResourceSet;
   import org.xmldb.api.base.XMLDBException;
   import org.xmldb.api.modules.XMLResource;
   import org.xmldb.api.modules.XPathQueryService;
   
  -import java.util.ArrayList;
  -import java.util.List;
  -
   /**
  - * @version CVS $Revision$, $Date$
  - * @author Vladimir R. Bossicard <[EMAIL PROTECTED]>
  + *
  + * @author <a href="mailto:[EMAIL PROTECTED]">Vladimir R. Bossicard</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Kevin O'Neill</a>
  + * @version CVS $Revision$, $Date$
    */
  -public class XPathQueryTest extends AbstractXmlDbClientTest
  -{
  +public class XPathQueryTest extends AbstractXmlDbClientTest {
  +
  +    private Collection col;
  +    private XPathQueryService xpathservice;
  +
  +    public void setUp() throws Exception {
  +        super.setUp();
   
  -     public void setUp() throws Exception
  -     {
  -             super.setUp();
  -
  -             String document1 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<person>"
  -                             + "<first>John</first>"
  -                             + "<last>Smith</last>"
  -                             + "<age>30</age>"
  -                             + "<phone type=\"work\">555-345-6789</phone>"
  -                             + "</person>";
  -             String document2 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<person>"
  -                             + "<first>Sally</first>"
  -                             + "<last>Smith</last>"
  -                             + "<age>20</age>"
  -                             + "<phone type=\"work\">555-345-6789</phone>"
  -                             + "</person>";
  -
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc1", 
document1);
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc2", 
document2);
  -     }
  -
  -     public void tearDown() throws Exception
  -     {
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc1");
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc2");
  -
  -             super.tearDown();
  -     }
  -
  -     public void testSimpleQuery() throws Exception
  -     {
  -             String query = "//person[last='Smith']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testSimpleAndQuery() throws Exception
  -     {
  -             String query = "//person[first='John' and last='Smith']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -     }
  -
  -     public void testSimpleOrQuery() throws Exception
  -     {
  -             String query = "//person[first='John' or last='Smith']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testMultipleOrQuery() throws Exception
  -     {
  -             String query = "//person[first='John' or first='Sally']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testAndOrQuery() throws Exception
  -     {
  -             String query = "//person[last='Smith' and (first='John' or 
first='Sally')]";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testSimpleWildcardSearchQuery() throws Exception
  -     {
  -             // search all records whose last name contains 'Smi'
  -             String query = "//person[contains(last, 'Smi')]";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testStartsWithSearchQuery() throws Exception
  -     {
  -             String document3 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<person>"
  -                             + "<first>Sally</first>"
  -                             + "<last>aSm</last>"
  -                             + "<phone type=\"work\">555-345-6789</phone>"
  -                             + "</person>";
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", 
document3);
  -
  -             // search all records whose last name begins with 'Smi'
  -             String query = "//person[(string-length(//person/last) >= 3) 
and (substring(//person/last, 1, 3)='Smi')]";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  -     }
  -
  -     public void testEndsWithSearchQuery() throws Exception
  -     {
  -             // search all records whose last name begins with 'ith'
  -             String query = "//person[(string-length(//person/last) >= 4) 
and (substring(//person/last, 2)='mith')]";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testGreaterSearchQuery() throws Exception
  -     {
  -             String query = "//person[age > 25]";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -     }
  -
  -     public void testGetSingleTextNode() throws Exception
  -     {
  -             String query = "//person[first='John' and 
last='Smith']/first/text()";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             assertEquals(1L, resultSet.getSize());
  -             assertEquals("John", resultSet.getResource(0).getContent());
  -     }
  -
  -     public void testGetMultipleTextNodes() throws Exception
  -     {
  -             String query = "//person/first/text()";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -     }
  -
  -     public void testNamespaceDOM() throws Exception
  -     {
  -             String document3 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<p:person 
xmlns:p='http://example.net/person' >"
  -                             + "<p:first>Sally</p:first>"
  -                             + "<p:last>Smith</p:last>"
  -                             + "<p:phone 
type=\"work\">555-345-6789</p:phone>"
  -                             + "</p:person>";
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", 
document3);
  -
  -             String query = "//h:person[h:first='Sally' and 
h:last='Smith']/h:first";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             xpathservice.setNamespace("h", "http://example.net/person";);
  -
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -
  -             XMLResource resource = (XMLResource) resultSet.getResource(0);
  -
  -             // ensure that the resource has the correct doc id.
  -             assertEquals("doc3", resource.getDocumentId());
  -
  -             Node node = resource.getContentAsDOM();
  -
  -             // add source node information to the compared xml as it's 
added by
  -             // the query processor.
  -             XMLAssert.assertXMLEqual(
  -                     "<first xmlns:src='http://xml.apache.org/xindice/Query' 
src:col='/db/testing/current' src:key='doc3' 
xmlns='http://example.net/person'>Sally</first>",
  -                     TextWriter.toString(node));
  -
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  -     }
  -
  -     public void testFetchMultipleAttributeNode() throws Exception
  -     {
  -             String document3 = "<?xml version=\"1.0\"?>" + "<foo 
bar='foo'>" + "<bar foo='bar' bar='bar'/>" + "</foo>";
  -
  -             client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  -
  -             String query = "//@bar";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -
  -             ResourceSet resultSet = null;
  -             try
  -             {
  -                     resultSet = xpathservice.query(query);
  -             }
  -             catch (Exception e)
  -             {
  -                     fail(e.getMessage());
  -             }
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(2, res.size());
  -
  -             XMLResource resource = (XMLResource) resultSet.getResource(0);
  -
  -             Node node = resource.getContentAsDOM();
  -
  -             client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  -     }
  -
  -     public void testFetchAttributeNode() throws Exception
  -     {
  -             String document3 = "<?xml version=\"1.0\"?>" + "<foo 
bar='foo'>" + "<bar foo='bar' bar='bar'/>" + "</foo>";
  -
  -             client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  -
  -             String query = "//foo/@bar";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -
  -             ResourceSet resultSet = null;
  -             try
  -             {
  -                     resultSet = xpathservice.query(query);
  -             }
  -             catch (Exception e)
  -             {
  -                     fail(e.getMessage());
  -             }
  -
  -             assertEquals(1L, resultSet.getSize());
  -             assertEquals("foo", 
resultSet.getResource(0).getContent().toString());
  -     }
  -
  -     public void testFetchBoolean() throws Exception
  -     {
  -             String query = "boolean(//person)";
  -
  -             Collection col = client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             try
  -             {
  -                     ResourceSet resultSet = xpathservice.query(query);
  -
  -                     // when we do support it the following tests will be run
  -                     assertEquals(2L, resultSet.getSize());
  -                     assertEquals("true", 
resultSet.getResource(1L).getContent());
  -
  -             }
  -             catch (XMLDBException e)
  -             {
  -                     fail(e.getMessage());
  -             }
  -     }
  -
  -     public void testFetchString() throws Exception
  -     {
  -             String query = "string(//person[first='John' and 
last='Smith']/first)";
  -
  -             Collection col = client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             try
  -             {
  -                     ResourceSet resultSet = xpathservice.query(query);
  -
  -                     assertEquals(2L, resultSet.getSize());
  -             }
  -             catch (XMLDBException e)
  -             {
  -                     fail(e.getMessage());
  -             }
  -     }
  -
  -     public void testFetchNumber() throws Exception
  -     {
  -             String query = "count(//person[first='John' and last='Smith'])";
  -
  -             Collection col = client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             try
  -             {
  -                     ResourceSet resultSet = xpathservice.query(query);
  -
  -                     assertEquals(2L, resultSet.getSize());
  -             }
  -             catch (XMLDBException e)
  -             {
  -                     fail(e.getMessage());
  -             }
  -     }
  -
  -     public void testSrcAddedToRootOnly() throws Exception
  -     {
  -             String query = "//person[first='John' and last='Smith']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -
  -             XMLResource resource = (XMLResource) resultSet.getResource(0);
  -
  -             String john =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<person 
xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' 
src:key='doc1'>"
  -                             + "<first>John</first>"
  -                             + "<last>Smith</last>"
  -                             + "<age>30</age>"
  -                             + "<phone type=\"work\">555-345-6789</phone>"
  -                             + "</person>";
  -
  -             // ensure that the resource has the correct doc id.
  -             assertEquals("doc1", resource.getDocumentId());
  -
  -             XMLAssert.assertXMLEqual(john, 
TextWriter.toString(resource.getContentAsDOM()));
  -     }
  -
  -     public void testConflictingPrefix() throws Exception
  -     {
  -             String document3 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<src:person 
xmlns:src='http://example.net/person' >"
  -                             + "<src:first>Sally</src:first>"
  -                             + "<src:last>Smith</src:last>"
  -                             + "<src:phone 
type=\"work\">555-345-6789</src:phone>"
  -                             + "</src:person>";
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", 
document3);
  -
  -             String query = "//h:person[h:first='Sally' and 
h:last='Smith']/h:first";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             xpathservice.setNamespace("h", "http://example.net/person";);
  -
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -
  -             XMLResource resource = (XMLResource) resultSet.getResource(0);
  -
  -             // ensure that the resource has the correct doc id.
  -             assertEquals("doc3", resource.getDocumentId());
  -
  -             Node node = resource.getContentAsDOM();
  -
  -             // add source node information to the compared xml as it's 
added by
  -             // the query processor.
  -             XMLAssert.assertXMLEqual(
  -                     "<first xmlns:src='http://xml.apache.org/xindice/Query' 
src:col='/db/testing/current' src:key='doc3' 
xmlns='http://example.net/person'>Sally</first>",
  -                     TextWriter.toString(node));
  -
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  -     }
  -
  -     public static List asList(ResourceIterator iter) throws Exception
  -     {
  -             if (iter == null)
  -             {
  -                     return null;
  -             }
  -
  -             List result = null;
  -             result = new ArrayList();
  -             while (iter.hasMoreResources())
  -             {
  -                     result.add(iter.nextResource());
  -             }
  -             return result;
  -     }
  -
  -     public void testNamespacesNotImportedDeep() throws Exception
  -     {
  -             // make sure that we don't have the namespace defs needlessly
  -             // imported from the root all the way through the tree
  -             // i.e. namespaces imported from above root should not
  -             // be spread into child nodes
  -             String document3 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<p:person 
xmlns:p='http://example.net/person' >"
  -                             + "<p:first>Sally</p:first>"
  -                             + "<p:last>Smith</p:last>"
  -                             + "<p:phone 
p:type=\"work\">555-345-6789</p:phone>"
  -                             + "</p:person>";
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", 
document3);
  -
  -             String query = "//h:person[h:first='Sally' and h:last='Smith']";
  -
  -             Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -             XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -             xpathservice.setNamespace("h", "http://example.net/person";);
  -
  -             ResourceSet resultSet = xpathservice.query(query);
  -
  -             ResourceIterator results = resultSet.getIterator();
  -             List res = asList(results);
  -             assertEquals(1, res.size());
  -
  -             XMLResource resource = (XMLResource) resultSet.getResource(0);
  -             Node node = resource.getContentAsDOM();
  -             String retrieved = TextWriter.toString(node);
  -             assertFalse("Namespace definitions imported deep in: " + 
retrieved, -1 == retrieved.indexOf("<p:first>"));
  -
  -             // ensure that the resource has the correct doc id.
  -             assertEquals("doc3", resource.getDocumentId());
  -
  -             // add source node information to the compared xml as it's 
added by
  -             // the query processor. Note, this should work using without the
  -             // prefixes in the control document using the default namespace,
  -             // (i.e. xmlns='http://example.net/person') but I couldn't get 
it to work
  -             // with XMLAssert (and we'return not testing XMLAssert so we 
just use the prefixes here too)
  -             XMLAssert.assertXMLEqual(
  -                     "<p:person xmlns:p='http://example.net/person' 
xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' 
src:key='doc3'>"
  -                             + "<p:first>Sally</p:first>"
  -                             + "<p:last>Smith</p:last>"
  -                             + "<p:phone 
p:type=\"work\">555-345-6789</p:phone>"
  -                             + "</p:person>",
  -                     TextWriter.toString(node));
  -
  -             this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  -     }
  -
  -     public void testMathOpQuery() throws Exception
  -     {
  -             // force a non-XObject Object to be supplied to 
evalMathOperation as
  -             // one of its operands
  -             // this works in the buggy version of XPathQueryResolver but 
only
  -             // because a ClassCastException that cuts short the indexing 
evaluation
  -             // is caught and ignored forcing a collection scan (if logging 
WARN, you'll see stack trace)
  -
  -             String query = "//person[substring(last, string-length(last) - 
two)='ith']";
  -             String document3 =
  -                     "<?xml version=\"1.0\"?>"
  -                             + "<person>"
  -                             + "<first>Sally</first>"
  -                             + "<last>Smith</last>"
  -                             + "<one>1</one>"
  -                             + "<two>2.0</two>"
  -                             + "<phone call=\"no\" 
type=\"work\">555-345-6789</phone>"
  -                             + "</person>";
  -             this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", 
document3);
  -
  -             try
  -             {
  -                     Collection col = 
this.client.getCollection(TEST_COLLECTION_PATH);
  -                     XPathQueryService xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  -                     ResourceSet resultSet = xpathservice.query(query);
  -
  -                     ResourceIterator results = resultSet.getIterator();
  -
  -                     List res = asList(results);
  -                     assertEquals(1, res.size());
  -             }
  -             finally
  -             {
  -                     this.client.removeDocument(TEST_COLLECTION_PATH, 
"doc3");
  -             }
  -     }
  +        this.col = this.client.getCollection(TEST_COLLECTION_PATH);
  +        this.xpathservice = (XPathQueryService) 
col.getService("XPathQueryService", "1.0");
  +
  +        String document1
  +                = "<?xml version=\"1.0\"?>"
  +                + "<person>"
  +                +   "<first>John</first>"
  +                +   "<last>Smith</last>"
  +                +   "<age>30</age>"
  +                +   "<phone type=\"work\">555-345-6789</phone>"
  +                + "</person>";
  +        String document2
  +                = "<?xml version=\"1.0\"?>"
  +                + "<person>"
  +                +   "<first>Sally</first>"
  +                +   "<last>Smith</last>"
  +                +   "<age>20</age>"
  +                +   "<phone type=\"work\">555-345-6789</phone>"
  +                + "</person>";
  +
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc1", document1);
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc2", document2);
  +    }
  +
  +    public void tearDown() throws Exception {
  +        this.client.removeDocument(TEST_COLLECTION_PATH, "doc1");
  +        this.client.removeDocument(TEST_COLLECTION_PATH, "doc2");
  +
  +        super.tearDown();
  +    }
  +
  +
  +    public void testSimpleQuery() throws Exception {
  +        String query = "//person[last='Smith']";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testSimpleAndQuery() throws Exception {
  +        String query = "//person[first='John' and last='Smith']";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testSimpleOrQuery() throws Exception {
  +        String query = "//person[first='John' or last='Smith']";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testMultipleOrQuery() throws Exception {
  +        String query = "//person[first='John' or first='Sally' or age]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testAndOrQuery() throws Exception {
  +        String query = "//person[last='Smith' and (first='John' or 
first='Sally')]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testContainsSearchQuery() throws Exception {
  +        // search all records whose last name contains 'Smi'
  +        String query = "//person[contains(last, 'Smi')]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testStartsWithSearchQuery() throws Exception {
  +        String document3 =
  +                "<?xml version=\"1.0\"?>"
  +                + "<person>"
  +                + "<first>Sally</first>"
  +                + "<last>aSm</last>"
  +                + "<phone type=\"work\">555-345-6789</phone>"
  +                + "</person>";
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        // search all records whose last name begins with 'Smi'
  +        String query = "//person[string-length(//person/last) >= 3 and 
substring(//person/last, 1, 3)='Smi']";
  +
  +        try {
  +            ResourceSet resultSet = xpathservice.query(query);
  +            assertEquals(2, resultSet.getSize());
  +
  +            Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +            Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +            assertEquals("person", 
result0.getDocumentElement().getNodeName());
  +            assertEquals("person", 
result1.getDocumentElement().getNodeName());
  +        } finally {
  +            this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +        }
  +    }
  +
  +    public void testEndsWithSearchQuery() throws Exception {
  +        // search all records whose last name begins with 'ith'
  +        String query = "//person[(string-length(//person/last) >= 4) and 
(substring(//person/last, 2)='mith')]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Document result1 = (Document)((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +        assertEquals("person", result1.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testGreaterSearchQuery() throws Exception {
  +        String query = "//person[age > 25]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +    }
  +
  +    public void testLesserSearchQuery() throws Exception {
  +        String query = "//person[age < 25]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        Document result0 = (Document)((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        assertEquals("person", result0.getDocumentElement().getNodeName());
  +    }
  +
  +
  +    public void testNamespaceDOM() throws Exception {
  +        String document3 =
  +                "<?xml version=\"1.0\"?>"
  +                + "<p:person xmlns:p='http://example.net/person' >"
  +                + "<p:first>Sally</p:first>"
  +                + "<p:last>Smith</p:last>"
  +                + "<p:phone type=\"work\">555-345-6789</p:phone>"
  +                + "</p:person>";
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        String query = "//h:person[h:first='Sally' and 
h:last='Smith']/h:first";
  +
  +        xpathservice.setNamespace("h", "http://example.net/person";);
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        XMLResource resource = (XMLResource) resultSet.getResource(0);
  +
  +        // ensure that the resource has the correct doc id.
  +        assertEquals("doc3", resource.getDocumentId());
  +
  +        Node node = resource.getContentAsDOM();
  +
  +        // add source node information to the compared xml as it's added by
  +        // the query processor.
  +        XMLAssert.assertXMLEqual("<first 
xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' 
src:key='doc3' xmlns='http://example.net/person'>Sally</first>",
  +                                 TextWriter.toString(node));
  +
  +        this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +    }
  +
  +
  +    public void testFetchSingleTextNode() throws Exception {
  +        String query = "//person[first='John' and 
last='Smith']/first/text()";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1L, resultSet.getSize());
  +
  +        assertEquals("John", resultSet.getResource(0).getContent());
  +    }
  +
  +    public void testFetchMultipleTextNodes() throws Exception {
  +        String query = "//person/first/text()";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        assertEquals("John", resultSet.getResource(0).getContent());
  +        assertEquals("Sally", resultSet.getResource(1).getContent());
  +    }
  +
  +    public void testFetchAttributeNode() throws Exception {
  +        String document3 = "<?xml version=\"1.0\"?>" + "<foo bar='foo'>" + 
"<bar foo='bar' bar='bar'/>" + "</foo>";
  +        client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        try {
  +            String query = "//foo/@bar";
  +
  +            ResourceSet resultSet = xpathservice.query(query);
  +            assertEquals(1L, resultSet.getSize());
  +
  +            Node result = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +            assertEquals("foo", 
result.getChildNodes().item(0).getAttributes().item(0).getNodeValue());
  +        } finally {
  +            client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +        }
  +    }
  +
  +    public void testFetchMultipleAttributeNode() throws Exception {
  +        String document3 = "<?xml version=\"1.0\"?>" + "<foo bar='foo'>" + 
"<bar foo='bar' bar='bar'/>" + "</foo>";
  +        client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        try {
  +            String query = "//@bar";
  +
  +            ResourceSet resultSet = xpathservice.query(query);
  +            assertEquals(2, resultSet.getSize());
  +
  +            Node result0 = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +            Node result1 = ((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +            assertEquals("foo", 
result0.getChildNodes().item(0).getAttributes().item(0).getNodeValue());
  +            assertEquals("bar", 
result1.getChildNodes().item(0).getAttributes().item(0).getNodeValue());
  +        } finally {
  +            client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +        }
  +    }
  +
  +    public void testFetchBoolean() throws Exception {
  +        String query = "boolean(//person)";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2L, resultSet.getSize());
  +
  +        String result0 = (String)resultSet.getResource(0).getContent();
  +        String result1 = (String)resultSet.getResource(1).getContent();
  +        assertEquals("true", result0);
  +        assertEquals("true", result1);
  +    }
  +
  +    public void testFetchString() throws Exception {
  +        String query = "string(//person[first='John' and 
last='Smith']/first)";
  +
  +        try {
  +            ResourceSet resultSet = xpathservice.query(query);
  +
  +            assertEquals(2L, resultSet.getSize());
  +        } catch (XMLDBException e) {
  +            fail(e.getMessage());
  +        }
  +    }
  +
  +    public void testFetchNumber() throws Exception {
  +        String query = "count(//person[first='John' and last='Smith'])";
  +
  +        try {
  +            ResourceSet resultSet = xpathservice.query(query);
  +
  +            assertEquals(2L, resultSet.getSize());
  +        } catch (XMLDBException e) {
  +            fail(e.getMessage());
  +        }
  +    }
  +
  +    public void testSrcAddedToRootOnly() throws Exception {
  +        String query = "//person[first='John' and last='Smith']";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        XMLResource resource = (XMLResource) resultSet.getResource(0);
  +
  +        String john =
  +                "<?xml version=\"1.0\"?>"
  +                + "<person xmlns:src='http://xml.apache.org/xindice/Query' 
src:col='/db/testing/current' src:key='doc1'>"
  +                + "<first>John</first>"
  +                + "<last>Smith</last>"
  +                + "<age>30</age>"
  +                + "<phone type=\"work\">555-345-6789</phone>"
  +                + "</person>";
  +
  +        // ensure that the resource has the correct doc id.
  +        assertEquals("doc1", resource.getDocumentId());
  +
  +        XMLAssert.assertXMLEqual(john, 
TextWriter.toString(resource.getContentAsDOM()));
  +    }
  +
  +    public void testConflictingPrefix() throws Exception {
  +        String document3 =
  +                "<?xml version=\"1.0\"?>"
  +                + "<src:person xmlns:src='http://example.net/person' >"
  +                + "<src:first>Sally</src:first>"
  +                + "<src:last>Smith</src:last>"
  +                + "<src:phone type=\"work\">555-345-6789</src:phone>"
  +                + "</src:person>";
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        String query = "//h:person[h:first='Sally' and 
h:last='Smith']/h:first";
  +
  +        xpathservice.setNamespace("h", "http://example.net/person";);
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        XMLResource resource = (XMLResource) resultSet.getResource(0);
  +
  +        // ensure that the resource has the correct doc id.
  +        assertEquals("doc3", resource.getDocumentId());
  +
  +        Node node = resource.getContentAsDOM();
  +
  +        // add source node information to the compared xml as it's added by
  +        // the query processor.
  +        XMLAssert.assertXMLEqual("<first 
xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' 
src:key='doc3' xmlns='http://example.net/person'>Sally</first>",
  +                                 TextWriter.toString(node));
  +
  +        this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +    }
  +
  +    public void testNamespacesNotImportedDeep() throws Exception {
  +        // make sure that we don't have the namespace defs needlessly
  +        // imported from the root all the way through the tree
  +        // i.e. namespaces imported from above root should not
  +        // be spread into child nodes
  +        String document3 =
  +                "<?xml version=\"1.0\"?>"
  +                + "<p:person xmlns:p='http://example.net/person' >"
  +                + "<p:first>Sally</p:first>"
  +                + "<p:last>Smith</p:last>"
  +                + "<p:phone p:type=\"work\">555-345-6789</p:phone>"
  +                + "</p:person>";
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        String query = "//h:person[h:first='Sally' and h:last='Smith']";
  +
  +        xpathservice.setNamespace("h", "http://example.net/person";);
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        XMLResource resource = (XMLResource) resultSet.getResource(0);
  +        Node node = resource.getContentAsDOM();
  +        String retrieved = TextWriter.toString(node);
  +        assertFalse("Namespace definitions imported deep in: " + retrieved, 
-1 == retrieved.indexOf("<p:first>"));
  +
  +        // ensure that the resource has the correct doc id.
  +        assertEquals("doc3", resource.getDocumentId());
  +
  +        // add source node information to the compared xml as it's added by
  +        // the query processor. Note, this should work using without the
  +        // prefixes in the control document using the default namespace,
  +        // (i.e. xmlns='http://example.net/person') but I couldn't get it to 
work
  +        // with XMLAssert (and we'return not testing XMLAssert so we just 
use the prefixes here too)
  +        XMLAssert.assertXMLEqual("<p:person 
xmlns:p='http://example.net/person' 
xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' 
src:key='doc3'>"
  +                                 + "<p:first>Sally</p:first>"
  +                                 + "<p:last>Smith</p:last>"
  +                                 + "<p:phone 
p:type=\"work\">555-345-6789</p:phone>"
  +                                 + "</p:person>",
  +                                 TextWriter.toString(node));
  +
  +        this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +    }
  +
  +    public void testMathOpQuery() throws Exception {
  +        // force a non-XObject Object to be supplied to evalMathOperation as
  +        // one of its operands
  +        // this works in the buggy version of XPathQueryResolver but only
  +        // because a ClassCastException that cuts short the indexing 
evaluation
  +        // is caught and ignored forcing a collection scan (if logging WARN, 
you'll see stack trace)
  +
  +        String query = "//person[substring(last, string-length(last) - 
two)='ith']";
  +        String document3 =
  +                "<?xml version=\"1.0\"?>"
  +                + "<person>"
  +                + "<first>Sally</first>"
  +                + "<last>Smith</last>"
  +                + "<one>1</one>"
  +                + "<two>2.0</two>"
  +                + "<phone call=\"no\" type=\"work\">555-345-6789</phone>"
  +                + "</person>";
  +        this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
  +
  +        try {
  +            ResourceSet resultSet = xpathservice.query(query);
  +            assertEquals(1, resultSet.getSize());
  +        } finally {
  +            this.client.removeDocument(TEST_COLLECTION_PATH, "doc3");
  +        }
  +    }
   }
  
  
  
  1.2       +12 -3     
xml-xindice/java/src/org/apache/xindice/core/query/QueryUtil.java
  
  Index: QueryUtil.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/query/QueryUtil.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- QueryUtil.java    24 Feb 2004 03:20:27 -0000      1.1
  +++ QueryUtil.java    24 Feb 2004 15:44:01 -0000      1.2
  @@ -25,6 +25,7 @@
   import org.apache.xindice.xml.dom.DBNode;
   import org.apache.xindice.xml.dom.DocumentImpl;
   
  +import org.w3c.dom.Attr;
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
  @@ -63,7 +64,15 @@
           int count = 0;
           while (nodeSet != null && nodeSet.hasMoreNodes()) {
               final Object element = nodeSet.getNextNode();
  -            if (element instanceof Node) {
  +            if (element instanceof Attr) {
  +                Attr n = (Attr) element;
  +
  +                // FIXME: This should be namespaced element in 
XindiceCollection.QUERY_NS namespace
  +                Element holder = doc.createElement("result");
  +                holder.setAttributeNode((Attr)doc.importNode(n, true));
  +
  +                root.appendChild(holder);
  +            } else if (element instanceof Node) {
                   Node n = (Node) element;
   
                   if (n.getNodeType() == Node.DOCUMENT_NODE) {
  
  
  
  1.37      +4 -0      xml-xindice/status.xml
  
  Index: status.xml
  ===================================================================
  RCS file: /home/cvs/xml-xindice/status.xml,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- status.xml        24 Feb 2004 15:32:27 -0000      1.36
  +++ status.xml        24 Feb 2004 15:44:01 -0000      1.37
  @@ -69,6 +69,10 @@
   
       <changes>
           <release version="1.1b4-dev" date="February 24 2004">
  +            <action dev="VG" type="fix" fixes-bug="22156">
  +                XPath query resulting in attribute nodes will return 
attributes
  +                on the &lt;result&gt; element.
  +            </action>
               <action dev="VG" type="fix">
                   Fixed bug with DocumentImpl.importNode when importing 
attribute nodes.
               </action>
  
  
  

Reply via email to