package org.exist.fluent; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; import org.junit.Test; public class QueryServiceTest extends DatabaseTestCase { @Test public void let1() { assertEquals("foo", db.getFolder("/").query().let("$a", "foo").single("$a").value()); } @Test public void let2() { assertEquals("foo", db.getFolder("/").query().let("a", "foo").single("$a").value()); } @Test public void let3() { Folder f = db.getFolder("/"); f.namespaceBindings().put("", "http://example.com"); assertEquals("foo", f.query().let("$a", "foo").single("$a").value()); } @Test(expected = DatabaseException.class) public void let4() { Folder f = db.getFolder("/"); assertEquals("foo", f.query().let("$a", "foo").single("$a").value()); f.query().single("$a"); } @Test(expected = DatabaseException.class) public void let5() { Folder f = db.getFolder("/"); assertEquals("foo", f.query().single("$_1", "foo").value()); f.query().single("$_1"); } @Test public void importModule1() { Folder f = db.getFolder("/"); Document doc = f.documents().load(Name.create("module1"), Source.blob( "module namespace ex = 'http://example.com';\n" + "declare function ex:foo() { 'foo' };\n" )); assertEquals("foo", f.query().importModule(doc).single("ex:foo()").value()); } @Test public void importModule2() { Folder f = db.createFolder("/top/next"); Document doc = f.documents().load(Name.create("module1"), Source.blob( "\n\nmodule namespace _123=\"http://example.com?a=1-2&b=4\" ;\n" + "declare function _123:foo() { 'foo' };\n" )); assertEquals("foo", f.query().importModule(doc).single("_123:foo()").value()); } @Test public void importModule3() { Folder f = db.getFolder("/"); Document doc1 = f.documents().load(Name.create("module1"), Source.blob( "module namespace ex = 'http://example.com';\n" + "declare function ex:foo() { 'foo' };\n" )); Document doc2 = f.documents().load(Name.create("module2"), Source.blob( "module namespace ex = 'http://example.com';\n" + "declare function ex:foo() { 'bar' };\n" )); assertEquals("foo", f.query().importModule(doc1).single("ex:foo()").value()); assertEquals("bar", f.query().importModule(doc2).single("ex:foo()").value()); } @Test(expected = DatabaseException.class) public void importModule4() { Folder f = db.getFolder("/"); Document doc1 = f.documents().load(Name.create("module1"), Source.blob( "module namespace ex = 'http://example.com';\n" + "declare function ex:foo() { 'foo' };\n" )); Document doc2 = f.documents().load(Name.create("module2"), Source.blob( "module namespace ex = 'http://example.com/other';\n" + "declare function ex:foo() { 'bar' };\n" )); f.query().importModule(doc1).importModule(doc2).single("ex:foo()"); } @Test public void importModule5() { Folder f = db.getFolder("/"); Document module = f.documents().load(Name.create("module"), Source.blob( "module namespace ex = 'http://example.com';\n" + "declare function ex:root() { / };\n" )); XMLDocument doc1 = f.documents().load(Name.create("doc1"), Source.xml("<foo/>")); f.documents().load(Name.create("doc2"), Source.xml("<foo/>")); QueryService qs = db.query(doc1).importModule(module); assertEquals(1, qs.all("/").size()); assertEquals(1, qs.all("ex:root()").size()); } @Test public void limitRootDocuments1() { Folder f = db.getFolder("/"); XMLDocument doc1 = f.documents().load(Name.create("doc1"), Source.xml("<foo/>")); f.documents().load(Name.create("doc2"), Source.xml("<foo/>")); assertEquals(2, f.query().all("/foo").size()); assertEquals(1, f.query().limitRootDocuments(doc1).all("/foo").size()); } @Test public void analyze1() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("zero-or-one(//blah)"); assertEquals(QueryService.QueryAnalysis.Cardinality.ZERO_OR_ONE, qa.cardinality()); assertEquals("item()", qa.returnTypeName()); } @Test public void analyze2() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("exactly-one(//blah)"); assertEquals(QueryService.QueryAnalysis.Cardinality.ONE, qa.cardinality()); assertEquals("item()", qa.returnTypeName()); } @Test public void analyze3() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("one-or-more(//blah)"); assertEquals(QueryService.QueryAnalysis.Cardinality.ONE_OR_MORE, qa.cardinality()); assertEquals("item()", qa.returnTypeName()); } @Test public void analyze4() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("//blah"); assertEquals(QueryService.QueryAnalysis.Cardinality.ZERO_OR_MORE, qa.cardinality()); assertEquals("node()", qa.returnTypeName()); } @Test public void analyze5() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("$blah"); assertEquals(1, qa.requiredVariables().size()); assertThat(qa.requiredVariables(), hasItems(new QName(null, "blah", null))); } @Test public void analyze6() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("declare namespace bar = 'http://example.com'; $bar:blah"); assertEquals(1, qa.requiredVariables().size()); assertThat(qa.requiredVariables(), hasItems(new QName("http://example.com", "blah", "bar"))); } @Test public void analyze7() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("local:foo()"); assertThat(qa.requiredFunctions(), hasItems(new QName("http://www.w3.org/2005/xquery-local-functions", "foo", "local"))); } @Test public void analyze8() { QueryService.QueryAnalysis qa = db.getFolder("/").query().analyze("declare namespace bar = 'http://example.com'; bar:foo()"); assertThat(qa.requiredFunctions(), hasItems(new QName("http://example.com", "foo", "bar"))); } }