PlanNodeHelper.java

/*******************************************************************************
 * Copyright (c) 2020 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/
package org.eclipse.rdf4j.sail.shacl.ast.planNodes;

import java.util.Set;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.vocabulary.RDF4J;
import org.eclipse.rdf4j.query.Dataset;
import org.eclipse.rdf4j.query.impl.SimpleDataset;
import org.eclipse.rdf4j.sail.shacl.wrapper.data.ConnectionsGroup;

public class PlanNodeHelper {

	private final static SimpleDataset rdf4jNilDataset;

	static {
		rdf4jNilDataset = new SimpleDataset();
		rdf4jNilDataset.addDefaultGraph(RDF4J.NIL);
	}

	public static PlanNode handleSorting(PlanNode child, PlanNode parent, ConnectionsGroup connectionsGroup) {
		return handleSorting(child.requiresSorted(), parent, connectionsGroup);
	}

	public static PlanNode handleSorting(boolean requiresSorted, PlanNode parent, ConnectionsGroup connectionsGroup) {
		if (requiresSorted) {
			if (!parent.producesSorted()) {
//				if (connectionsGroup != null && (parent instanceof BufferedSplitter.BufferedSplitterPlaneNode ||
//						parent instanceof UnorderedSelect)) {
//					parent = connectionsGroup.getCachedNodeFor(new Sort(parent, connectionsGroup));
//				} else {
				parent = new Sort(parent, connectionsGroup);
//				}
			}
		}
		return parent;
	}

	public static Dataset asDefaultGraphDataset(Resource[] dataGraph) {
		if (dataGraph.length == 0) {
			return AllDataset.instance;
		} else if (dataGraph.length == 1 && dataGraph[0] == null) {
			return rdf4jNilDataset;
		}

		SimpleDataset dataGraphDataset = new SimpleDataset();
		for (Resource context : dataGraph) {
			if (context == null) {
				dataGraphDataset.addDefaultGraph(RDF4J.NIL);
			} else if (context.isIRI()) {
				dataGraphDataset.addDefaultGraph(((IRI) context));
			} else {
				throw new IllegalArgumentException("Trying to validate a data graph that is not an IRI.");
			}
		}
		return dataGraphDataset;
	}

	static final class AllDataset implements Dataset {

		static final AllDataset instance = new AllDataset();
		private static final Set<IRI> empty = Set.of();

		@Override
		public Set<IRI> getDefaultRemoveGraphs() {
			return empty;
		}

		@Override
		public IRI getDefaultInsertGraph() {
			return null;
		}

		@Override
		public Set<IRI> getDefaultGraphs() {
			return empty;
		}

		@Override
		public Set<IRI> getNamedGraphs() {
			return empty;
		}
	}

}