com.bigdata.rdf.sparql.ast.optimizers.TestIVariableBindingRequirements Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bigdata-rdf-test Show documentation
Show all versions of bigdata-rdf-test Show documentation
Blazegraph(TM) RDF Test Suites
/**
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 June 15, 2015
*/
package com.bigdata.rdf.sparql.ast.optimizers;
import static com.bigdata.rdf.sparql.ast.optimizers.AbstractOptimizerTestCase.HelperFlag.OPTIONAL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.bigdata.bop.Constant;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.Var;
import com.bigdata.bop.bindingSet.ListBindingSet;
import com.bigdata.rdf.internal.IV;
import com.bigdata.rdf.internal.VTE;
import com.bigdata.rdf.internal.impl.TermId;
import com.bigdata.rdf.model.BigdataURI;
import com.bigdata.rdf.model.BigdataValue;
import com.bigdata.rdf.model.BigdataValueFactory;
import com.bigdata.rdf.sparql.ast.ASTContainer;
import com.bigdata.rdf.sparql.ast.ArbitraryLengthPathNode;
import com.bigdata.rdf.sparql.ast.AssignmentNode;
import com.bigdata.rdf.sparql.ast.BindingsClause;
import com.bigdata.rdf.sparql.ast.FilterNode;
import com.bigdata.rdf.sparql.ast.FunctionNode;
import com.bigdata.rdf.sparql.ast.GlobalAnnotations;
import com.bigdata.rdf.sparql.ast.IVariableBindingRequirements;
import com.bigdata.rdf.sparql.ast.JoinGroupNode;
import com.bigdata.rdf.sparql.ast.NamedSubqueryInclude;
import com.bigdata.rdf.sparql.ast.QueryRoot;
import com.bigdata.rdf.sparql.ast.QueryType;
import com.bigdata.rdf.sparql.ast.StatementPatternNode;
import com.bigdata.rdf.sparql.ast.StaticAnalysis;
import com.bigdata.rdf.sparql.ast.SubqueryRoot;
import com.bigdata.rdf.sparql.ast.UnionNode;
import com.bigdata.rdf.sparql.ast.eval.AST2BOpContext;
import com.bigdata.rdf.sparql.ast.eval.AST2BOpUtility;
import com.bigdata.rdf.sparql.ast.service.ServiceNode;
import com.bigdata.rdf.store.BDS;
import com.bigdata.service.fts.FTS;
/**
* Test implementation of {@link IVariableBindingRequirements} interface.
*
* @author Michael Schmidt
*/
public class TestIVariableBindingRequirements extends AbstractOptimizerTestCase {
public TestIVariableBindingRequirements() {
}
public TestIVariableBindingRequirements(String name) {
super(name);
}
@Override
IASTOptimizer newOptimizer() {
/**
* This test case is not optimizer specific, but we want to reuse the
* Helper factory methods here and that's the (only) reason why we
* extend the AbstractOptimizerTestCase class.
*/
throw new RuntimeException(
"Not optimizer specific, don't call this method.");
}
/**
* Test interface implementation for statement patterns nodes.
*/
@SuppressWarnings("serial")
public void testStatementPatternNode() {
final StatementPatternNode spn1 =
store.isQuads() ?
(StatementPatternNode) new Helper(){{
tmp = statementPatternNode(varNode(x),varNode(y),varNode(z),varNode(w));
}}.getTmp() :
(StatementPatternNode) new Helper(){{
tmp = statementPatternNode(varNode(x),varNode(y),varNode(z));
}}.getTmp();
final StatementPatternNode spn2 = (StatementPatternNode) new Helper() {{
tmp = statementPatternNode(constantNode(a), constantNode(b), constantNode(c));
}}.getTmp();
final StatementPatternNode spn3 = (StatementPatternNode) new Helper() {{
tmp = statementPatternNode(varNode(x), constantNode(b), varNode(z));
}}.getTmp();
final Set> requiredBoundSpn123 = new HashSet>();
final Set> desiredBoundSpn1 =
store.isQuads() ?
new HashSet>() {{
add(Var.var("x")); add(Var.var("y")); add(Var.var("z")); add(Var.var("w")); }} :
new HashSet>() {{
add(Var.var("x")); add(Var.var("y")); add(Var.var("z")); }};
final Set> desiredBoundSpn2 = new HashSet>();
final Set> desiredBoundSpn3 =
new HashSet>() {{
add(Var.var("x")); add(Var.var("z")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBoundSpn123, spn1.getRequiredBound(sa));
assertEquals(desiredBoundSpn1, spn1.getDesiredBound(sa));
assertEquals(requiredBoundSpn123, spn2.getRequiredBound(sa));
assertEquals(desiredBoundSpn2, spn2.getDesiredBound(sa));
assertEquals(requiredBoundSpn123, spn3.getRequiredBound(sa));
assertEquals(desiredBoundSpn3, spn3.getDesiredBound(sa));
}
/**
* Test interface implementation for assignment nodes.
*/
@SuppressWarnings("serial")
public void testAssignmentNode() {
final AssignmentNode an1 = (AssignmentNode) new Helper() {{
tmp = bind(constantNode(a), varNode(x) );
}}.getTmp();
final AssignmentNode an2 = (AssignmentNode) new Helper() {{
tmp = bind(varNode(y), varNode(x) );
}}.getTmp();
final AssignmentNode an3 = (AssignmentNode) new Helper() {{
tmp =
bind(FunctionNode.AND(
FunctionNode.OR(
FunctionNode.EQ(varNode(x), varNode(y)),
constantNode(z)),
varNode(z)),
varNode(w) );
}}.getTmp();
final Set> requiredBoundAn1 = new HashSet>();
final Set> requiredBoundAn2 =
new HashSet>() {{ add(Var.var("y")); }};
final Set> requiredBoundAn3 =
new HashSet>() {{
add(Var.var("x")); add(Var.var("y")); add(Var.var("z")); }};
final Set> desiredBoundAn1 = new HashSet>();
final Set> desiredBoundAn2 = new HashSet>();
final Set> desiredBoundAn3 = new HashSet>();
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBoundAn1, an1.getRequiredBound(sa));
assertEquals(desiredBoundAn1, an1.getDesiredBound(sa));
assertEquals(requiredBoundAn2, an2.getRequiredBound(sa));
assertEquals(desiredBoundAn2, an2.getDesiredBound(sa));
assertEquals(requiredBoundAn3, an3.getRequiredBound(sa));
assertEquals(desiredBoundAn3, an3.getDesiredBound(sa));
}
/**
* Test interface implementation for assignment nodes.
*/
@SuppressWarnings("serial")
public void testBindingsClause() {
final LinkedHashSet> declaredVars =
new LinkedHashSet>() {{
add(Var.var("x")); add(Var.var("y")); }};
final List bindingSets = new ArrayList() {{
add(new ListBindingSet() {{
set(Var.var("x"), new Constant<>(TermId.mockIV(VTE.URI)));
set(Var.var("y"), new Constant<>(TermId.mockIV(VTE.URI)));
}});
}};
final BindingsClause bc = new BindingsClause(declaredVars, bindingSets);
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
// bindings clauses requires no variables to be bound before, as they
// introduce constant values only; nothing is forbidden and nothing
// desired here...
assertEquals(new HashSet>(), bc.getRequiredBound(sa));
assertEquals(new HashSet>(), bc.getDesiredBound(sa));
}
/**
* Test interface implementation for UNION nodes.
*/
@SuppressWarnings("serial")
public void testUnion() {
final UnionNode un1 = (UnionNode) new Helper(){{
tmp =
unionNode(
joinGroupNode(statementPatternNode(varNode(x),constantNode(c),varNode(y))),
joinGroupNode(bind(varNode(y), varNode(x))));
}}.getTmp();
final UnionNode un2 = (UnionNode) new Helper(){{
tmp =
unionNode(
joinGroupNode(bind(varNode(y), varNode(x))),
joinGroupNode(statementPatternNode(varNode(x),constantNode(c),varNode(y))));
}}.getTmp();
final Set> requiredBound =
new HashSet>() {{ add(Var.var("y")); }};
final Set> desiredBound =
new HashSet>() {{ add(Var.var("x")); add(Var.var("y")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, un1.getRequiredBound(sa));
assertEquals(desiredBound, un1.getDesiredBound(sa));
assertEquals(requiredBound, un2.getRequiredBound(sa));
assertEquals(desiredBound, un2.getDesiredBound(sa));
}
/**
* Test interface implementation for UNION nodes.
*/
@SuppressWarnings("serial")
public void testSubquery() {
final SubqueryRoot subquery = (SubqueryRoot) new Helper() {{
tmp =
selectSubQuery(
projection(bind(varNode(s), varNode(s))),
where(statementPatternNode(varNode(s), constantNode(c), varNode(o)))
);
}}.getTmp();
final QueryRoot query = (QueryRoot) new Helper(){{
tmp =
select(
projection(wildcard()),
where(subquery)
);
}}.getTmp();
final AST2BOpContext context =
new AST2BOpContext(new ASTContainer(query), store);
final StaticAnalysis sa = new StaticAnalysis(query, context);
final Set> requiredBound = new HashSet>();
final Set> desiredBound =
new HashSet>() {{ add(Var.var("s")); }};
assertEquals(requiredBound, subquery.getRequiredBound(sa));
assertEquals(desiredBound, subquery.getDesiredBound(sa));
}
@SuppressWarnings("serial")
public void testNamedSubquery() {
final NamedSubqueryInclude nsi = (NamedSubqueryInclude) new Helper() {{
tmp = namedSubQueryInclude("_set1");
}}.getTmp();
final QueryRoot query = (QueryRoot) new Helper(){{
tmp =
select(
varNodes(x,y,y),
namedSubQuery("_set1",varNode(x),where(statementPatternNode(varNode(x), constantNode(a), constantNode(b),1))),
where(nsi,statementPatternNode(varNode(x), constantNode(c), varNode(y),1,OPTIONAL)
)
);
}}.getTmp();
final AST2BOpContext context =
new AST2BOpContext(new ASTContainer(query), store);
final StaticAnalysis sa = new StaticAnalysis(query, context);
final Set> requiredBound = new HashSet>();
final Set> desiredBound =
new HashSet>() {{ add(Var.var("x")); }};
assertEquals(requiredBound, nsi.getRequiredBound(sa));
assertEquals(desiredBound, nsi.getDesiredBound(sa));
}
/**
* Test interface implementation for ALP nodes.
*/
@SuppressWarnings("serial")
public void testSimpleALPNode() {
final ArbitraryLengthPathNode alpNode =
(ArbitraryLengthPathNode) new Helper() {{
tmp =
arbitartyLengthPropertyPath(
varNode(x),
constantNode(b),
HelperFlag.ZERO_OR_MORE,
joinGroupNode(
statementPatternNode(
leftVar(), constantNode(c), rightVar(), 26)));
}}.getTmp();
final Set> requiredBoundAlpNode = new HashSet>();
final Set> desiredBoundAlpNode =
new HashSet>() {{ add(Var.var("x")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBoundAlpNode, alpNode.getRequiredBound(sa));
assertEquals(desiredBoundAlpNode, alpNode.getDesiredBound(sa));
}
@SuppressWarnings("serial")
public void testComplexALPNode() {
final ArbitraryLengthPathNode alpNode =
(ArbitraryLengthPathNode) new Helper() {{
tmp =
arbitartyLengthPropertyPath(
varNode(x),
constantNode(b),
HelperFlag.ZERO_OR_MORE,
joinGroupNode(
statementPatternNode(leftVar(), constantNode(c), varNode(y)),
statementPatternNode(varNode(y), constantNode(d), rightVar())
));
}}.getTmp();
final Set> requiredBoundAlpNode = new HashSet>();
final Set> desiredBoundAlpNode =
new HashSet>() {{ add(Var.var("x")); add(Var.var("y")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBoundAlpNode, alpNode.getRequiredBound(sa));
assertEquals(desiredBoundAlpNode, alpNode.getDesiredBound(sa));
}
/**
* Test interface implementation for FILTER nodes (simple).
*/
@SuppressWarnings("serial")
public void testFilter() {
final FilterNode fn = (FilterNode) new Helper(){{
tmp =
filter(
FunctionNode.AND(
varNode(w),
FunctionNode.OR(
FunctionNode.EQ(constantNode(w), varNode(y)),
FunctionNode.LT(varNode(x), varNode(z))
)));
}}.getTmp();
final QueryRoot query = new QueryRoot(QueryType.SELECT);
final JoinGroupNode jgn = new JoinGroupNode(fn);
query.setWhereClause(jgn);
final Set> requiredBound =
new HashSet>() {{
add(Var.var("w")); add(Var.var("x"));
add(Var.var("y")); add(Var.var("z")); }};
final Set> desiredBound = new HashSet>();
/**
* We need to convert the filter node. Usually (in the optimization
* chain) this is done through the ASTSetValueExpressionOptimizer.
*/
final AST2BOpContext context =
new AST2BOpContext(new ASTContainer(query), store);
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), context);
final GlobalAnnotations globals =
new GlobalAnnotations(
context.getLexiconNamespace(), context.getTimestamp());
AST2BOpUtility.toVE(getBOpContext(), globals, fn.getValueExpressionNode());
assertEquals(requiredBound, fn.getRequiredBound(sa));
assertEquals(desiredBound, fn.getDesiredBound(sa));
}
/**
* Test interface implementation for FILTER EXISTS and FILTER NOT EXISTS
* nodes.
*/
@SuppressWarnings("serial")
public void testFilterExistsAndNotExists() {
final FilterNode exists =
(FilterNode) new Helper(){{
tmp =
filter(
exists(
varNode(x),
joinGroupNode(
statementPatternNode(
constantNode(a),constantNode(b),varNode(y)),
statementPatternNode(
constantNode(a),constantNode(b),varNode(z)))));
}}.getTmp();
final FilterNode notExists =
(FilterNode) new Helper(){{
tmp =
filter(
exists(
varNode(x),
joinGroupNode(
statementPatternNode(
constantNode(a),constantNode(b),varNode(y)),
statementPatternNode(
constantNode(a),constantNode(b),varNode(z)))));
}}.getTmp();
final QueryRoot query = new QueryRoot(QueryType.SELECT);
final JoinGroupNode jgn = new JoinGroupNode();
jgn.addChild(exists);
jgn.addChild(notExists);
query.setWhereClause(jgn);
final Set> requiredBound =
new HashSet>() {{ add(Var.var("x")); }};
final Set> desiredBound = new HashSet>();
/**
* We need to convert the filter nodes. Usually (in the optimization
* chain) this is done through the ASTSetValueExpressionOptimizer.
*/
final AST2BOpContext context = new AST2BOpContext(
new ASTContainer(query), store);
final StaticAnalysis sa = new StaticAnalysis(new QueryRoot(
QueryType.SELECT), context);
final GlobalAnnotations globals = new GlobalAnnotations(
context.getLexiconNamespace(), context.getTimestamp());
AST2BOpUtility.toVE(getBOpContext(), globals, exists.getValueExpressionNode());
AST2BOpUtility.toVE(getBOpContext(), globals, notExists.getValueExpressionNode());
assertEquals(requiredBound, exists.getRequiredBound(sa));
assertEquals(desiredBound, exists.getDesiredBound(sa));
assertEquals(requiredBound, notExists.getRequiredBound(sa));
assertEquals(desiredBound, notExists.getDesiredBound(sa));
}
/**
* Test interface implementation for simple statement pattern only
* join groups.
*/
@SuppressWarnings("serial")
public void testSimpleJoinGroup() {
final JoinGroupNode jgn =
(JoinGroupNode) new Helper(){{
tmp =
joinGroupNode(
statementPatternNode(varNode(x),constantNode(b),constantNode(c)),
statementPatternNode(constantNode(a),varNode(y),constantNode(c)),
statementPatternNode(constantNode(a),varNode(y),varNode(z),
OPTIONAL /* doesn't change anything here */)
);
}}.getTmp();
final Set> requiredBound = new HashSet>();
final Set> desiredBound =
new HashSet>() {{
add(Var.var("x")); add(Var.var("y")); add(Var.var("z")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, jgn.getRequiredBound(sa));
assertEquals(desiredBound, jgn.getDesiredBound(sa));
}
/**
* Test interface implementation for more complex join groups.
*/
@SuppressWarnings("serial")
public void testComplexJoinGroup01() {
final JoinGroupNode jgn =
(JoinGroupNode) new Helper(){{
tmp =
joinGroupNode(
statementPatternNode(varNode(x),constantNode(b),constantNode(c)),
bind(varNode(y), varNode(x) ),
selectSubQuery(
projection(bind(varNode(z), varNode(z))),
where(statementPatternNode(varNode(z), constantNode(c), varNode(o)))
)
);
}}.getTmp();
final Set> requiredBound =
new HashSet>() {{ add(Var.var("y")); }};
final Set> desiredBound =
new HashSet>() {{ add(Var.var("x")); add(Var.var("z")); }};
// dummy sa object
final StaticAnalysis sa = new StaticAnalysis(new QueryRoot(
QueryType.SELECT), null);
assertEquals(requiredBound, jgn.getRequiredBound(sa));
assertEquals(desiredBound, jgn.getDesiredBound(sa));
}
/**
* Test interface implementation for more complex join groups.
*/
@SuppressWarnings("serial")
public void testComplexJoinGroup02() {
final JoinGroupNode jgn =
(JoinGroupNode) new Helper(){{
tmp =
joinGroupNode(
statementPatternNode(varNode(y),constantNode(b),constantNode(c)),
bind(varNode(y), varNode(x) ),
selectSubQuery(
projection(bind(varNode(z), varNode(z))),
where(statementPatternNode(varNode(z), constantNode(c), varNode(o)))
)
);
}}.getTmp();
final Set> requiredBound =
new HashSet>() {{ add(Var.var("y")); }};
final Set> desiredBound =
new HashSet>() {{ add(Var.var("y")); add(Var.var("z")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, jgn.getRequiredBound(sa));
assertEquals(desiredBound, jgn.getDesiredBound(sa));
}
/**
* Test interface implementation for SPARQL 1.1 SERVICE with constant
* specifying service endpoint.
*/
@SuppressWarnings({ "rawtypes", "serial" })
public void testServiceSparql11Constant() {
final BigdataValueFactory f = store.getValueFactory();
final BigdataURI serviceEndpoint = f.createURI("http://custom.endpoint");
final IV serviceEndpointIV = makeIV(serviceEndpoint);
final BigdataValue[] values = new BigdataValue[] { serviceEndpoint };
store.getLexiconRelation().addTerms(
values, values.length, false/* readOnly */);
final ServiceNode serviceNode =
(ServiceNode) new Helper(){{
tmp =
service(
constantNode(serviceEndpointIV),
joinGroupNode(
statementPatternNode(varNode(x),constantNode(a),varNode(y))));
}}.getTmp();
final Set> requiredBound = new HashSet>();
final Set> desiredBound =
new HashSet>() {{ add(Var.var("x")); add(Var.var("y")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, serviceNode.getRequiredBound(sa));
assertEquals(desiredBound, serviceNode.getDesiredBound(sa));
}
/**
* Test interface implementation for SPARQL 1.1 SERVICE with variable
* specifying service endpoint.
*/
@SuppressWarnings("serial")
public void testServiceSparql11Variable() {
final ServiceNode serviceNode =
(ServiceNode) new Helper(){{
tmp =
service(varNode(z),
joinGroupNode(
statementPatternNode(varNode(x),constantNode(a),varNode(y))));
}}.getTmp();
final Set> requiredBound =
new HashSet>() {{ add(Var.var("z")); }};
final Set> desiredBound =
new HashSet>() {{ add(Var.var("x")); add(Var.var("y")); }};
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, serviceNode.getRequiredBound(sa));
assertEquals(desiredBound, serviceNode.getDesiredBound(sa));
}
/**
* Test interface implementation for internal {@link BDS} service. Note
* that, at the time being, the BDS service does not allow the injection
* of variables (in contrast to, e.g., the FTS service). Therefore, this
* service imposes only a not bound constraint on the outgoing variable.
*/
public void testServiceBDS() {
final BigdataValueFactory f = store.getValueFactory();
final BigdataURI bdsSearch = f.createURI(BDS.NAMESPACE + "search");
final BigdataURI predSearch = f.createURI(BDS.SEARCH.toString());
final BigdataURI predSearchTimeout = f.createURI(BDS.SEARCH_TIMEOUT.toString());
final BigdataURI predMatchExact = f.createURI(BDS.MATCH_EXACT.toString());
final BigdataValue[] values =
new BigdataValue[] { bdsSearch, predSearch, predSearchTimeout, predMatchExact };
store.getLexiconRelation().addTerms(values, values.length, false/* readOnly */);
final ServiceNode serviceNode =
(ServiceNode) new Helper(){{
tmp =
service(
constantNode(makeIV(bdsSearch)),
joinGroupNode(
statementPatternNode(varNode("res"), constantNode(makeIV(predSearch)), constantNode("search")),
statementPatternNode(varNode("res"), constantNode(makeIV(predSearchTimeout)), constantNode("1000")),
statementPatternNode(varNode("res"), constantNode(makeIV(predMatchExact)), constantNode("false"))));
}}.getTmp();
final Set> requiredBound = new HashSet>();
final Set> desiredBound = new HashSet>();
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, serviceNode.getRequiredBound(sa));
assertEquals(desiredBound, serviceNode.getDesiredBound(sa));
}
/**
* Test interface implementation for internal {@link FTS} service.
*/
@SuppressWarnings("serial")
public void testServiceFTS() {
final BigdataValueFactory f = store.getValueFactory();
final BigdataURI ftsSearch = f.createURI(FTS.NAMESPACE + "search");
final BigdataURI predSearch = f.createURI(FTS.SEARCH.toString());
final BigdataURI predEndpoint = f.createURI(FTS.ENDPOINT.toString());
final BigdataURI predEndpointType = f.createURI(FTS.ENDPOINT_TYPE.toString());
final BigdataURI predParams = f.createURI(FTS.PARAMS.toString());
final BigdataURI predScore = f.createURI(FTS.SCORE.toString());
final BigdataURI predScoreField = f.createURI(FTS.SCORE_FIELD.toString());
final BigdataURI predSearchField = f.createURI(FTS.SEARCH_FIELD.toString());
final BigdataURI predSnippet = f.createURI(FTS.SNIPPET.toString());
final BigdataURI predSnippetField = f.createURI(FTS.SNIPPET_FIELD.toString());
final BigdataURI predTimeout = f.createURI(FTS.TIMEOUT.toString());
final BigdataURI predSearchResultType = f.createURI(FTS.SEARCH_RESULT_TYPE.toString());
final BigdataValue[] values =
new BigdataValue[] {
ftsSearch, predSearch, predEndpoint, predEndpointType, predParams,
predScore, predScoreField, predSearchField, predSnippet,
predSnippetField, predTimeout, predSearchResultType };
store.getLexiconRelation().addTerms(values, values.length, false/* readOnly */);
final ServiceNode serviceNode = (ServiceNode) new Helper(){{
tmp =
service(
constantNode(makeIV(ftsSearch)),
joinGroupNode(
statementPatternNode(varNode("res"), constantNode(makeIV(predSearch)), varNode("search")),
statementPatternNode(varNode("res"), constantNode(makeIV(predEndpoint)), varNode("endpoint")),
statementPatternNode(varNode("res"), constantNode(makeIV(predEndpointType)), varNode("endpointType")),
statementPatternNode(varNode("res"), constantNode(makeIV(predParams)), varNode("params")),
statementPatternNode(varNode("res"), constantNode(makeIV(predScore)), varNode("score")),
statementPatternNode(varNode("res"), constantNode(makeIV(predScoreField)), varNode("scoreField")),
statementPatternNode(varNode("res"), constantNode(makeIV(predSearchField)), varNode("searchField")),
statementPatternNode(varNode("res"), constantNode(makeIV(predSnippet)), varNode("snippet")),
statementPatternNode(varNode("res"), constantNode(makeIV(predSnippetField)), varNode("snippetField")),
statementPatternNode(varNode("res"), constantNode(makeIV(predTimeout)), varNode("timeout")),
statementPatternNode(varNode("res"), constantNode(makeIV(predSearchResultType)), varNode("searchResultType"))));
}}.getTmp();
final Set> requiredBound = new HashSet>() {{
add(Var.var("search"));
add(Var.var("endpoint"));
add(Var.var("endpointType"));
add(Var.var("params"));
add(Var.var("scoreField"));
add(Var.var("searchField"));
add(Var.var("snippetField"));
add(Var.var("timeout"));
add(Var.var("searchResultType"));
}};
final Set> desiredBound = new HashSet>();
// dummy sa object
final StaticAnalysis sa =
new StaticAnalysis(new QueryRoot(QueryType.SELECT), null);
assertEquals(requiredBound, serviceNode.getRequiredBound(sa));
assertEquals(desiredBound, serviceNode.getDesiredBound(sa));
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy