/** Copyright (C) SYSTAP, LLC DBA Blazegraph 2013. All rights reserved. Contact: SYSTAP, LLC DBA Blazegraph 2501 Calvert ST NW #106 Washington, DC 20008 licenses@blazegraph.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.bigdata.rdf.sparql.ast.eval; /** * Various tests covering different constellations where values are constructed * using BIND and reused in other parts of the query, such as * * - testing inlined vs. non-inlined configuration - using BIND prior to vs. * after joining/filtering the variable - BINDing to values that are in the * dictionary vs. BINDing to values that are not in the dictionary * * @see <a href="http://trac.blazegraph.com/ticket/1007">Ticket 1007: Using bound * variables to refer to a graph</a> * * @author <a href="mailto:ms@metaphacts.com">Michael Schmidt</a> */ public class TestTicket1007 extends AbstractDataDrivenSPARQLTestCase { public TestTicket1007() { } public TestTicket1007(String name) { super(name); } /************************************************************************** *********************** ORIGINAL TICKET TESTS **************************** **************************************************************************/ /** * Original query as defined in bug report, reusing a URI constructed in a * BIND clause in a join: <code> PREFIX : <http://www.interition.net/ref/> SELECT * WHERE { GRAPH <http://www.interition.net/g1> { <http://s1> :aProperty ?literal . BIND (URI(CONCAT("http://www.interition.net/graphs/",?literal)) AS ?graph) . } GRAPH ?graph { ?s ?p ?o . } } </code> * * Note: originally this query failed. * @throws Exception */ public void test_ticket_1007() throws Exception { new TestHelper("ticket-1007",// testURI, "ticket-1007.rq",// queryFileURL "ticket-1007.trig",// dataFileURL "ticket-1007.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** * Modified query with join "on top", enforced through outer VALUES clause. * * <code> PREFIX : <http://www.interition.net/ref/> SELECT * WHERE { GRAPH <http://www.interition.net/g1> { <http://s1> :aProperty ?literal . BIND (URI(CONCAT("http://www.interition.net/graphs/",?literal)) AS ?graph) . } } VALUES ?graph { <http://www.interition.net/graphs/g2> } </code> * * @throws Exception */ public void test_ticket_1007b() throws Exception { new TestHelper("ticket-1007b",// testURI, "ticket-1007b.rq",// queryFileURL "ticket-1007.trig",// dataFileURL "ticket-1007b.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /************************************************************************** ***************************** CUSTOM TESTS ******************************* **************************************************************************/ /* * Dataset (trig) used in the tests defined in this section: * <code> @prefix : <http://www.bigdata.com/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . : { :s :untypedString "untypedString" . :s :typedString "typedString"^^xsd:unsignedByte . :s :int "10"^^xsd:int . :s :integer "10"^^xsd:integer . :s :double "10.0"^^xsd:double . :s :boolean "true"^^xsd:boolean . :c :p5 "5"^^xsd:integer . } </code> * */ /** <code> SELECT ?o WHERE { ?s ?p ?o BIND (10 AS ?o) } </code> */ public void test_ticket_1007_number1() throws Exception { new TestHelper("ticket-1007-number1",// testURI, "ticket-1007-number1.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-integer.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o { ?s <http://www.bigdata.com/double> ?o BIND ("10.00"^^<http://www.w3.org/2001/XMLSchema#double> AS ?o) } </code> */ public void test_ticket_1007_number2() throws Exception { new TestHelper("ticket-1007-number2",// testURI, "ticket-1007-number2.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-double.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o { ?s <http://www.bigdata.com/integer> ?o BIND (10 AS ?o) } </code> */ public void test_ticket_1007_number3() throws Exception { new TestHelper("ticket-1007-number3",// testURI, "ticket-1007-number3.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-integer.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o { ?s <http://www.bigdata.com/integer> ?o BIND (2*5 AS ?o) } </code> */ public void test_ticket_1007_number4() throws Exception { new TestHelper("ticket-1007-number4",// testURI, "ticket-1007-number4.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-integer.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o { ?s <http://www.bigdata.com/integer> ?o BIND (xsd:integer("10") AS ?o) } </code> * * Note: originally this query failed. */ public void test_ticket_1007_number5() throws Exception { new TestHelper("ticket-1007-number5",// testURI, "ticket-1007-number5.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-integer.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o { ?s <http://www.bigdata.com/integer> ?o . <http://www.bigdata.com/c> <http://www.bigdata.com/p5> ?v . BIND (?v*2 AS ?o) } </code> */ public void test_ticket_1007_number6() throws Exception { new TestHelper("ticket-1007-number6",// testURI, "ticket-1007-number6.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-number-integer.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o BIND ("untypedString" AS ?o) } </code> */ public void test_ticket_1007_string1() throws Exception { new TestHelper("ticket-1007-string1",// testURI, "ticket-1007-string1.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-string.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o BIND (CONCAT("untyped","String") AS ?o) } </code> * * Note: originally this query failed. */ public void test_ticket_1007_string2() throws Exception { new TestHelper("ticket-1007-string2",// testURI, "ticket-1007-string2.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-string.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o BIND (STRAFTER("XuntypedString","X") AS ?o) } </code> * * Note: originally this query failed. */ public void test_ticket_1007_string3() throws Exception { new TestHelper("ticket-1007-string3",// testURI, "ticket-1007-string3.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-string.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o { SELECT ?o WHERE { BIND (CONCAT("untyped","String") AS ?o) } } } </code> * * Note: originally this query failed. */ public void test_ticket_1007_string4() throws Exception { new TestHelper("ticket-1007-string4",// testURI, "ticket-1007-string4.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-string.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { BIND (CONCAT("untyped","String") AS ?o) } </code> * * Note: originally this query failed. */ public void test_ticket_1007_string5() throws Exception { new TestHelper("ticket-1007-string5",// testURI, "ticket-1007-string5.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-string.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o BIND (URI("http://untypedString") AS ?o) } </code> */ public void test_ticket_1007_empty1() throws Exception { new TestHelper("ticket-1007-empty1",// testURI, "ticket-1007-empty1.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-empty.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s ?p ?o BIND ("10" AS ?o) } </code> */ public void test_ticket_1007_empty2() throws Exception { new TestHelper("ticket-1007-empty2",// testURI, "ticket-1007-empty2.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-empty.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT DISTINCT ?z WHERE { ?s ?p ?o BIND (URI("http://untypedUri") AS ?z) } </code> */ public void test_ticket_1007_freshUri() throws Exception { new TestHelper("ticket-1007-freshUri",// testURI, "ticket-1007-freshUri.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-freshUri.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s <http://www.bigdata.com/boolean> ?o BIND (?s=?s AS ?o) } </code> */ public void test_ticket_1007_boolean1() throws Exception { new TestHelper("ticket-1007-boolean1",// testURI, "ticket-1007-boolean1.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-boolean.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** <code> SELECT ?o WHERE { ?s <http://www.bigdata.com/boolean> ?o BIND (?s=<http://www.bigdata.com/s> AS ?o) } </code> */ public void test_ticket_1007_boolean2() throws Exception { new TestHelper("ticket-1007-boolean2",// testURI, "ticket-1007-boolean2.rq",// queryFileURL "ticket-1007-custom.trig",// dataFileURL "ticket-1007-boolean.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } /** * Test problems with BIND inside and reuse of variable outside of * subquery. * * <code> SELECT DISTINCT * { { SELECT ?annotatedSource WHERE { hint:SubQuery hint:runOnce true . ?s ?p ?o . FILTER(strstarts(?o,"annotated")) BIND(concat(substr(?o,1,9),"Source") as ?annotatedSource) } } ?ss ?pp ?annotatedSource } LIMIT 20 </code> * * @see <a href="http://trac.bigdata.com/ticket/490#comment:5">here</a> * for more details */ public void test_ticket_1007_subquery() throws Exception { new TestHelper("ticket-1007-subquery",// testURI, "ticket-1007-subquery.rq",// queryFileURL "ticket-1007-subquery.trig",// dataFileURL "ticket-1007-subquery.srx",// resultFileURL false // checkOrder (because only one solution) ).runTest(); } }