/** 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 */ package com.bigdata.rdf.sail.webapp; import org.openrdf.model.URI; import org.openrdf.model.impl.LiteralImpl; import org.openrdf.model.impl.URIImpl; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; import junit.framework.Test; import com.bigdata.journal.IIndexManager; /** * Proxied test suite for the DELETE_BY_ACCESS_PATH method. * * @param <S> * * @see <a href="http://trac.bigdata.com/ticket/1177"> Resource... contexts not * encoded/decoded according to openrdf semantics (REST API) </a> * * FIXME (***) Add tests for quads mode that target #1177 */ public class Test_REST_DELETE_BY_ACCESS_PATH<S extends IIndexManager> extends AbstractTestNanoSparqlClient<S> { public Test_REST_DELETE_BY_ACCESS_PATH() { } public Test_REST_DELETE_BY_ACCESS_PATH(final String name) { super(name); } public static Test suite() { return ProxySuiteHelper.suiteWhenStandalone(Test_REST_DELETE_BY_ACCESS_PATH.class, "test.*", TestMode.quads // , TestMode.sids // , TestMode.triples ); } /** * Delete everything matching an access path description. */ public void test_DELETE_accessPath_delete_all() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p null); assertEquals(7, mutationResult); } /** * Delete everything with a specific subject. */ public void test_DELETE_accessPath_delete_s() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// new URIImpl("http://www.bigdata.com/Mike"),// s null,// p null); assertEquals(3, mutationResult); } /** * Delete everything with a specific predicate. */ public void test_DELETE_accessPath_delete_p() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s new URIImpl("http://www.w3.org/2000/01/rdf-schema#label"),// p null// o ); assertEquals(2, mutationResult); } /** * Delete everything with a specific object (a URI). */ public void test_DELETE_accessPath_delete_o_URI() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p new URIImpl("http://xmlns.com/foaf/0.1/Person")// o ); assertEquals(3, mutationResult); } /** * Delete everything with a specific object (a Literal). */ public void test_DELETE_accessPath_delete_o_Literal() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p new URIImpl("http://www.bigdata.com/Bryan")// o ); assertEquals(1, mutationResult); } /** * Delete everything with a specific predicate and object (a URI). */ public void test_DELETE_accessPath_delete_p_o_URI() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s RDF.TYPE,// p new URIImpl("http://xmlns.com/foaf/0.1/Person")// o ); assertEquals(3, mutationResult); } /** * Delete everything with a specific predicate and object (a Literal). */ public void test_DELETE_accessPath_delete_p_o_Literal() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s RDFS.LABEL,// p new LiteralImpl("Bryan")// o ); assertEquals(1, mutationResult); } /** * Delete using an access path which does not match anything. */ public void test_DELETE_accessPath_delete_NothingMatched() throws Exception { doInsertbyURL("POST", packagePath + "test_delete_by_access_path.ttl"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p new URIImpl("http://xmlns.com/foaf/0.1/XXX")// o ); assertEquals(0, mutationResult); } /** * Delete everything in a named graph (context). */ public void test_DELETE_accessPath_delete_c() throws Exception { if (TestMode.quads != getTestMode()) return; doInsertbyURL("POST", packagePath + "test_delete_by_access_path.trig"); final URI base = new URIImpl("http://www.bigdata.com/"); final URI c1 = new URIImpl("http://www.bigdata.com/c1"); final URI c2 = new URIImpl("http://www.bigdata.com/c2"); // This is the named graph that we will delete. assertEquals(3,m_repo.rangeCount(null,// s, null,// p null,// o base// c )); // These named graphs will not be deleted. assertEquals(2,m_repo.rangeCount(null,// s, null,// p null,// o c1// c )); assertEquals(2,m_repo.rangeCount(null,// s, null,// p null,// o c2// c )); // Delete the named graph (and only that graph) final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p null,// o base // c ); assertEquals(3, mutationResult); // verify #of stmts modified. // range count each named graph again. final long rangeCount_base = m_repo.rangeCount(null,// s, null,// p null,// o base// c ); final long rangeCount_c1 = m_repo.rangeCount(null,// s, null,// p null,// o c1// c ); final long rangeCount_c2 = m_repo.rangeCount(null,// s, null,// p null,// o c2// c ); // This is what we deleted out of the quad store. assertEquals(0,rangeCount_base); // These should be unchanged. assertEquals(2, rangeCount_c1); // These should be unchanged. assertEquals(2, rangeCount_c2); } /** * Delete everything in a different named graph (context). */ public void test_DELETE_accessPath_delete_c1() throws Exception { if (TestMode.quads != getTestMode()) return; doInsertbyURL("POST", packagePath + "test_delete_by_access_path.trig"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p null,// o new URIImpl("http://www.bigdata.com/c1") // c ); assertEquals(2, mutationResult); } /** * Delete everything in a two named graphs (context) while the data in another * named graph is not deleted. */ public void test_DELETE_accessPath_delete_multiple_contexts() throws Exception { if (TestMode.quads != getTestMode()) return; doInsertbyURL("POST", packagePath + "test_delete_by_access_path.trig"); final URI base = new URIImpl("http://www.bigdata.com/"); final URI c1 = new URIImpl("http://www.bigdata.com/c1"); final URI c2 = new URIImpl("http://www.bigdata.com/c2"); // This named graph will not be deleted. assertEquals(3, m_repo.rangeCount(null,// s, null,// p null,// o base// c )); // These named graphs will be deleted. assertEquals(2, m_repo.rangeCount(null,// s, null,// p null,// o c1// c )); assertEquals(2,m_repo.rangeCount(null,// s, null,// p null,// o c2// c )); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p null,// o c1, c2 // c ); // should have removed 2 statements from each of two named graphs for a // total of 4 statements removed. assertEquals(4, mutationResult); // range count each named graph. final long rangeCount_base = m_repo.rangeCount(null,// s, null,// p null,// o base// c ); final long rangeCount_c1 = m_repo.rangeCount(null,// s, null,// p null,// o c1// c ); final long rangeCount_c2 = m_repo.rangeCount(null,// s, null,// p null,// o c2// c ); // Not deleted. assertEquals(3,rangeCount_base); // These should be deleted assertEquals(0, rangeCount_c1); // These should be unchanged. assertEquals(0, rangeCount_c2); } /** * Delete using an access path with the context position bound. */ public void test_DELETE_accessPath_delete_c_nothingMatched() throws Exception { if (TestMode.quads != getTestMode()) return; doInsertbyURL("POST", packagePath + "test_delete_by_access_path.trig"); final long mutationResult = doDeleteWithAccessPath(// // requestPath,// null,// s null,// p null,// o new URIImpl("http://xmlns.com/foaf/0.1/XXX") // c ); assertEquals(0, mutationResult); } }