[Mulgara-svn] r1590 - in trunk/src/jar/resolver-lucene: . java/org/mulgara/resolver/lucene

ronald at mulgara.org ronald at mulgara.org
Wed Mar 4 14:08:02 UTC 2009


Author: ronald
Date: 2009-03-04 06:08:01 -0800 (Wed, 04 Mar 2009)
New Revision: 1590

Modified:
   trunk/src/jar/resolver-lucene/build.xml
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java
Log:
Added subquery tests and improved error reporting a bit.

Modified: trunk/src/jar/resolver-lucene/build.xml
===================================================================
--- trunk/src/jar/resolver-lucene/build.xml	2009-03-04 14:07:56 UTC (rev 1589)
+++ trunk/src/jar/resolver-lucene/build.xml	2009-03-04 14:08:01 UTC (rev 1590)
@@ -44,6 +44,7 @@
     <fileset file="${tuples-hybrid.dist.dir}/${tuples-hybrid.jar}"/>
     <fileset file="${resolver-memory.dist.dir}/${resolver-memory.jar}"/>
     <fileset file="${content-n3.dist.dir}/${content-n3.jar}"/>
+    <fileset file="${content-rdfxml.dist.dir}/${content-rdfxml.jar}"/>
     <fileset file="${resolver-file.dist.dir}/${resolver-file.jar}"/>
     <fileset file="${lib.dir}/${antlr.jar}"/>
   </path>

Modified: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java	2009-03-04 14:07:56 UTC (rev 1589)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java	2009-03-04 14:08:01 UTC (rev 1590)
@@ -82,6 +82,8 @@
   public static Test suite() {
     TestSuite suite = new TestSuite();
     suite.addTest(new LuceneResolverUnitTest("testBasicQueries"));
+    suite.addTest(new LuceneResolverUnitTest("testSubqueries"));
+    suite.addTest(new LuceneResolverUnitTest("testSubqueries2"));
     suite.addTest(new LuceneResolverUnitTest("testConcurrentQueries"));
     suite.addTest(new LuceneResolverUnitTest("testConcurrentReadTransaction"));
     suite.addTest(new LuceneResolverUnitTest("testTransactionIsolation"));
@@ -144,11 +146,26 @@
                    tempResolverFactoryClassName,    // temporary models
                    null,                            // no dir for temp models
                    "",                              // no rule loader
-                   "org.mulgara.content.n3.N3ContentHandler");
+                   "org.mulgara.content.rdfxml.RDFXMLContentHandler");
 
+      database.addContentHandler("org.mulgara.content.n3.N3ContentHandler");
       database.addResolverFactory("org.mulgara.resolver.lucene.LuceneResolverFactory", persistenceDirectory);
 
       ti = new TqlInterpreter();
+
+      // Load some test data
+      Session session = database.newSession();
+      try {
+        URI fileURI = new File(textDirectory + File.separator + "data.n3").toURI();
+
+        if (session.modelExists(modelURI)) {
+          session.removeModel(modelURI);
+        }
+        session.createModel(modelURI, luceneModelType);
+        session.setModel(modelURI, new GraphResource(fileURI));
+      } finally {
+        session.close();
+      }
     }
   }
 
