[Mulgara-svn] r1312 - trunk/src/jar/util/java/org/mulgara/util

pag at mulgara.org pag at mulgara.org
Tue Oct 14 17:35:13 UTC 2008


Author: pag
Date: 2008-10-14 10:35:12 -0700 (Tue, 14 Oct 2008)
New Revision: 1312

Added:
   trunk/src/jar/util/java/org/mulgara/util/SparqlUtil.java
   trunk/src/jar/util/java/org/mulgara/util/SparqlUtilUnitTest.java
Log:
New utility for looking at SPARQL without processing it

Added: trunk/src/jar/util/java/org/mulgara/util/SparqlUtil.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/SparqlUtil.java	                        (rev 0)
+++ trunk/src/jar/util/java/org/mulgara/util/SparqlUtil.java	2008-10-14 17:35:12 UTC (rev 1312)
@@ -0,0 +1,72 @@
+/*
+ * The contents of this file are subject to the Open Software License
+ * Version 3.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.opensource.org/licenses/osl-3.0.txt
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ */
+
+package org.mulgara.util;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utility methods for looking at SPARQL query strings.
+ *
+ * @created Oct 8, 2008
+ * @author Paul Gearon
+ * @copyright &copy; 2008 <a href="http://www.topazproject.org/">The Topaz Project</a>
+ * @licence <a href="{@docRoot}/../../LICENCE.txt">Open Software License v3.0</a>
+ */
+public class SparqlUtil {
+
+  /** A pattern for extracting the first word from a query */
+  static Pattern firstWordPattern = Pattern.compile("^\\s*([^\\{\\s]+)");
+
+  /** A pattern for finding the first WHERE expression */
+  static Pattern firstWherePattern = Pattern.compile("\\s+where\\s*", Pattern.CASE_INSENSITIVE);
+
+  /** A list of keywords known to absolutely indicate SPARQL */
+  static Set<String> absKeywords = new HashSet<String>();
+
+  /** A token for the SELECT keyword */
+  static final String SELECT = "select";
+
+  static {
+    absKeywords.add("base");
+    absKeywords.add("prefix");
+    absKeywords.add("construct");
+    absKeywords.add("describe");
+    absKeywords.add("ask");
+  }
+
+  /**
+   * Guesses the type of the query language.
+   * @param query The text to be parsed by the language interpreter
+   * @return <code>true</code> if the query appears to be SPARQL
+   */
+  public static boolean looksLikeSparql(String query) {
+    // get the first word
+    Matcher m = firstWordPattern.matcher(query);
+    if (!m.find()) return false;
+    String firstWord = m.group(1).trim().toLowerCase();
+
+    // if the first word is only legal SPARQL then this is SPARQL
+    if (absKeywords.contains(firstWord)) return true;
+
+    // if not "select" then it cannot b SPARQL
+    if (!SELECT.equals(firstWord)) return false;
+
+    // look for the "WHERE" clause
+    m = firstWherePattern.matcher(query);
+    if (!m.find()) return false;
+    return query.charAt(m.end()) == '{';
+  }
+}

