package com.bigdata.rdf.sparql.ast; import java.util.Collections; import java.util.Map; import java.util.Set; import org.openrdf.query.Dataset; import com.bigdata.bop.BOp; import com.bigdata.rdf.internal.IV; import com.bigdata.rdf.sparql.ast.eval.DataSetSummary; import com.bigdata.rdf.spo.ISPO; import com.bigdata.relation.accesspath.IElementFilter; /** * AST node models a SPARQL default graph and/or named graph data set. * * @author <a href="mailto:mrpersonick@users.sourceforge.net">Mike Personick</a> * @version $Id$ */ public class DatasetNode extends QueryNodeBase { /** * */ private static final long serialVersionUID = 1L; interface Annotations extends QueryNodeBase.Annotations { /** * A {@link DataSetSummary} for the default graph. */ String DEFAULT_GRAPHS = "defaultGraphs"; /** * An optional filter for the default graph. */ String DEFAULT_GRAPH_FILTER = "defaultGraphFilter"; /** A {@link DataSetSummary} for the named graphs. */ String NAMED_GRAPHS = "namedGraphs"; /** * An optional filter for the named graphs. */ String NAMED_GRAPH_FILTER = "namedGraphFilter"; } /** * Constructor required for {@link com.bigdata.bop.BOpUtility#deepCopy(FilterNode)}. */ public DatasetNode(final DatasetNode op) { super(op); } /** * Required shallow copy constructor. */ public DatasetNode(final BOp[] args, final Map<String, Object> anns) { super(args, anns); } /** * * @param ivs * The {@link IV}s. * @param update * <code>true</code> iff this is a SPARQL UPDATE./ * @return */ @SuppressWarnings("rawtypes") private static final DataSetSummary asDataSetSummary(final Set<IV> ivs, final boolean update) { /* * Note: This will cause named-graphs-01b to fail. */ // if (ivs == null) // return null; /* * Note: Per DAWG tests graph-02 and graph-04, a query against an empty * default graph collection or an empty named graph collection should * be constrained to NO graphs. This is different from the case where * the dataset is simply not specified, which is interpreted as having * no constraint on the visited graphs. * * See DataSetSummary#toInternalValues() */ // if (ivs.isEmpty()) // return null; return new DataSetSummary((Set) (ivs == null ? Collections.emptySet() : ivs), update); } /** * * @param defaultGraphs * @param namedGraphs * @param update * <code>true</code> iff this is a SPARQL update. */ @SuppressWarnings("rawtypes") public DatasetNode(final Set<IV> defaultGraphs, final Set<IV> namedGraphs, final boolean update) { this(asDataSetSummary(defaultGraphs, update), asDataSetSummary( namedGraphs, update)); } @SuppressWarnings("rawtypes") public DatasetNode(final Set<IV> defaultGraphs, final Set<IV> namedGraphs, final IElementFilter<ISPO> defaultGraphFilter, final IElementFilter<ISPO> namedGraphFilter, final boolean update) { this(asDataSetSummary(defaultGraphs, update), asDataSetSummary( namedGraphs, update), defaultGraphFilter, namedGraphFilter); } public DatasetNode(final DataSetSummary defaultGraphs, final DataSetSummary namedGraphs) { this(defaultGraphs, namedGraphs, null, null); } public DatasetNode(final Dataset dataset, final boolean update) { this(DataSetSummary.toInternalValues(dataset.getDefaultGraphs()), DataSetSummary.toInternalValues(dataset.getNamedGraphs()), update); } /** * Core constructor implementation. * * @param defaultGraphs * The list of default graphs (optional). When not specified, all * graphs will be used unless a <i>defaultGraphsFilter</i> is * applied. * @param namedGraphs * The list of named graphs (optional). When not specified, all * graphs will be used unless a <i>namedGraphsFilter</i> is * applied. * @param defaultGraphFilter * A filter for default graphs (optional and typically only used * when the <i>defaultGraphs</i> is <code>null</code>, e.g., to * apply ACLs). * @param namedGraphFilter * A filter for named graphs (optional and typically only used * when the <i>namedGraphs</i> is <code>null</code>, e.g., to * apply ACLs). */ public DatasetNode( final DataSetSummary defaultGraphs, final DataSetSummary namedGraphs, final IElementFilter<ISPO> defaultGraphFilter, final IElementFilter<ISPO> namedGraphFilter) { setDefaultGraphs(defaultGraphs); setNamedGraphs(namedGraphs); setDefaultGraphFilter(defaultGraphFilter); setNamedGraphFilter(namedGraphFilter); } public void setDefaultGraphs(final DataSetSummary defaultGraphs) { setProperty(Annotations.DEFAULT_GRAPHS, defaultGraphs); } public void setNamedGraphs(final DataSetSummary namedGraphs) { setProperty(Annotations.NAMED_GRAPHS, namedGraphs); } public void setDefaultGraphFilter( final IElementFilter<ISPO> defaultGraphFilter) { setProperty(Annotations.DEFAULT_GRAPH_FILTER, defaultGraphFilter); } public void setNamedGraphFilter(final IElementFilter<ISPO> namedGraphFilter) { setProperty(Annotations.NAMED_GRAPH_FILTER, namedGraphFilter); } public DataSetSummary getDefaultGraphs() { return (DataSetSummary) getProperty(Annotations.DEFAULT_GRAPHS); } public DataSetSummary getNamedGraphs() { return (DataSetSummary) getProperty(Annotations.NAMED_GRAPHS); } @SuppressWarnings("unchecked") public IElementFilter<ISPO> getDefaultGraphFilter() { return (IElementFilter<ISPO>) getProperty(Annotations.DEFAULT_GRAPH_FILTER); } @SuppressWarnings("unchecked") public IElementFilter<ISPO> getNamedGraphFilter() { return (IElementFilter<ISPO>) getProperty(Annotations.NAMED_GRAPH_FILTER); } @Override public String toString(final int indent) { final String s = indent(indent); final StringBuilder sb = new StringBuilder(); final DataSetSummary defaultGraphs = getDefaultGraphs(); final DataSetSummary namedGraphs = getNamedGraphs(); final IElementFilter<?> defaultGraphFilter = getDefaultGraphFilter(); final IElementFilter<?> namedGraphFilter = getNamedGraphFilter(); if (defaultGraphs != null) { sb.append("\n"); sb.append(s); sb.append("defaultGraphs="); sb.append(defaultGraphs.toString()); } if (namedGraphs != null) { sb.append("\n"); sb.append(s); sb.append("namedGraphs="); sb.append(namedGraphs.toString()); } if (defaultGraphFilter != null) { sb.append("\n"); sb.append(s); sb.append("defaultGraphFilter=" + defaultGraphFilter); } if (namedGraphFilter != null) { sb.append("\n"); sb.append(s); sb.append("namedGraphFilter=" + namedGraphFilter); } // if (getQueryHints() != null) { // sb.append("\n"); // sb.append(s); // sb.append(Annotations.QUERY_HINTS); // sb.append("="); // sb.append(getQueryHints().toString()); // } return sb.toString(); } }