@@ -172,15 +189,6 @@
       Session session = database.newSession();
 
       try {
-        // Load some test data
-        URI fileURI = new File(textDirectory + File.separator + "data.n3").toURI();
-
-        if (session.modelExists(modelURI)) {
-          session.removeModel(modelURI);
-        }
-        session.createModel(modelURI, luceneModelType);
-        session.setModel(modelURI, new GraphResource(fileURI));
-
         // Run simple query with variable subject and fixed predicate
         String q = "select $s from <foo:bar> where $s <foo:hasText> 'American' in <" + modelURI + ">;";
         Answer answer = session.query(parseQuery(q));
@@ -262,22 +270,128 @@
   }
 
   /**
+   * Subqueries.
+   */
+  public void testSubqueries() throws Exception {
+    logger.info("Testing subqueries");
+
+    try {
+      Session session = database.newSession();
+
+      try {
+        // Lucene query in outer query
+        String q = "select $s subquery(select $y $z from <" + modelURI + "> where $s $y $z)" +
+                   " from <foo:bar> where $s $p 'b*' in <" + modelURI + "> order by $s;";
+
+        Answer answer = session.query(parseQuery(q));
+        compareResults(new Object[][] {
+          { "foo:node13",  new Object[][] { { "foo:hasText", "Benefit Evaluation of Direct Coronary Stenting Study Group" } } },
+          { "foo:node14",  new Object[][] { { "foo:hasText", "Biomarkers Definitions Working Group." } } },
+        }, answer, true);
+        answer.close();
+
+        // Lucene query in both
+        q = "select $x subquery(select $y from <foo:bar> where $x $y 'a*' in <" + modelURI + ">) " +
+            "  from <foo:bar> where $x <foo:hasText> 'Group' in <" + modelURI + "> order by $x;";
+
+        answer = session.query(parseQuery(q));
+        compareResults(new Object[][] {
+          { "foo:node1",  new Object[][] { { "foo:hasText" } } },
+          { "foo:node11", new Object[][] { { "foo:hasText" } } },
+          { "foo:node12", new Object[][] { { "foo:hasText" } } },
+          { "foo:node13", new Object[][] { } },
+          { "foo:node14", new Object[][] { } },
+          { "foo:node18", new Object[][] { } },
+          { "foo:node2",  new Object[][] { { "foo:hasText" } } },
+          { "foo:node4",  new Object[][] { { "foo:hasText" } } },
+          { "foo:node9",  new Object[][] { { "foo:hasText" } } },
+        }, answer);
+        answer.close();
+
+      } finally {
+        session.close();
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+  }
+
+  /**
+   * Subqueries.
+   */
+  public void testSubqueries2() throws Exception {
+    logger.info("Testing subqueries2");
+
+    try {
+      Session session = database.newSession();
+
+      try {
+        // create models
+        URI dataModel = new URI("local:sampledata");
+        URI textModel = new URI("local:sampletext");
+
+        if (session.modelExists(dataModel)) session.removeModel(dataModel);
+        if (session.modelExists(textModel)) session.removeModel(textModel);
+        session.createModel(dataModel, null);
+        session.createModel(textModel, luceneModelType);
+
+        // load models
+        URI fileURI = new File(new File(System.getProperty("cvs.root"), "data"), "w3c-news.rss").toURI();
+        session.setModel(dataModel, new GraphResource(fileURI));
+
+        String q = "select $s $p $o from <local:sampledata> where $s $p $o and (" +
+                     "  $p <mulgara:is> <http://purl.org/rss/1.0/description> or " +
+                     "  $p <mulgara:is> <http://purl.org/rss/1.0/title>);";
+        session.insert(textModel, parseQuery(q));
+
+        // run queries
+        q = "select $s subquery(select $z from <local:sampledata> where $s <http://purl.org/rss/1.0/title> $z) " +
+            "  from <local:sampledata> where $s $p $o and $s $p 'W*' in <local:sampletext> order by $s;";
+        Answer answer = session.query(parseQuery(q));
+        compareResults(new Object[][] {
+          { "http://www.w3.org/2000/08/w3c-synd/home.rss", new Object[][] { { "The World Wide Web Consortium" } } },
+          { "http://www.w3.org/News/2002#item12", new Object[][] { { "W3C Launches Web Services Activity" } } },
+          { "http://www.w3.org/News/2002#item13", new Object[][] { { "Platform for Privacy Preferences (P3P) Becomes a W3C Proposed Recommendation" } } },
+          { "http://www.w3.org/News/2002#item14", new Object[][] { { "XHTML+SMIL Profile Published" } } },
+          { "http://www.w3.org/News/2002#item15", new Object[][] { { "W3C Team Presentations in February" } } },
+          { "http://www.w3.org/News/2002#item16", new Object[][] { { "QA Framework First Public Working Drafts Published" } } },
+          { "http://www.w3.org/News/2002#item17", new Object[][] { { "DOM Level 3 Working Drafts Published" } } },
+          { "http://www.w3.org/News/2002#item18", new Object[][] { { "P3P Deployment Guide Updated" } } },
+        }, answer, true);
+        answer.close();
+
+        q = "select $s subquery(select $z from <local:sampledata> where $s <http://purl.org/rss/1.0/title> $z and $s <http://purl.org/rss/1.0/title> 'W*' in <local:sampletext>) " +
+            "  from <local:sampledata> where $s <http://purl.org/rss/1.0/title> $o order by $s;";
+        answer = session.query(parseQuery(q));
+        compareResults(new Object[][] {
+          { "http://www.w3.org/2000/08/w3c-synd/home.rss", new Object[][] { { "The World Wide Web Consortium" } } },
+          { "http://www.w3.org/News/2002#item12", new Object[][] { { "W3C Launches Web Services Activity" } } },
+          { "http://www.w3.org/News/2002#item13", new Object[][] { { "Platform for Privacy Preferences (P3P) Becomes a W3C Proposed Recommendation" } } },
+          { "http://www.w3.org/News/2002#item14", new Object[][] { } },
+          { "http://www.w3.org/News/2002#item15", new Object[][] { { "W3C Team Presentations in February" } } },
+          { "http://www.w3.org/News/2002#item16", new Object[][] { { "QA Framework First Public Working Drafts Published" } } },
+          { "http://www.w3.org/News/2002#item17", new Object[][] { { "DOM Level 3 Working Drafts Published" } } },
+          { "http://www.w3.org/News/2002#item18", new Object[][] { } },
+        }, answer, true);
+        answer.close();
+
+      } finally {
+        session.close();
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+  }
+
+  /**
    * Two queries, in parallel.
    */
   public void testConcurrentQueries() throws Exception {
     logger.info("Testing concurrentQueries");
 
     try {
-      // Load some test data
       Session session = database.newSession();
 
-      URI fileURI = new File(textDirectory + File.separator + "data.n3").toURI();
-      if (session.modelExists(modelURI)) {
-        session.removeModel(modelURI);
-      }
-      session.createModel(modelURI, luceneModelType);
-      session.setModel(modelURI, new GraphResource(fileURI));
-
       // Run the queries
       try {
         String q = "select $x from <foo:bar> where $x <foo:hasText> 'American' in <" + modelURI + ">;";
@@ -870,27 +984,43 @@
     return res;
   }
 
-  private void compareResults(String[][] expected, Answer answer) throws Exception {
+  private void compareResults(Object[][] expected, Answer answer) throws Exception {
     compareResults(expected, answer, false);
   }
 
-  private void compareResults(String[][] expected, Answer answer, boolean lastIsLiteral)
+  private void compareResults(Object[][] expected, Answer answer, boolean lastIsLiteral)
       throws Exception {
     try {
       answer.beforeFirst();
+
       for (int i = 0; i < expected.length; i++) {
         assertTrue("Answer short at row " + i, answer.next());
         assertEquals(expected[i].length, answer.getNumberOfVariables());
         for (int j = 0; j < expected[i].length; j++) {
-          Object exp = (lastIsLiteral && j == expected[i].length - 1) ?
-                          new LiteralImpl(expected[i][j]) :
-                          new URIReferenceImpl(new URI(expected[i][j]));
-          assertEquals(exp, answer.getObject(j));
+          if (expected[i][j] == null) {
+            assertNull(answer.getObject(j));
+          } else if (expected[i][j] instanceof String) {
+            Object exp = (lastIsLiteral && j == expected[i].length - 1) ?
+                            new LiteralImpl((String) expected[i][j]) :
+                            new URIReferenceImpl(new URI((String) expected[i][j]));
+            assertEquals(exp, answer.getObject(j));
+          } else if (expected[i][j] instanceof Object[][]) {
+            compareResults((Object[][]) expected[i][j], (Answer) answer.getObject(j), lastIsLiteral);
+          } else {
+            throw new IllegalArgumentException("Don't know how to handle expected value '" +
+                                               expected[i][j] + "' of type " +
+                                               expected[i][j].getClass() + "' at index " + i +
+                                               "," + j);
+          }
         }
       }
-      assertFalse(answer.next());
+
+      assertFalse("Answer too long", answer.next());
     } catch (Exception e) {
-      logger.error("Failed test - " + answer);
+      logger.error("Failed test - \n" + answer);
+      throw e;
+    } catch (Error e) {
+      logger.error("Failed test - \n" + dumpAnswer(answer, "  "));
       answer.close();
       throw e;
     }
@@ -909,6 +1039,25 @@
     assertFalse(answer2.next());
   }
 
+  private static String dumpAnswer(Answer answer, String indent) throws Exception {
+    StringBuilder sb = new StringBuilder(500);
+
+    answer.beforeFirst();
+    while (answer.next()) {
+      sb.append(indent).append("next-row\n");
+      for (int j = 0; j < answer.getNumberOfVariables(); j++) {
+        sb.append(indent).append("  column: " + answer.getObject(j) + "\n");
+        if (answer.getObject(j) instanceof Answer) {
+          sb.append(dumpAnswer((Answer) answer.getObject(j), indent + "    "));
+        }
+      }
+    }
+
+    sb.append(indent).append("end\n");
+    return sb.toString();
+  }
+
+
   private void fail(Throwable throwable) {
     StringWriter stringWriter = new StringWriter();
     throwable.printStackTrace(new PrintWriter(stringWriter));




More information about the Mulgara-svn mailing list