/** Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. 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 */ /* * Created on Aug 20, 2011 */ package com.bigdata.rdf.sail.sparql; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.openrdf.model.Resource; import org.openrdf.model.vocabulary.RDF; import org.openrdf.query.MalformedQueryException; import org.openrdf.query.algebra.StatementPattern.Scope; import org.openrdf.rio.RDFParser.DatatypeHandling; import com.bigdata.rdf.internal.IV; import com.bigdata.rdf.internal.XSD; import com.bigdata.rdf.model.BigdataBNode; import com.bigdata.rdf.model.BigdataLiteral; import com.bigdata.rdf.model.BigdataResource; import com.bigdata.rdf.model.BigdataStatement; import com.bigdata.rdf.model.BigdataURI; import com.bigdata.rdf.model.BigdataValue; import com.bigdata.rdf.model.StatementEnum; import com.bigdata.rdf.rio.RDFParserOptions; import com.bigdata.rdf.sail.sparql.ast.ParseException; import com.bigdata.rdf.sail.sparql.ast.TokenMgrError; import com.bigdata.rdf.sparql.AbstractBigdataExprBuilderTestCase; import com.bigdata.rdf.sparql.ast.AddGraph; import com.bigdata.rdf.sparql.ast.ClearGraph; import com.bigdata.rdf.sparql.ast.ConstantNode; import com.bigdata.rdf.sparql.ast.CopyGraph; import com.bigdata.rdf.sparql.ast.CreateGraph; import com.bigdata.rdf.sparql.ast.DatasetNode; import com.bigdata.rdf.sparql.ast.DeleteData; import com.bigdata.rdf.sparql.ast.DeleteInsertGraph; import com.bigdata.rdf.sparql.ast.DropGraph; import com.bigdata.rdf.sparql.ast.FilterNode; import com.bigdata.rdf.sparql.ast.FunctionNode; import com.bigdata.rdf.sparql.ast.InsertData; import com.bigdata.rdf.sparql.ast.JoinGroupNode; import com.bigdata.rdf.sparql.ast.LoadGraph; import com.bigdata.rdf.sparql.ast.MoveGraph; import com.bigdata.rdf.sparql.ast.ProjectionNode; import com.bigdata.rdf.sparql.ast.QuadData; import com.bigdata.rdf.sparql.ast.QuadsDataOrNamedSolutionSet; import com.bigdata.rdf.sparql.ast.QueryType; import com.bigdata.rdf.sparql.ast.StatementPatternNode; import com.bigdata.rdf.sparql.ast.SubqueryRoot; import com.bigdata.rdf.sparql.ast.UpdateRoot; import com.bigdata.rdf.sparql.ast.VarNode; /** * Test suite for {@link UpdateExprBuilder}. * * @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a> */ public class TestUpdateExprBuilder extends AbstractBigdataExprBuilderTestCase { // private static final Logger log = Logger // .getLogger(TestBigdataExprBuilder.class); public TestUpdateExprBuilder() { } public TestUpdateExprBuilder(String name) { super(name); } /** * <pre> * load <http://www.bigdata.com/data> * </pre> */ public void test_load_graph() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the SILENT keyword. * * <pre> * load silent <http://www.bigdata.com/data> * </pre> */ public void test_load_silent_graph() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load silent <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the SILENT keyword. * * <pre> * load silent <http://www.bigdata.com/data> into graph <http://www.bigdata.com/graph1> * </pre> */ public void test_load_silent_graph_into_graph() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load silent <http://www.bigdata.com/data> into graph <http://www.bigdata.com/graph1>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for a sequence of simple LOAD operations */ public void test_load_graphs() throws MalformedQueryException, TokenMgrError, ParseException { // LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load <http://www.bigdata.com/data>;\n" + "load <http://www.bigdata.com/data1>;" + "load <http://www.bigdata.com/data2>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } { final LoadGraph op = new LoadGraph(); expected.addChild(op); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data1")))); } { final LoadGraph op = new LoadGraph(); expected.addChild(op); final RDFParserOptions options = new RDFParserOptions(); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * * <pre> * load verifyData=true <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_verifyData_true() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load verifyData=true <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setVerifyData(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * * <pre> * load verifyData=false <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_verifyData_false() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load verifyData=false <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setVerifyData(false); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load stopAtFirstError=true <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_stopAtFirstError_true() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load stopAtFirstError=true <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setStopAtFirstError(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load stopAtFirstError=false <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_stopAtFirstError_false() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load stopAtFirstError=false <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setStopAtFirstError(false); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load preserveBNodeIDs=true <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_preserveBNodeIDs_true() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load preserveBNodeIDs=true <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setPreserveBNodeIDs(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load preserveBNodeIDs=false <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_preserveBNodeIDs_false() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load preserveBNodeIDs=false <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setPreserveBNodeIDs(false); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load datatypeHandling=IGNORE <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_datatypeHandling_ignore() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load datatypeHandling=ignore <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setDatatypeHandling(DatatypeHandling.IGNORE); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load datatypeHandling=VERIFY <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_datatypeHandling_verify() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load datatypeHandling=verify <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setDatatypeHandling(DatatypeHandling.VERIFY); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load datatypeHandling=NORMALIZE <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_datatypeHandling_normalize() throws MalformedQueryException, TokenMgrError, ParseException { //LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load datatypeHandling=normalize <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); // op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setDatatypeHandling(DatatypeHandling.VERIFY); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple LOAD operation with the non-standard extension * <pre> * load verifyData=true silent datatypeHandling=NORMALIZE <http://www.bigdata.com/data> * </pre> */ public void test_load_nonStandard_multipleOptions() throws MalformedQueryException, TokenMgrError, ParseException { // LOAD ( SILENT )? IRIref_from ( INTO GRAPH IRIref_to )? final String sparql = "load verifyData=true silent datatypeHandling=normalize <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final LoadGraph op = new LoadGraph(); expected.addChild(op); op.setSilent(true); final RDFParserOptions options = new RDFParserOptions(); options.setVerifyData(true); options.setDatatypeHandling(DatatypeHandling.VERIFY); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * Unit test for simple CLEAR operation. * * <pre> * clear graph <http://www.bigdata.com/data> * </pre> */ public void test_clear_graph() throws MalformedQueryException, TokenMgrError, ParseException { //CLEAR ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "clear graph <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final ClearGraph op = new ClearGraph(); expected.addChild(op); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * clear default * </pre> */ public void test_clear_default() throws MalformedQueryException, TokenMgrError, ParseException { //CLEAR ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "clear default"; final UpdateRoot expected = new UpdateRoot(); { final ClearGraph op = new ClearGraph(); expected.addChild(op); op.setScope(Scope.DEFAULT_CONTEXTS); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * clear named * </pre> */ public void test_clear_named() throws MalformedQueryException, TokenMgrError, ParseException { //CLEAR ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "clear named"; final UpdateRoot expected = new UpdateRoot(); { final ClearGraph op = new ClearGraph(); expected.addChild(op); op.setScope(Scope.NAMED_CONTEXTS); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * clear all * </pre> */ public void test_clear_all() throws MalformedQueryException, TokenMgrError, ParseException { //CLEAR ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "clear all"; final UpdateRoot expected = new UpdateRoot(); { final ClearGraph op = new ClearGraph(); op.setAllGraphs(true); op.setAllSolutionSets(true); expected.addChild(op); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * clear silent all * </pre> */ public void test_clear_silent_all() throws MalformedQueryException, TokenMgrError, ParseException { //clear ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "clear silent all"; final UpdateRoot expected = new UpdateRoot(); { final ClearGraph op = new ClearGraph(); expected.addChild(op); op.setAllGraphs(true); op.setAllSolutionSets(true); op.setSilent(true); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * drop graph <http://www.bigdata.com/data> * </pre> */ public void test_drop_graph() throws MalformedQueryException, TokenMgrError, ParseException { //drop ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "drop graph <http://www.bigdata.com/data>"; final UpdateRoot expected = new UpdateRoot(); { final DropGraph op = new DropGraph(); expected.addChild(op); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/data")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * drop default * </pre> */ public void test_drop_default() throws MalformedQueryException, TokenMgrError, ParseException { //drop ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "drop default"; final UpdateRoot expected = new UpdateRoot(); { final DropGraph op = new DropGraph(); expected.addChild(op); op.setScope(Scope.DEFAULT_CONTEXTS); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * drop named * </pre> */ public void test_drop_named() throws MalformedQueryException, TokenMgrError, ParseException { //drop ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "drop named"; final UpdateRoot expected = new UpdateRoot(); { final DropGraph op = new DropGraph(); expected.addChild(op); op.setScope(Scope.NAMED_CONTEXTS); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * drop all * </pre> */ public void test_drop_all() throws MalformedQueryException, TokenMgrError, ParseException { //drop ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "drop all"; final UpdateRoot expected = new UpdateRoot(); { final DropGraph op = new DropGraph(); op.setAllGraphs(true); op.setAllSolutionSets(true); expected.addChild(op); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * drop silent all * </pre> */ public void test_drop_silent_all() throws MalformedQueryException, TokenMgrError, ParseException { //drop ( SILENT )? (GRAPH IRIref | DEFAULT | NAMED | ALL ) final String sparql = "drop silent all"; final UpdateRoot expected = new UpdateRoot(); { final DropGraph op = new DropGraph(); expected.addChild(op); op.setAllGraphs(true); op.setAllSolutionSets(true); op.setSilent(true); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * create graph <http://www.bigdata.com/graph1> * </pre> */ public void test_create() throws MalformedQueryException, TokenMgrError, ParseException { //CREATE ( SILENT )? GRAPH IRIref final String sparql = "create graph <http://www.bigdata.com/graph1>"; final UpdateRoot expected = new UpdateRoot(); { final CreateGraph op = new CreateGraph(); expected.addChild(op); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * create silent graph <http://www.bigdata.com/graph1> * </pre> */ public void test_create_silent() throws MalformedQueryException, TokenMgrError, ParseException { //CREATE ( SILENT )? GRAPH IRIref final String sparql = "create silent graph <http://www.bigdata.com/graph1>"; final UpdateRoot expected = new UpdateRoot(); { final CreateGraph op = new CreateGraph(); expected.addChild(op); op.setSilent(true); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * copy <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_copy_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "copy <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final CopyGraph op = new CopyGraph(); expected.addChild(op); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * copy silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_copy_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "copy silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final CopyGraph op = new CopyGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * copy silent <http://www.bigdata.com/graph1> to default * </pre> */ public void test_copy_graph_to_default() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "copy silent <http://www.bigdata.com/graph1> to default"; final UpdateRoot expected = new UpdateRoot(); { final CopyGraph op = new CopyGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * copy silent default to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_copy_default_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "copy silent default to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final CopyGraph op = new CopyGraph(); expected.addChild(op); op.setSilent(true); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } // // // /** * <pre> * move <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_move_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "move <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final MoveGraph op = new MoveGraph(); expected.addChild(op); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * move silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_move_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "move silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final MoveGraph op = new MoveGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * move silent <http://www.bigdata.com/graph1> to default * </pre> */ public void test_move_graph_to_default() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "move silent <http://www.bigdata.com/graph1> to default"; final UpdateRoot expected = new UpdateRoot(); { final MoveGraph op = new MoveGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * move silent default to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_move_default_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "move silent default to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final MoveGraph op = new MoveGraph(); expected.addChild(op); op.setSilent(true); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } // // // /** * <pre> * add <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_add_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "add <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final AddGraph op = new AddGraph(); expected.addChild(op); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * add silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_add_graph_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "add silent <http://www.bigdata.com/graph1> to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final AddGraph op = new AddGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * add silent <http://www.bigdata.com/graph1> to default * </pre> */ public void test_add_graph_to_default() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "add silent <http://www.bigdata.com/graph1> to default"; final UpdateRoot expected = new UpdateRoot(); { final AddGraph op = new AddGraph(); expected.addChild(op); op.setSilent(true); op.setSourceGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph1")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * add silent default to <http://www.bigdata.com/graph2> * </pre> */ public void test_silent_add_default_to_graph() throws MalformedQueryException, TokenMgrError, ParseException { //COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT ) final String sparql = "add silent default to <http://www.bigdata.com/graph2>"; final UpdateRoot expected = new UpdateRoot(); { final AddGraph op = new AddGraph(); expected.addChild(op); op.setSilent(true); op.setTargetGraph(new ConstantNode(makeIV(valueFactory .createURI("http://www.bigdata.com/graph2")))); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } // // // /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * INSERT DATA * { * <http://example/book1> dc:title "A new book" ; * dc:creator "A.N.Other" . * } * </pre> */ // @SuppressWarnings("rawtypes") public void test_insert_data() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "INSERT DATA\n" + // "{\n" + // " <http://example/book1> dc:title \"A new book\" ;\n" + // " dc:creator \"A.N.Other\" .\n" + // "}"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataURI book1 = valueFactory.createURI("http://example/book1"); final BigdataURI dcCreator = valueFactory.createURI("http://purl.org/dc/elements/1.1/creator"); final BigdataURI dcTitle = valueFactory.createURI("http://purl.org/dc/elements/1.1/title"); final BigdataLiteral label1 = valueFactory.createLiteral("A new book"); final BigdataLiteral label2 = valueFactory.createLiteral("A.N.Other"); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcTitle,// (BigdataValue)label1, // null, StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1, // (BigdataURI)dcCreator, // (BigdataValue) label2, // null,// StatementEnum.Explicit),// // new SPO(book1, dcTitle, label1, null, // StatementEnum.Explicit),// // new SPO(book1, dcCreator, label2, null, // StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX ns: <http://example.org/ns#> * INSERT DATA * { GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } } * </pre> */ // @SuppressWarnings("rawtypes") public void test_insert_data_quads() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "PREFIX ns: <http://example.org/ns#>\n" + "INSERT DATA\n" + "{ GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } }"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataURI bookstore = valueFactory.createURI("http://example/bookStore"); final BigdataURI book1 = valueFactory.createURI("http://example/book1"); final BigdataURI price = valueFactory.createURI("http://example.org/ns#price"); final BigdataLiteral i42 = valueFactory.createLiteral("42",XSD.INTEGER); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)price, // (BigdataValue)i42, // (BigdataResource)bookstore, // StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * INSERT DATA { _:bnode a <http://example/Foo> . } * </pre> * @throws MalformedQueryException * * @see <a href="https://sourceforge.net/apps/trac/bigdata/ticket/573"> * NullPointerException when attempting to INSERT DATA containing a * blank node </a> */ public void test_insert_data_ticket573() throws MalformedQueryException { final String sparql = "INSERT DATA { _:bnode a <http://example/Foo> . }"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataBNode bnode = valueFactory.createBNode("-anon-1"); // final BigdataBNode bnode = valueFactory.createBNode("bnode"); final BigdataURI rdfType = valueFactory.createURI(RDF.TYPE.toString()); final BigdataURI foo = valueFactory.createURI("http://example/Foo"); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// bnode,// rdfType,// foo, // null,// c StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); // no null pointer exception, but Sesame 2.7 Sparql parser will // not respect the bnode id, so we cannot assert same AST // assertSameAST(sparql, expected, actual); } /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX ns: <http://example.org/ns#> * INSERT DATA * { * <http://example/book1> dc:title "A new book" . * <http://example/book1> dc:creator "A.N.Other" . * GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } * } * </pre> */ // @SuppressWarnings("rawtypes") public void test_insert_data_triples_then_quads() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "PREFIX ns: <http://example.org/ns#>\n" + "INSERT DATA\n" + "{\n" + " <http://example/book1> dc:title \"A new book\" .\n" + " <http://example/book1> dc:creator \"A.N.Other\" .\n" // + " GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 }\n" + "}"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataURI book1 = valueFactory.createURI("http://example/book1"); final BigdataURI dcCreator = valueFactory.createURI("http://purl.org/dc/elements/1.1/creator"); final BigdataURI dcTitle = valueFactory.createURI("http://purl.org/dc/elements/1.1/title"); final BigdataLiteral label1 = valueFactory.createLiteral("A new book"); final BigdataLiteral label2 = valueFactory.createLiteral("A.N.Other"); final BigdataURI bookstore = valueFactory.createURI("http://example/bookStore"); final BigdataURI price = valueFactory.createURI("http://example.org/ns#price"); final BigdataLiteral i42 = valueFactory.createLiteral("42",XSD.INTEGER); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcTitle,// (BigdataValue)label1,// null,// StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcCreator, // (BigdataValue)label2,// null,// StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1, // (BigdataURI)price, // (BigdataValue)i42, // (BigdataResource)bookstore,// StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } public void test_insert_data_triples_then_quads2() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "PREFIX ns: <http://example.org/ns#>\n" + "INSERT DATA\n" + "{\n" + " { <a:s1> <a:p1> <a:o1>\n }" + " GRAPH <a:G> { <a:s> <a:p1> 'o1'; <a:p2> <a:o2> }\n" + " GRAPH <a:G1> { <a:s> <a:p1> 'o1'; <a:p2> <a:o2> } \n" + " <a:s1> <a:p1> <a:o1>\n" + "}"; parseUpdate(sparql, baseURI); } /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX ns: <http://example.org/ns#> * INSERT DATA * { * GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } * <http://example/book1> dc:title "A new book" . * <http://example/book1> dc:creator "A.N.Other" . * } * </pre> */ // @SuppressWarnings("rawtypes") public void test_insert_data_quads_then_triples() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "PREFIX ns: <http://example.org/ns#>\n" + "INSERT DATA\n" + "{\n" + " GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 }\n" + " <http://example/book1> dc:title \"A new book\" .\n" + " <http://example/book1> dc:creator \"A.N.Other\" .\n" // + "}"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataURI book1 = valueFactory.createURI("http://example/book1"); final BigdataURI dcCreator = valueFactory.createURI("http://purl.org/dc/elements/1.1/creator"); final BigdataURI dcTitle = valueFactory.createURI("http://purl.org/dc/elements/1.1/title"); final BigdataLiteral label1 = valueFactory.createLiteral("A new book"); final BigdataLiteral label2 = valueFactory.createLiteral("A.N.Other"); final BigdataURI bookstore = valueFactory.createURI("http://example/bookStore"); final BigdataURI price = valueFactory.createURI("http://example.org/ns#price"); final BigdataLiteral i42 = valueFactory.createLiteral("42",XSD.INTEGER); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource)book1, // (BigdataURI)price, // (BigdataValue)i42, // (BigdataResource)bookstore,// StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcTitle,// (BigdataValue)label1,// null,// StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1, // (BigdataURI)dcCreator,// (BigdataValue)label2, // null,// StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX ns: <http://example.org/ns#> * INSERT DATA * { * <http://example/book1> dc:title "A new book" . * GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 } * <http://example/book1> dc:creator "A.N.Other" . * } * </pre> */ // @SuppressWarnings("rawtypes") public void test_insert_data_triples_quads_triples() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "PREFIX ns: <http://example.org/ns#>\n" + "INSERT DATA\n" + "{\n" + " <http://example/book1> dc:title \"A new book\" . " + " GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 }\n" + " <http://example/book1> dc:creator \"A.N.Other\" .\n" // + "}"; final UpdateRoot expected = new UpdateRoot(); { final InsertData op = new InsertData(); expected.addChild(op); final BigdataURI book1 = valueFactory.createURI("http://example/book1"); final BigdataURI dcCreator = valueFactory.createURI("http://purl.org/dc/elements/1.1/creator"); final BigdataURI dcTitle = valueFactory.createURI("http://purl.org/dc/elements/1.1/title"); final BigdataLiteral label1 = valueFactory.createLiteral("A new book"); final BigdataLiteral label2 = valueFactory.createLiteral("A.N.Other"); final BigdataURI bookstore = valueFactory.createURI("http://example/bookStore"); final BigdataURI price = valueFactory.createURI("http://example.org/ns#price"); final BigdataLiteral i42 = valueFactory.createLiteral("42",XSD.INTEGER); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcTitle,// (BigdataValue)label1, // null, // StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)price,// (BigdataValue)i42,// (BigdataResource)bookstore,// StatementEnum.Explicit),// valueFactory.createStatement(// (BigdataResource)book1,// (BigdataURI)dcCreator,// (BigdataValue)label2,// null,// StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * DELETE DATA * { GRAPH <http://example/bookStore> { <http://example/book1> dc:title "Fundamentals of Compiler Desing" } } ; * * PREFIX dc: <http://purl.org/dc/elements/1.1/> * INSERT DATA * { GRAPH <http://example/bookStore> { <http://example/book1> dc:title "Fundamentals of Compiler Design" } } * * </pre> */ @SuppressWarnings("rawtypes") public void test_delete_data_quads_insert_data_quads() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "DELETE DATA\n" + "{ GRAPH <http://example/bookStore> { <http://example/book1> dc:title \"Fundamentals of Compiler Desing\" } } ;\n" + "\n" + "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" + "INSERT DATA\n" + "{ GRAPH <http://example/bookStore> { <http://example/book1> dc:title \"Fundamentals of Compiler Design\" } }"; final IV book1 = makeIV(valueFactory.createURI("http://example/book1")); final IV dcTitle = makeIV(valueFactory.createURI("http://purl.org/dc/elements/1.1/title")); final IV label1 = makeIV(valueFactory.createLiteral("Fundamentals of Compiler Desing")); final IV label2 = makeIV(valueFactory.createLiteral("Fundamentals of Compiler Design")); final IV bookstore = makeIV(valueFactory.createURI("http://example/bookStore")); final UpdateRoot expected = new UpdateRoot(); { final DeleteData op = new DeleteData(); expected.addChild(op); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource) book1.getValue(),// (BigdataURI) dcTitle.getValue(),// (BigdataValue) label1.getValue(),// (BigdataResource) bookstore.getValue(),// StatementEnum.Explicit// ),// }; op.setData(data); } { final InsertData op = new InsertData(); expected.addChild(op); final BigdataStatement[] data = new BigdataStatement[] { // valueFactory.createStatement(// (BigdataResource) book1.getValue(),// (BigdataURI) dcTitle.getValue(),// (BigdataValue) label2.getValue(),// (BigdataResource) bookstore.getValue(),// StatementEnum.Explicit// ),// // new SPO(book1, dcTitle, label2, bookstore, StatementEnum.Explicit),// }; op.setData(data); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT w/o WITH. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * INSERT { ?person foaf:givenName 'William' } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH <http://example/addresses> { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: Since WITH is not given, the context position is <code>null</code> * and the {@link Scope} is {@link Scope#DEFAULT_CONTEXTS} for any * {@link StatementPatternNode} which is outside of a GRAPH group. Within a * GRAPH group, the context is, of course, the constant IRI or variable * specified by the GRAPH group and the {@link Scope} is * {@link Scope#NAMED_CONTEXTS}. * * @see StatementPatternNode */ @SuppressWarnings("rawtypes") public void test_delete_insert_00() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null,//new ConstantNode(addresses), Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new ConstantNode( addresses), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT plus WITH to specify the graph. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * WITH <http://example/addresses> * DELETE { ?person foaf:givenName 'Bill' } * INSERT { ?person foaf:givenName 'William' } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH <http://example/addresses> { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: The context position on the {@link StatementPatternNode} outside of * the GRAPH group is bound to the constant specified by the WITH clause. * <code>WITH uri</code> is a syntactic sugar for * <code>GRAPH uri {...}</code>, so the {@link StatementPatternNode} is also * marked as {@link Scope#NAMED_CONTEXTS}. */ @SuppressWarnings("rawtypes") public void test_delete_insert_01() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "WITH <http://example/addresses>\n"// + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); /* * Outside the GRAPH group. This is still marked as * NAMED_CONTEXTS because WITH creates an implicit top-level * GRAPH group wrapping the INSERT clause, DELETE clause, and * WHERE clause. */ whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new ConstantNode( addresses), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT and USING. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * INSERT { ?person foaf:givenName 'William' } * USING <http://example/addresses2> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH <http://example/addresses> { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: WITH is not used, so there is no implicit GRAPH wrapping the INSERT * clause, DELETE clause, and WHERE clause. Therefore, the context will be * <code>null</code> for the statement patterns in the DELETE clause and * INSERT clause and outside of the GRAPH clause in the WHERE clause. */ @SuppressWarnings("rawtypes") public void test_delete_insert_02() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "USING <http://example/addresses2>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV addresses2 = makeIV(valueFactory.createURI("http://example/addresses2")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new ConstantNode( addresses), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); } @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set<IV>)Collections.singleton(addresses2),// defaultGraph (Set)Collections.emptySet(),// namedGraphs true // update ); op.setDataset(dataset); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT and USING NAMED. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * INSERT { ?person foaf:givenName 'William' } * USING NAMED <http://example/addresses> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: WITH is not used, so there is no implicit GRAPH wrapping the INSERT * clause, DELETE clause, and WHERE clause. Therefore, the context will be * <code>null</code> for the statement patterns in the DELETE clause and * INSERT clause and outside of the GRAPH clause in the WHERE clause. * <p> * Note: For this test, the GRAPH group is also using a variable. */ @SuppressWarnings("rawtypes") public void test_delete_insert_03() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "USING NAMED <http://example/addresses>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new VarNode( "graph"), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new VarNode("graph"), Scope.NAMED_CONTEXTS))); } @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set)Collections.emptySet(),// defaultGraph (Set<IV>)Collections.singleton(addresses),// namedGraphs true // update ); op.setDataset(dataset); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT, WITH, USING, and USING NAMED. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * WITH <http://example/addresses> * DELETE { ?person foaf:givenName 'Bill' } * INSERT { ?person foaf:givenName 'William' } * USING NAMED <http://example/addresses> * USING NAMED <http://example/addresses2> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Since WITH is used, the DELETE, INSERT, and WHERE clause is each wrapped * by an implicit <code>GRAPH uri</code>. * <p> * Note: For this test, the GRAPH group is also using a variable. However, * that variable will be constrained by the WITH clause to a constant. */ @SuppressWarnings("rawtypes") public void test_delete_insert_04() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "WITH <http://example/addresses>\n"// + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "USING NAMED <http://example/addresses>\n"// + "USING NAMED <http://example/addresses2>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV addresses2 = makeIV(valueFactory.createURI("http://example/addresses2")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new VarNode( "graph"), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new VarNode("graph"), Scope.NAMED_CONTEXTS))); } final Set<IV> namedGraphs = new LinkedHashSet<IV>(); namedGraphs.add(addresses); namedGraphs.add(addresses2); @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set)Collections.emptySet(),// defaultGraph namedGraphs,// true // update ); op.setDataset(dataset); } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT w/o WITH but using a GRAPH in the DELETE and INSERT * clauses. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { * GRAPH <http://example/addresses> {?person foaf:givenName 'Bill'} . * ?person foaf:givenName 'Bill' * } * INSERT { * ?person foaf:givenName 'William' * GRAPH <http://example/addresses> {?person foaf:givenName 'William'} * } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH <http://example/addresses> { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: Since WITH is not given, the context position is <code>null</code> * and the {@link Scope} is {@link Scope#DEFAULT_CONTEXTS} for any * {@link StatementPatternNode} which is outside of a GRAPH group. Within a * GRAPH group, the context is, of course, the constant IRI or variable * specified by the GRAPH group and the {@link Scope} is * {@link Scope#NAMED_CONTEXTS}. * * @see StatementPatternNode */ @SuppressWarnings("rawtypes") public void test_delete_insert_10() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE {\n"// + " GRAPH <http://example/addresses> { ?person foaf:givenName 'Bill' } .\n" // + " ?person foaf:givenName 'Bill'\n" + "}\n"// + "INSERT {\n"// + " ?person foaf:givenName 'William'\n" + " GRAPH <http://example/addresses> { ?person foaf:givenName 'William' } .\n" // + "}\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); // inside the GRAPH group deleteClause.addChild(new QuadData(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); // outside the GRAPH group deleteClause.addChild(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); // outside the GRAPH group insertClause.addChild(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); // inside the GRAPH group insertClause.addChild(new QuadData(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label2), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null,//new ConstantNode(addresses), Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new ConstantNode( addresses), new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS))); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT with WITH and a GRAPH in the DELETE and INSERT clauses. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * WITH <http://example/addresses2> * DELETE { * GRAPH ?graph {?person foaf:givenName 'Bill'} . * ?person foaf:givenName 'Bill' * } * INSERT { * ?person foaf:givenName 'William' * GRAPH ?graph {?person foaf:givenName 'William'} * } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: Since WITH is given, there is an implicit GRAPH wrapping the * INSERT, DELETE, and WHERE clauses. * * @see StatementPatternNode */ @SuppressWarnings("rawtypes") public void test_delete_insert_11() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" +"WITH <http://example/addresses>\n" + "DELETE {\n"// + " GRAPH ?graph { ?person foaf:givenName 'Bill' } .\n" // + " ?person foaf:givenName 'Bill'\n" + "}\n"// + "INSERT {\n"// + " ?person foaf:givenName 'William'\n" + " GRAPH ?graph { ?person foaf:givenName 'William' } .\n" // + "}\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?group {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); // inside the GRAPH group deleteClause.addChild(new QuadData(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label1), new VarNode("graph"), Scope.NAMED_CONTEXTS))); // outside the GRAPH group (bound by WITH). deleteClause.addChild(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final QuadData insertClause = new QuadData(); // outside the GRAPH group (bound by WITH) insertClause.addChild(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label2), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); // inside the GRAPH group insertClause.addChild(new QuadData(new StatementPatternNode( new VarNode("person"), new ConstantNode(givenName), new ConstantNode(label2), new VarNode("graph"), Scope.NAMED_CONTEXTS))); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group (bound by with). whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), new ConstantNode(addresses), Scope.NAMED_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode(new VarNode("group"), new StatementPatternNode(new VarNode("person"), new ConstantNode(givenName), new ConstantNode( label1), new VarNode("group"), Scope.NAMED_CONTEXTS))); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT with default graph. * * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> * * DELETE * { ?book ?p ?v } * WHERE * { ?book dc:date ?date . * FILTER ( ?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime ) * ?book ?p ?v * } * </pre> */ @SuppressWarnings("rawtypes") public void test_delete_insert_20() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = // "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n"// + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n"// + "DELETE\n"// + " { ?book ?p ?v }\n"// + "WHERE\n"// + " { ?book dc:date ?date .\n"// + " FILTER ( ?date > \"1970-01-01T00:00:00-02:00\"^^xsd:dateTime )\n"// + " ?book ?p ?v\n"// + "}"; final IV dcDate = makeIV(valueFactory.createURI("http://purl.org/dc/elements/1.1/date")); final IV dateTime = makeIV(valueFactory.createLiteral("1970-01-01T00:00:00-02:00",XSD.DATETIME)); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "book"), new VarNode("p"), new VarNode("v"))); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); whereClause.addChild(new StatementPatternNode(new VarNode("book"), new ConstantNode(dcDate), new VarNode("date"))); whereClause.addChild(new FilterNode(FunctionNode.GT( new VarNode("date"), new ConstantNode(dateTime)))); whereClause.addChild(new StatementPatternNode(new VarNode("book"), new VarNode("p"), new VarNode("v"))); op.setWhereClause(whereClause); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT plus GRAPH in INSERT and WHERE clauses. * * <pre> * PREFIX dc: <http://purl.org/dc/elements/1.1/> * PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> * * INSERT * { GRAPH <http://example/bookStore2> { ?book ?p ?v } } * WHERE * { GRAPH <http://example/bookStore> * { ?book dc:date ?date . * FILTER ( ?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime ) * ?book ?p ?v * } } * </pre> */ @SuppressWarnings("rawtypes") public void test_delete_insert_21() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = // "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n"// + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n"// + "INSERT \n"// + " { GRAPH <http://example/bookStore2> { ?book ?p ?v } }\n"// + "WHERE\n"// + " { GRAPH <http://example/bookStore>\n"// + " { ?book dc:date ?date .\n"// + " FILTER ( ?date > \"1970-01-01T00:00:00-02:00\"^^xsd:dateTime )\n"// + " ?book ?p ?v\n"// + "} }"; final IV dcDate = makeIV(valueFactory.createURI("http://purl.org/dc/elements/1.1/date")); final IV dateTime = makeIV(valueFactory.createLiteral("1970-01-01T00:00:00-02:00",XSD.DATETIME)); final IV bookstore = makeIV(valueFactory.createURI("http://example/bookStore")); final IV bookstore2 = makeIV(valueFactory.createURI("http://example/bookStore2")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData insertClause = new QuadData(); final QuadData innerGraph = new QuadData(); insertClause.addChild(innerGraph); innerGraph.addChild(new StatementPatternNode(new VarNode( "book"), new VarNode("p"), new VarNode("v"), new ConstantNode(bookstore2), Scope.NAMED_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); final JoinGroupNode graphGroup = new JoinGroupNode(); whereClause.addChild(graphGroup); graphGroup.setContext(new ConstantNode(bookstore)); graphGroup.addChild(new StatementPatternNode( new VarNode("book"), new ConstantNode(dcDate), new VarNode("date"), new ConstantNode(bookstore), Scope.NAMED_CONTEXTS)); graphGroup.addChild(new FilterNode(FunctionNode.GT(new VarNode( "date"), new ConstantNode(dateTime)))); graphGroup.addChild(new StatementPatternNode( new VarNode("book"), new VarNode("p"), new VarNode("v"), new ConstantNode(bookstore), Scope.NAMED_CONTEXTS)); op.setWhereClause(whereClause); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * A unit test for the DELETE WHERE "shortcut" form. * <pre> * DELETE WHERE {?x foaf:name ?y } * </pre> */ public void test_delete_where_01() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "DELETE WHERE {?x <http://xmlns.com/foaf/0.1/name> ?y }"; @SuppressWarnings("rawtypes") final IV foafName = makeIV(valueFactory .createURI("http://xmlns.com/foaf/0.1/name")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final JoinGroupNode whereClause = new JoinGroupNode(); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(foafName), new VarNode("y"))); op.setWhereClause(whereClause); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * A unit test for the DELETE WHERE "shortcut" form. * <pre> * DELETE WHERE { GRAPH ?g { ?x foaf:name ?y } } * </pre> * * @see https://sourceforge.net/apps/trac/bigdata/ticket/568 (DELETE WHERE * fails with Java AssertionError) */ public void test_delete_where_02() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "DELETE WHERE { GRAPH ?g { ?x <http://xmlns.com/foaf/0.1/name> ?y } }"; @SuppressWarnings("rawtypes") final IV foafName = makeIV(valueFactory .createURI("http://xmlns.com/foaf/0.1/name")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final JoinGroupNode whereClause = new JoinGroupNode(); final JoinGroupNode graphClause = new JoinGroupNode(); graphClause.setContext(new VarNode("g")); whereClause.addChild(graphClause); graphClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(foafName), new VarNode("y"), new VarNode("g"), Scope.NAMED_CONTEXTS)); op.setWhereClause(whereClause); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * DELETE/INSERT with blank node in the DELETE template. * <p> * Note: blank nodes are not allowed in the DELETE clause template (nor in * DELETE DATA). This is because the blank nodes in the DELETE clause are * distinct for each solution plugged into that template. Thus they can not * match anything in the database. * * @see <a href="https://sourceforge.net/apps/trac/bigdata/ticket/571"> * DELETE/INSERT WHERE handling of blank nodes </a> */ public void test_delete_insert_blankNodes01() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { [] foaf:givenName 'Bill' }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; try { parseUpdate(sparql, baseURI); fail("Expecting exception: blank nodes not allowed in DELETE template"); } catch (MalformedQueryException ex) { // Ignore expected exception. // ex.printStackTrace(); } } /** * DELETE/INSERT with blank node in the DELETE template. * <p> * Note: blank nodes are not allowed in the DELETE clause template (nor in * DELETE DATA). This is because the blank nodes in the DELETE clause are * distinct for each solution plugged into that template. Thus they can not * match anything in the database. * * @see <a href="https://sourceforge.net/apps/trac/bigdata/ticket/571"> * DELETE/INSERT WHERE handling of blank nodes </a> */ public void test_delete_insert_blankNodes02() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName [] }\n"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH <http://example/addresses> {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; try { parseUpdate(sparql, baseURI); fail("Expecting exception: blank nodes not allowed in DELETE template"); } catch (MalformedQueryException ex) { // Ignore expected exception. // ex.printStackTrace(); } } /** * A unit test for the DELETE WHERE form without the shortcut, but * there the template and the where clause are the same. * <pre> * DELETE {?x foaf:name ?y } WHERE {?x foaf:name ?y } * </pre> */ public void test_delete_where_without_shortcut_02() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "DELETE {?x <http://xmlns.com/foaf/0.1/name> ?y}\n" + " WHERE {?x <http://xmlns.com/foaf/0.1/name> ?y }"; @SuppressWarnings("rawtypes") final IV foafName = makeIV(valueFactory .createURI("http://xmlns.com/foaf/0.1/name")); final UpdateRoot expected = new UpdateRoot(); { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(foafName), new VarNode("y"))); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(foafName), new VarNode("y"))); op.setWhereClause(whereClause); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * A sequences of DELETE/INSERT operations with different data sets and no * WITH clause. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * }; * INSERT { ?person foaf:givenName 'William' } * USING NAMED <http://example/addresses> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> */ @SuppressWarnings("rawtypes") public void test_delete_insert_30() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "};"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "USING NAMED <http://example/addresses>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } } { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } final Set<IV> namedGraphs = new LinkedHashSet<IV>(); namedGraphs.add(addresses); @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set) Collections.emptySet(),// defaultGraph namedGraphs,// true // update ); op.setDataset(dataset); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * A sequences of DELETE/INSERT operations with different data sets and no * WITH clause. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * USING NAMED <http://example/addresses> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * }; * INSERT { ?person foaf:givenName 'William' } * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> * * Note: This is the same operations, but the first one has the data set * while the second one does not. */ @SuppressWarnings("rawtypes") public void test_delete_insert_31() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "USING NAMED <http://example/addresses>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "};"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory .createURI("http://example/addresses")); final IV givenName = makeIV(valueFactory .createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } final Set<IV> namedGraphs = new LinkedHashSet<IV>(); namedGraphs.add(addresses); @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set) Collections.emptySet(),// defaultGraph namedGraphs,// true // update ); op.setDataset(dataset); } { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * A sequences of DELETE/INSERT operations with different data sets and no * WITH clause. Test ensures, that named graph from dataset definition * of the first clause does not get leaked into the second clause dataset definition. * * <pre> * PREFIX foaf: <http://xmlns.com/foaf/0.1/> * * DELETE { ?person foaf:givenName 'Bill' } * USING NAMED <http://example/addresses> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * }; * INSERT { ?person foaf:givenName 'William' } * USING NAMED <http://example/addresses2> * WHERE { * ?person foaf:givenName 'Bill' . * GRAPH ?graph { * ?person foaf:givenName 'Bill' * } * } * </pre> */ @SuppressWarnings("rawtypes") public void test_datasets_isolation() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" + "DELETE { ?person foaf:givenName 'Bill' }\n"// + "USING NAMED <http://example/addresses>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "};"// + "INSERT { ?person foaf:givenName 'William' }\n"// + "USING NAMED <http://example/addresses2>\n"// + "WHERE {\n"// + " ?person foaf:givenName 'Bill'. \n"// + " GRAPH ?graph {\n"// + " ?person foaf:givenName 'Bill'\n"// + " }\n"// + "}"; final IV addresses = makeIV(valueFactory.createURI("http://example/addresses")); final IV addresses2 = makeIV(valueFactory.createURI("http://example/addresses2")); final IV givenName = makeIV(valueFactory.createURI("http://xmlns.com/foaf/0.1/givenName")); final IV label1 = makeIV(valueFactory.createLiteral("Bill")); final IV label2 = makeIV(valueFactory.createLiteral("William")); final UpdateRoot expected = new UpdateRoot(); { { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData deleteClause = new QuadData(); deleteClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); op.setDeleteClause(new QuadsDataOrNamedSolutionSet(deleteClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } final Set<IV> namedGraphs = new LinkedHashSet<IV>(); namedGraphs.add(addresses); @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set) Collections.emptySet(),// defaultGraph namedGraphs,// true // update ); op.setDataset(dataset); } { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData insertClause = new QuadData(); insertClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label2), null, Scope.DEFAULT_CONTEXTS)); op.setInsertClause(new QuadsDataOrNamedSolutionSet(insertClause)); } { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); // Outside the GRAPH group. whereClause.addChild(new StatementPatternNode(new VarNode( "person"), new ConstantNode(givenName), new ConstantNode(label1), null, Scope.DEFAULT_CONTEXTS)); // The GRAPH group. whereClause.addChild(new JoinGroupNode( new VarNode("graph"), new StatementPatternNode( new VarNode("person"), new ConstantNode( givenName), new ConstantNode(label1), new VarNode( "graph"), Scope.NAMED_CONTEXTS))); } final Set<IV> namedGraphs = new LinkedHashSet<IV>(); namedGraphs.add(addresses2); @SuppressWarnings("unchecked") final DatasetNode dataset = new DatasetNode( (Set) Collections.emptySet(),// defaultGraph namedGraphs,// true // update ); op.setDataset(dataset); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } /** * <pre> * INSERT { * * GRAPH <http://example/out> { ?s ?p ?v . } * * } * WHERE { * * SELECT ?s ?p ?v * WHERE { * * GRAPH <http://example/in> { ?s ?p ?v . } * * } * * } * </pre> * * @see <a href="https://sourceforge.net/apps/trac/bigdata/ticket/562" > * Sub-select in INSERT cause NPE in UpdateExprBuilder </a> */ public void test_ticket_562() throws MalformedQueryException, TokenMgrError, ParseException { final String sparql = "INSERT {\n" + // " GRAPH <http://example/out> { ?s ?p ?v . }\n" + // "}\n" + // "WHERE {\n" + // " SELECT ?s ?p ?v\n" + // " WHERE {\n" + // " GRAPH <http://example/in> { ?s ?p ?v . }\n" + // " }\n" + // "}"; @SuppressWarnings("rawtypes") final IV out = makeIV(valueFactory.createURI("http://example/out")); @SuppressWarnings("rawtypes") final IV in = makeIV(valueFactory.createURI("http://example/in")); final UpdateRoot expected = new UpdateRoot(); { { final DeleteInsertGraph op = new DeleteInsertGraph(); expected.addChild(op); { final QuadData insertClause = new QuadData(); op.setInsertClause(new QuadsDataOrNamedSolutionSet( insertClause)); final QuadData innerGroup = new QuadData(); insertClause.addChild(innerGroup); innerGroup.addChild(new StatementPatternNode(new VarNode( "s"), new VarNode("p"), new VarNode("v"), new ConstantNode(out), Scope.NAMED_CONTEXTS)); } final SubqueryRoot subquery; // Top-level WHERE clause. { final JoinGroupNode whereClause = new JoinGroupNode(); op.setWhereClause(whereClause); subquery = new SubqueryRoot(QueryType.SELECT); whereClause.addChild(subquery); } // Subquery { final ProjectionNode projection = new ProjectionNode(); projection.addProjectionVar(new VarNode("s")); projection.addProjectionVar(new VarNode("p")); projection.addProjectionVar(new VarNode("v")); subquery.setProjection(projection); final JoinGroupNode whereClause = new JoinGroupNode(); subquery.setWhereClause(whereClause); final JoinGroupNode graphClause = new JoinGroupNode(); graphClause.setContext(new ConstantNode(in)); whereClause.addChild(graphClause); graphClause.addChild(new StatementPatternNode(new VarNode( "s"), new VarNode("p"), new VarNode("v"), new ConstantNode(in), Scope.NAMED_CONTEXTS)); } // final Set<IV> namedGraphs = new LinkedHashSet<IV>(); // namedGraphs.add(addresses); // // @SuppressWarnings({ "unchecked", "rawtypes" }) // final DatasetNode dataset = new DatasetNode( // (Set) Collections.emptySet(),// defaultGraph // (Set) Collections.emptySet(),// namedGraphs // true // update // ); // // op.setDataset(dataset); } } final UpdateRoot actual = parseUpdate(sparql, baseURI); assertSameAST(sparql, expected, actual); } }