Added: trunk/src/jar/util/java/org/mulgara/util/SparqlUtilUnitTest.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/SparqlUtilUnitTest.java	                        (rev 0)
+++ trunk/src/jar/util/java/org/mulgara/util/SparqlUtilUnitTest.java	2008-10-14 17:35:12 UTC (rev 1312)
@@ -0,0 +1,225 @@
+/*
+ * The contents of this file are subject to the Open Software License
+ * Version 3.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.opensource.org/licenses/osl-3.0.txt
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ */
+
+package org.mulgara.util;
+
+// third party packages
+import junit.framework.*;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Test case for {@link SparqlUtil}.
+ *
+ * @created Oct 13, 2008
+ * @author Paul Gearon
+ * @copyright &copy; 2008 <a href="http://www.topazproject.org/">The Topaz Project</a>
+ * @licence <a href="{@docRoot}/../../LICENCE.txt">Open Software License v3.0</a>
+ */
+public class SparqlUtilUnitTest extends TestCase {
+
+  /** Logger. Named after the class. */
+  @SuppressWarnings("unused")
+  private static final Logger logger = Logger.getLogger(SparqlUtilUnitTest.class);
+
+
+  /**
+   * Creates the named test
+   * @param name The test name
+   */
+  public SparqlUtilUnitTest(String name) {
+    super(name);
+  }
+
+
+  /**
+   * Creates a test suite with various different output and compares the output.
+   * @return The test suite
+   */
+  public static TestSuite suite() {
+    TestSuite suite = new TestSuite();
+    suite.addTest(new SparqlUtilUnitTest("testSparqlSelect"));
+    suite.addTest(new SparqlUtilUnitTest("testTqlSelect"));
+    suite.addTest(new SparqlUtilUnitTest("testTql"));
+    suite.addTest(new SparqlUtilUnitTest("testSparql"));
+    return suite;
+  }
+
+
+  /**
+   * Default test runner.
+   * @param args The command line arguments
+   */
+  public static void main(String[] args) {
+    junit.textui.TestRunner.run(suite());
+  }
+
+
+  /**
+   * Test that {@link SparqlUtil#looksLikeSparql(String)} can recognize a simple SELECT.
+   */
+  public void testSparqlSelect() throws Exception {
+    String s1 = "select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y ?z from <rmi://localhost/server1#> where{?x ?y ?z}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y ?z where { ?x ?y ?z }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y ?z where{?x ?y ?z}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y from <rmi://localhost/server1#> where { ?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }' }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y from <rmi://localhost/server1#> where {?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }'}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y from <rmi://localhost/server1#>\nfrom named <http://example.org/alice>\nwhere { ?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }' }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y where { ?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }' }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y where {?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }'}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+  }
+
+
+  /**
+   * Test that {@link SparqlUtil#looksLikeSparql(String)} can avoid TQL.
+   */
+  public void testTqlSelect() throws Exception {
+    String s1 = "select ?x ?y ?z from <rmi://localhost/server1#> where ?x ?y ?z;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+    
+    s1 = "select ?x ?y from <rmi://localhost/server1#> where ?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }' ;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y from <rmi://localhost/server1#> where\n?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where { ?x ?y ?z }' ;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "select ?x ?y from <rmi://localhost/server1#> where ?x ?y 'select ?x ?y ?z from <rmi://localhost/server1#> where {?x ?y ?z}' ;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+  }
+
+
+  /**
+   * Test that {@link SparqlUtil#looksLikeSparql(String)} can see non-SELECT SPARQL.
+   */
+  public void testSparql() throws Exception {
+    String s1 = "prefix foaf: <http://xmlns.com/foaf/0.1/> select ?x ?y ?z from <rmi://localhost/server1#> where ?x ?y ?z;";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toUpperCase()));
+
+    s1 = "CONSTRUCT { <http://example.org/person#Alice> vcard:FN ?name } WHERE { ?x foaf:name ?name }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "CONSTRUCT{<http://example.org/person#Alice> vcard:FN ?name}WHERE{?x foaf:name ?name}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "ASK  { ?x foaf:name  \"Alice\" }";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "ASK{?x foaf:name \"Alice\"}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "DESCRIBE ?x ?y <http://example.org/>\nWHERE    {?x foaf:knows ?y}";
+    assertTrue(SparqlUtil.looksLikeSparql(s1));
+    assertTrue(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+  }
+
+
+  /**
+   * Test that {@link SparqlUtil#looksLikeSparql(String)} can avoid non-SELECT TQL.
+   */
+  public void testTql() throws Exception {
+    String s1 = "alias <http://purl.org/dc/elements/1.1/> as dcns;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "create <rmi://mysite.com/server1#MyModel>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "delete select $s $p $o from <rmi://mysite.com/server1#model1>\nwhere $s $p $o from <rmi://mysite.com/server1#model2>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "drop <rmi://mysite.com/server1#model1>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "execute <file:/usr/local/tks/sample/itql/loaddc.itql>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "help create;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "insert <ns:subject> <ns:predicate> $node\n$node <ns:predicate2> 'object2' into <rmi://mysite.com/server1#model> ;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "insert select $s $p $o from <rmi://mysite.com/server1#model1>\nwhere $s $p $o into <rmi://mysite.com/server1#model2>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "load remote <file:/tmp/mydata.rdf> into <rmi://mysite.com/Server1#Graph1>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "quit;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "restore <rmi://mysite.com/server1> from remote <file:/tmp/serverbackup.gz>;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "rollback;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+
+    s1 = "set time on;";
+    assertFalse(SparqlUtil.looksLikeSparql(s1));
+    assertFalse(SparqlUtil.looksLikeSparql(s1.toLowerCase()));
+  }
+
+
+  /**
+   * Populate the test object.
+   */
+  protected void setUp() {
+  }
+}




More information about the Mulgara-svn mailing list