use of com.bigdata.rdf.sparql.ast.TermNode in project wikidata-query-rdf by wikimedia.
the class GeoBoxService 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 "inRectangle" .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SEARCH)), new DummyConstantNode(vf.createLiteral(GeoFunction.IN_RECTANGLE.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)))));
if (serviceParams.contains(NE_PARAM)) {
// ?var geo:spatialRectangleNorthEast ?ne .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_NORTH_EAST)), getParam(serviceParams, NE_PARAM)));
// ?var geo:spatialRectangleNorthEast ?sw .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_SOUTH_WEST)), getParam(serviceParams, SW_PARAM)));
} else if (serviceParams.contains(EAST_PARAM)) {
final TermNode east = getParam(serviceParams, EAST_PARAM);
final TermNode west = getParam(serviceParams, WEST_PARAM);
if (east instanceof ConstantNode && west instanceof ConstantNode) {
// Easy case - both constants
final WikibasePoint eastWP = pointFromIV(((ConstantNode) east).getValue().getIV());
final WikibasePoint westWP = pointFromIV(((ConstantNode) west).getValue().getIV());
final GeoUtils.Box box = new GeoUtils.Box(eastWP, westWP);
TermNode ne;
TermNode sw;
if (box.switched()) {
ne = new DummyConstantNode(vf.asValue(vf.createLiteral(box.northEast().toString(), new URIImpl(GeoSparql.WKT_LITERAL))));
sw = new DummyConstantNode(vf.asValue(vf.createLiteral(box.southWest().toString(), new URIImpl(GeoSparql.WKT_LITERAL))));
} else {
ne = east;
sw = west;
}
// ?var geo:spatialRectangleNorthEast ?ne .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_NORTH_EAST)), ne));
// ?var geo:spatialRectangleNorthEast ?sw .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_SOUTH_WEST)), sw));
} else {
// Hard case - non-constants
// Add dummy var to the node
serviceParams.add(WRAP_PARAM, VarNode.freshVarNode());
// ?var geo:spatialRectangleNorthEast ?ne .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_NORTH_EAST)), getSubstituteVar(east)));
// ?var geo:spatialRectangleNorthEast ?sw .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.SPATIAL_RECTANGLE_SOUTH_WEST)), getSubstituteVar(west)));
}
} else {
throw new IllegalArgumentException("Box corner parameters are required");
}
// ?var geo:locationValue ?location .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.LOCATION_VALUE)), locationVar));
// ?var geo:coordSystem "2" .
newGroup.addArg(new StatementPatternNode(searchVar, new DummyConstantNode(vf.asValue(GeoSpatial.COORD_SYSTEM)), getGlobeNode(vf, serviceParams)));
return newGroup;
}
use of com.bigdata.rdf.sparql.ast.TermNode in project wikidata-query-rdf by wikimedia.
the class MWApiServiceFactory method getServiceHost.
/**
* Get service host and check if it's valid.
* @return Service endpoint.
* @throws MalformedURLException on bad URL
*/
private Endpoint getServiceHost(final ServiceParams serviceParams) throws MalformedURLException {
TermNode hostNode = serviceParams.get(ENDPOINT_KEY, null);
requireNonNull(hostNode, "Service name (wikibase:endpoint) should be supplied");
serviceParams.clear(ENDPOINT_KEY);
return Endpoint.create(hostNode.getValueExpression(), config);
}
use of com.bigdata.rdf.sparql.ast.TermNode in project wikidata-query-rdf by wikimedia.
the class GeoService method getGlobeNode.
/**
* Create globe node with appropriate value for coordSystem.
*/
protected TermNode getGlobeNode(BigdataValueFactory vf, ServiceParams serviceParams) {
final TermNode globeNode = serviceParams.get(GLOBE_PARAM, null);
if (globeNode == null) {
return new DummyConstantNode(vf.createLiteral(WKTSerializer.NO_GLOBE));
}
if (!globeNode.isConstant()) {
// FIXME: add support for this
throw new IllegalArgumentException("Non-constant globe value is not supported yet.");
}
BigdataValue v = globeNode.getValue();
if (v instanceof BigdataURI) {
WKTSerializer ser = new WKTSerializer();
try {
return new DummyConstantNode(vf.createLiteral(ser.trimCoordURI(v.stringValue())));
} catch (GeoSpatialSearchException e) {
// Unexpectedly wrong URI - still pass it along
return globeNode;
}
}
return globeNode;
}
Aggregations