/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.arq.querybuilder.handlers;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Query;
import org.apache.jena.query.SortCondition;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.expr.E_Random;
import org.apache.jena.sparql.lang.sparql_11.ParseException;
import org.junit.Before;
import org.junit.Test;
public class SolutionModifierHandlerTest extends AbstractHandlerTest {
private Query query;
private SolutionModifierHandler solutionModifier;
@Before
public void setup() {
query = new Query();
solutionModifier = new SolutionModifierHandler(query);
}
@Test
public void testAddAll() throws ParseException {
SolutionModifierHandler solutionModifier2 = new SolutionModifierHandler(new Query());
solutionModifier2.addOrderBy(Var.alloc("orderBy"));
solutionModifier2.addGroupBy(Var.alloc("groupBy"));
solutionModifier2.addHaving("?having<10");
solutionModifier2.setLimit(500);
solutionModifier2.setOffset(200);
solutionModifier.addAll(solutionModifier2);
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("groupBy"), s);
assertContainsRegex(HAVING + OPEN_PAREN + var("having") + OPT_SPACE + LT + OPT_SPACE + "10" + CLOSE_PAREN, s);
assertContainsRegex(ORDER_BY + var("orderBy"), s);
assertContainsRegex(LIMIT + "500", s);
assertContainsRegex(OFFSET + "200", s);
}
@Test
public void testAll() throws ParseException {
solutionModifier.addOrderBy(Var.alloc("orderBy"));
solutionModifier.addGroupBy(Var.alloc("groupBy"));
solutionModifier.addHaving("SUM(?lprice) > 10");
solutionModifier.setLimit(500);
solutionModifier.setOffset(200);
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("groupBy"), s);
assertContainsRegex(HAVING + OPEN_PAREN + "SUM" + OPEN_PAREN + var("lprice") + CLOSE_PAREN + OPT_SPACE + GT
+ "10" + CLOSE_PAREN, s);
assertContainsRegex(ORDER_BY + var("orderBy"), s);
assertContainsRegex(LIMIT + "500", s);
assertContainsRegex(OFFSET + "200", s);
}
@Test
public void testAddOrderBy() {
solutionModifier.addOrderBy(Var.alloc("orderBy"));
List<SortCondition> sc = query.getOrderBy();
assertEquals("Wrong number of conditions", 1, sc.size());
assertEquals("Wrong value", sc.get(0).expression.asVar(), Var.alloc("orderBy"));
solutionModifier.addOrderBy(Var.alloc("orderBy2"));
sc = query.getOrderBy();
assertEquals("Wrong number of conditions", 2, sc.size());
assertEquals("Wrong value", sc.get(0).expression.asVar(), Var.alloc("orderBy"));
assertEquals("Wrong value", sc.get(1).expression.asVar(), Var.alloc("orderBy2"));
}
@Test
public void testAddGroupByVar() {
solutionModifier.addGroupBy(Var.alloc("groupBy"));
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("groupBy"), s);
solutionModifier.addGroupBy(Var.alloc("groupBy2"));
s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("groupBy") + SPACE + var("groupBy2"), s);
}
@Test
public void testAddGroupByExpr() {
solutionModifier.addGroupBy(new E_Random());
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + "rand" + OPEN_PAREN + CLOSE_PAREN, s);
solutionModifier.addGroupBy(Var.alloc("groupBy2"));
s = byLine(query.toString());
assertContainsRegex(GROUP_BY + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + var("groupBy2"), s);
}
@Test
public void testAddGroupByVarAndExpr() {
solutionModifier.addGroupBy(Var.alloc("groupBy"), new E_Random());
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + OPEN_PAREN + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + "AS" + SPACE
+ var("groupBy") + CLOSE_PAREN, s);
solutionModifier.addGroupBy(Var.alloc("groupBy2"));
s = byLine(query.toString());
assertContainsRegex(GROUP_BY + OPEN_PAREN + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + "AS" + SPACE
+ var("groupBy") + CLOSE_PAREN + SPACE + var("groupBy2"), s);
}
@Test
public void testAddHavingString() throws ParseException {
solutionModifier.addHaving("?having<10");
assertContainsRegex(HAVING + OPEN_PAREN + var("having") + OPT_SPACE + LT + 10 + CLOSE_PAREN, query.toString());
solutionModifier.addHaving("?having2");
assertContainsRegex(
HAVING + OPEN_PAREN + var("having") + OPT_SPACE + LT + 10 + CLOSE_PAREN + OPT_SPACE + var("having2"),
query.toString());
}
@Test
public void testAddHavingVar() throws ParseException {
solutionModifier.addHaving(Var.alloc("foo"));
assertContainsRegex(HAVING + var("foo"), query.toString());
solutionModifier.addHaving("?having2");
assertContainsRegex(HAVING + var("foo") + SPACE + var("having2"), query.toString());
}
@Test
public void testAddHavingExpr() throws ParseException {
solutionModifier.addHaving(new E_Random());
assertContainsRegex(HAVING + "rand" + OPEN_PAREN + CLOSE_PAREN, query.toString());
solutionModifier.addHaving("?having2");
assertContainsRegex(HAVING + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + var("having2"), query.toString());
}
@Test
public void testSetLimit() {
solutionModifier.setLimit(500);
String[] s = byLine(query.toString());
assertContainsRegex("LIMIT\\s+500", s);
solutionModifier.setLimit(200);
s = byLine(query.toString());
assertContainsRegex("LIMIT\\s+200", s);
solutionModifier.setLimit(-1);
s = byLine(query.toString());
assertNotContainsRegex("LIMIT.*", s);
}
@Test
public void testSetOffset() {
solutionModifier.setOffset(500);
String[] s = byLine(query.toString());
assertContainsRegex("OFFSET\\s+500", s);
solutionModifier.setOffset(200);
s = byLine(query.toString());
assertContainsRegex("OFFSET\\s+200", s);
solutionModifier.setOffset(-1);
s = byLine(query.toString());
assertNotContainsRegex("OFFSET.*", s);
}
@Test
public void testSetVarsGroupBy() {
Var v = Var.alloc("v");
solutionModifier.addGroupBy(v);
String[] s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("v"), s);
Map<Var, Node> values = new HashMap<Var, Node>();
values.put(v, Var.alloc("v2"));
solutionModifier.setVars(values);
s = byLine(query.toString());
assertContainsRegex(GROUP_BY + var("v2"), s);
}
@Test
public void testSetVarsHaving() {
Var v = Var.alloc("v");
solutionModifier.addHaving(v);
String[] s = byLine(query.toString());
assertContainsRegex(HAVING + var("v"), s);
Map<Var, Node> values = new HashMap<Var, Node>();
values.put(v, Var.alloc("v2"));
solutionModifier.setVars(values);
s = byLine(query.toString());
assertContainsRegex(HAVING + var("v2"), s);
}
@Test
public void testSetVarsOrderBy() {
Var v = Var.alloc("v");
solutionModifier.addOrderBy(v);
String[] s = byLine(query.toString());
assertContainsRegex(ORDER_BY + var("v"), s);
Map<Var, Node> values = new HashMap<Var, Node>();
values.put(v, Var.alloc("v2"));
solutionModifier.setVars(values);
s = byLine(query.toString());
assertContainsRegex(ORDER_BY + var("v2"), s);
}
}