use of com.bigdata.rdf.sparql.ast.JoinGroupNode in project wikidata-query-rdf by wikimedia.
the class EmptyLabelServiceOptimizer method optimizeJoinGroup.
@Override
protected void optimizeJoinGroup(AST2BOpContext ctx, StaticAnalysis sa, IBindingSet[] bSets, JoinGroupNode op) {
final QueryRoot root = sa.getQueryRoot();
if (root.getQueryType() == QueryType.ASK) {
return;
}
if (root.getWhereClause() == op) {
op.setProperty(LABEL_SERVICE_PROJECTION, root.getProjection());
}
op.getChildren(SubqueryBase.class).forEach(node -> {
if (node.getWhereClause() != null) {
BOp whereClause = node.getWhereClause();
whereClause.setProperty(LABEL_SERVICE_PROJECTION, node.getProjection());
}
});
// Prepare a set of vars, which might be bound both outside of the service and by LabelService
// Fix for the issue: https://phabricator.wikimedia.org/T159723
// See also patch for the com.bigdata.rdf.sparql.ast.eval.AST2BOpUtility.addServiceCall()
Set<IVariable<?>> uncertainVars = collectUncertainVars(sa, bSets, op);
getLabelServiceNodes(op).forEach(service -> {
service.setUncertainVars(uncertainVars);
JoinGroupNode g = (JoinGroupNode) service.getGraphPattern();
boolean foundArg = false;
for (BOp st : g.args()) {
StatementPatternNode sn = (StatementPatternNode) st;
if (sn.s().isConstant() && BD.SERVICE_PARAM.equals(sn.s().getValue())) {
continue;
}
foundArg = true;
break;
}
if (restoreExtracted(service)) {
foundArg = true;
}
if (!foundArg) {
addResolutions(ctx, g, getProjectionNode(service));
}
});
}
use of com.bigdata.rdf.sparql.ast.JoinGroupNode in project wikidata-query-rdf by wikimedia.
the class GeoAroundService method buildServiceNode.
@Override
protected JoinGroupNode buildServiceNode(ServiceCallCreateParams params, ServiceParams serviceParams) {
final AbstractTripleStore store = params.getTripleStore();
final Vocabulary voc = store.getVocabulary();
BigdataValueFactory vf = store.getValueFactory();
final StatementPatternNode pattern = getPatternNode(params);
final TermNode searchVar = pattern.s();
final TermNode predicate = pattern.p();
final TermNode locationVar = pattern.o();
final JoinGroupNode newGroup = new JoinGroupNode();
// ?var geo:search "inCircle" .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SEARCH)), new DummyConstantNode(vf.createLiteral(GeoFunction.IN_CIRCLE.toString()))));
// ?var geo:predicate wdt:P625 .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.PREDICATE)), predicate));
// ?var geo:searchDatatype ogc:wktLiteral .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SEARCH_DATATYPE)), new ConstantNode(voc.getConstant(new URIImpl(GeoSparql.WKT_LITERAL)))));
// ?var geo:spatialCircleCenter ?parisLoc .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_CIRCLE_CENTER)), getParam(serviceParams, CENTER_PARAM)));
// ?var geo:spatialCircleRadius "1" .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_CIRCLE_RADIUS)), getParam(serviceParams, RADIUS_PARAM)));
// ?var geo:locationValue ?location .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.LOCATION_VALUE)), locationVar));
// ?var geo:coordSystem "0" .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.COORD_SYSTEM)), getGlobeNode(vf, serviceParams)));
final TermNode distance = serviceParams.get(DISTANCE_PARAM, null);
if (distance != null) {
// ?var geo:distanceValue ?distance .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.DISTANCE_VALUE)), distance));
}
return newGroup;
}
use of com.bigdata.rdf.sparql.ast.JoinGroupNode in project wikidata-query-rdf by wikimedia.
the class GeoService method create.
@Override
public BigdataServiceCall create(ServiceCallCreateParams params, ServiceParams serviceParams) {
if (params == null)
throw new IllegalArgumentException();
final JoinGroupNode newGroup = buildServiceNode(params, serviceParams);
final BigdataValueFactory vf = params.getTripleStore().getValueFactory();
ServiceNode newServiceNode = new ServiceNode(new DummyConstantNode(vf.asValue(GeoSpatial.SEARCH)), newGroup);
// Transfer hints
newServiceNode.setQueryHints(params.getServiceNode().getQueryHints());
// Call delegate service
HttpClient client = params.getClientConnectionManager();
return (BigdataServiceCall) ServiceRegistry.getInstance().toServiceCall(params.getTripleStore(), client, GeoSpatial.SEARCH, newServiceNode, params.getStats());
}
use of com.bigdata.rdf.sparql.ast.JoinGroupNode in project wikidata-query-rdf by wikimedia.
the class LabelServiceUnitTest method desiredVars.
@SuppressWarnings("unchecked")
@Test
public void desiredVars() {
JoinGroupNode patterns = new JoinGroupNode();
// Label
patterns.addArg(new StatementPatternNode(new VarNode("item"), createURI(RDFS.LABEL), new VarNode("itemLabel")));
// Description
patterns.addArg(new StatementPatternNode(new VarNode("item2"), createURI(SchemaDotOrg.DESCRIPTION), new VarNode("itemDesc")));
// Fixed name
patterns.addArg(new StatementPatternNode(createURI(uris().entityIdToURI("Q123")), createURI(RDFS.LABEL), new VarNode("qLabel")));
// Parameters
patterns.addArg(new StatementPatternNode(createURI(BD.SERVICE_PARAM), createURI(LabelService.LANGUAGE_PARAM), createConstant("en,fr")));
ServiceNode serviceNode = new ServiceNode(createURI(LabelService.SERVICE_KEY), patterns);
final LabelService service = new LabelService();
Set<IVariable<?>> vars = service.getDesiredBound(serviceNode);
assertThat(vars, hasSize(2));
assertThat(vars, hasItems(equalTo(Var.var("item")), equalTo(Var.var("item2"))));
}
use of com.bigdata.rdf.sparql.ast.JoinGroupNode in project wikidata-query-rdf by wikimedia.
the class ApiTemplateUnitTest method testServiceOutput.
@Test
public void testServiceOutput() throws Exception {
JsonNode json = parseJson(JSON_CONFIG);
ApiTemplate template = ApiTemplate.fromJSON(json);
assertThat(template.getItemsPath(), equalTo("/api/query/pages/page/categories/cl"));
JoinGroupNode patterns = new JoinGroupNode();
// predefined variable
patterns.addArg(new StatementPatternNode(new VarNode("somevar"), createURI(ApiTemplate.OutputVariable.Type.STRING.predicate()), createURI(paramNameToURI("category"))));
// User-defined variable
patterns.addArg(new StatementPatternNode(new VarNode("var2"), createURI(ApiTemplate.OutputVariable.Type.URI.predicate()), createConstant("@somedata")));
// User-defined path variable
patterns.addArg(new StatementPatternNode(new VarNode("var3"), createURI(ApiTemplate.OutputVariable.Type.ITEM.predicate()), createConstant("item/@wikibase_id")));
// Variable with ordinal
patterns.addArg(new StatementPatternNode(new VarNode("var4"), createURI(ApiTemplate.OutputVariable.Type.ORDINAL.predicate()), createConstant("goat")));
ServiceNode serviceNode = new ServiceNode(createConstant("test"), patterns);
List<OutputVariable> outputs = template.getOutputVars(serviceNode);
assertThat(outputs.size(), equalTo(4));
// Pre-defined variable
OutputVariable var = outputs.get(0);
assertThat(var.getName(), equalTo("somevar"));
assertThat(var.getPath(), equalTo("@title"));
assertFalse(var.isOrdinal());
// User-defined variable
var = outputs.get(1);
assertThat(var.getName(), equalTo("var2"));
assertThat(var.getPath(), equalTo("@somedata"));
assertTrue(var.isURI());
assertFalse(var.isOrdinal());
assertThat(var.getURI("http://test.com/"), instanceOf(URI.class));
// URI keeps the case
assertThat(var.getURI("http://test.com/test").toString(), endsWith("test"));
// User-defined variable which is an item
var = outputs.get(2);
assertThat(var.getName(), equalTo("var3"));
assertThat(var.getPath(), equalTo("item/@wikibase_id"));
assertTrue(var.isURI());
assertFalse(var.isOrdinal());
assertThat(var.getURI("test"), instanceOf(URI.class));
// T172642: Item URIs will be uppercased
assertThat(var.getURI("test").toString(), endsWith("TEST"));
// Ordinal
var = outputs.get(3);
assertThat(var.getName(), equalTo("var4"));
assertThat(var.getPath(), equalTo("."));
assertFalse(var.isURI());
assertTrue(var.isOrdinal());
}
Aggregations