com.bigdata.rdf.sparql.ast.DeleteInsertGraph Maven / Gradle / Ivy
/**
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
[email protected]
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 Mar 10, 2012
*/
package com.bigdata.rdf.sparql.ast;
import java.util.Map;
import com.bigdata.bop.BOp;
/**
* The DELETE/INSERT operation can be used to remove or add triples from/to the
* Graph Store based on bindings for a query pattern specified in a WHERE
* clause:
*
*
* ( WITH IRIref )?
* ( ( DeleteClause InsertClause? ) | InsertClause )
* ( USING ( NAMED )? IRIref )*
* WHERE GroupGraphPattern
*
*
* The DeleteClause and InsertClause forms can be broken down as follows:
*
*
* DeleteClause ::= DELETE QuadPattern
* InsertClause ::= INSERT QuadPattern
*
*
* @see http://www.w3.org/TR/sparql11-update/#deleteInsert
*
* @author Bryan Thompson
*/
public class DeleteInsertGraph extends GraphUpdate implements
IGraphPatternContainer, IDataSetNode {
/**
*
*/
private static final long serialVersionUID = 1L;
interface Annotations extends GraphUpdate.Annotations,
IGraphPatternContainer.Annotations, IDataSetNode.Annotations {
/**
* The optional DELETE clause.
*/
String DELETE_CLAUSE = "deleteClause";
/**
* The optional INSERT clause.
*/
String INSERT_CLAUSE = "insertClause";
}
public DeleteInsertGraph() {
super(UpdateType.DeleteInsert);
}
/**
* @param op
*/
public DeleteInsertGraph(final DeleteInsertGraph op) {
super(op);
}
/**
* @param args
* @param anns
*/
public DeleteInsertGraph(final BOp[] args, final Map anns) {
super(args, anns);
}
/**
* {@inheritDoc}
*
* Note: The data set can only be specified for the general case of
* DELETE/INSERT. The data set is specific to the DELETE/INSERT operation to
* which it is attached (it is not inherited or combined with the data set
* for later operations in a sequence).
*/
@Override
public void setDataset(final DatasetNode dataset) {
setProperty(Annotations.DATASET, dataset);
}
@Override
public DatasetNode getDataset() {
return (DatasetNode) getProperty(Annotations.DATASET);
}
/**
* Return the {@link GraphPatternGroup} for the WHERE clause.
*
* @return The WHERE clause -or- null
.
*/
@SuppressWarnings({ "rawtypes" })
public GraphPatternGroup getWhereClause() {
// Note: Synonym for getGraphPattern.
return getGraphPattern();
}
@Override
@SuppressWarnings("unchecked")
public GraphPatternGroup getGraphPattern() {
return (GraphPatternGroup) getProperty(Annotations.GRAPH_PATTERN);
}
/**
* Set the WHERE clause.
*/
public void setWhereClause(
final GraphPatternGroup whereClause) {
setGraphPattern(whereClause);
}
@Override
public void setGraphPattern(
final GraphPatternGroup graphPattern) {
/*
* Clear the parent reference on the new where clause.
*
* Note: This handles cases where a join group is lifted into a named
* subquery. If we do not clear the parent reference on the lifted join
* group it will still point back to its parent in the original join
* group.
*/
graphPattern.setParent(null);
super.setProperty(Annotations.GRAPH_PATTERN, graphPattern);
}
/**
* Return the template for the DELETE clause.
*/
public QuadsDataOrNamedSolutionSet getDeleteClause() {
return (QuadsDataOrNamedSolutionSet) getProperty(Annotations.DELETE_CLAUSE);
}
/**
* Return the template for the INSERT clause.
*/
public QuadsDataOrNamedSolutionSet getInsertClause() {
return (QuadsDataOrNamedSolutionSet) getProperty(Annotations.INSERT_CLAUSE);
}
public void setDeleteClause(final QuadsDataOrNamedSolutionSet data) {
setProperty(Annotations.DELETE_CLAUSE, data);
}
public void setInsertClause(final QuadsDataOrNamedSolutionSet data) {
setProperty(Annotations.INSERT_CLAUSE, data);
}
@Override
final public String toString(final int indent) {
final StringBuilder sb = new StringBuilder();
sb.append(indent(indent));
sb.append(getUpdateType());
final DatasetNode dataset = getDataset();
final QuadsDataOrNamedSolutionSet deleteClause = getDeleteClause();
final QuadsDataOrNamedSolutionSet insertClause = getInsertClause();
final GraphPatternGroup> whereClause = getWhereClause();
if (dataset != null) {
sb.append(dataset.toString(indent + 1));
}
if (deleteClause != null) {
sb.append("\n");
sb.append(indent(indent + 1));
sb.append("DELETE ");
sb.append(deleteClause.toString(indent + 2));
}
if (insertClause != null) {
sb.append("\n");
sb.append(indent(indent + 1));
sb.append("INSERT ");
sb.append(insertClause.toString(indent + 2));
}
if (whereClause != null) {
sb.append("\n");
sb.append(indent(indent + 1));
sb.append("WHERE");
sb.append(whereClause.toString(indent + 2));
}
sb.append("\n");
return sb.toString();
}
}