ProjectionRemovalOptimizerTest.java
/*******************************************************************************
* Copyright (c) 2021 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.query.algebra.evaluation.impl;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.eclipse.rdf4j.common.exception.RDF4JException;
import org.eclipse.rdf4j.query.QueryLanguage;
import org.eclipse.rdf4j.query.algebra.Join;
import org.eclipse.rdf4j.query.algebra.Projection;
import org.eclipse.rdf4j.query.algebra.QueryRoot;
import org.eclipse.rdf4j.query.algebra.StatementPattern;
import org.eclipse.rdf4j.query.algebra.TupleExpr;
import org.eclipse.rdf4j.query.algebra.evaluation.optimizer.ProjectionRemovalOptimizer;
import org.eclipse.rdf4j.query.parser.ParsedQuery;
import org.eclipse.rdf4j.query.parser.QueryParserUtil;
import org.junit.jupiter.api.Test;
public class ProjectionRemovalOptimizerTest {
@Test
public void testRemovingOptimization() throws RDF4JException {
String query = "SELECT ?s ?p ?o WHERE { ?s ?p ?o }";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertNotEquals(original, optimized);
}
@Test
public void testRemovingOptimizationSubselect() throws RDF4JException {
String query = "SELECT ?s ?p ?o WHERE { SELECT * WHERE { ?s ?p ?o }}";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertNotEquals(original, optimized);
assertTrue(optimized instanceof QueryRoot);
TupleExpr child = ((QueryRoot) optimized).getArg();
assertTrue(child instanceof StatementPattern);
}
@Test
public void testRemovingHalfOptimizationSubselect() throws RDF4JException {
String query = "SELECT ?s ?p WHERE { SELECT * WHERE { ?s ?p ?o , ?o2 }}";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertNotEquals(original, optimized);
assertTrue(optimized instanceof QueryRoot);
TupleExpr child = ((QueryRoot) optimized).getArg();
assertTrue(child instanceof Projection);
TupleExpr grandChild = ((Projection) child).getArg();
assertTrue(grandChild instanceof Join);
}
@Test
public void testNotRemovingOptimizationTooFew() throws RDF4JException {
String query = "SELECT ?s ?p WHERE { ?s ?p ?o }";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertEquals(original, optimized);
}
@Test
public void testNotRemovingOptimizationTooMany() throws RDF4JException {
String query = "SELECT ?s ?p ?o ?o2 WHERE { ?s ?p ?o }";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertEquals(original, optimized);
}
@Test
public void testNotRemovingOptimization2() throws RDF4JException {
String query = "SELECT (?s as ?o2) (?p as ?s1) ?o WHERE { ?s ?p ?o }";
ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null);
TupleExpr original = pq.getTupleExpr();
TupleExpr optimized = original.clone();
new ProjectionRemovalOptimizer().optimize(optimized, null, null);
assertEquals(original, optimized);
}
}