/** * Copyright 2014 National University of Ireland, Galway. * * This file is part of the SIREn project. Project and contact information: * * https://github.com/rdelbru/SIREn * * Licensed 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.sindice.siren.demo.ncpr; import java.io.IOException; import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.flexible.core.QueryNodeException; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.codehaus.jackson.JsonProcessingException; import org.sindice.siren.qparser.json.dsl.QueryBuilder; import org.sindice.siren.qparser.json.dsl.TwigQuery; import org.sindice.siren.search.node.NodeTermQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class executes various queries, each one showing a particular feature * available in SIREn. */ public class NCPRQuery { /** * URL of SIREn index */ private final String INDEX_URL = "http://localhost:8983/solr/"; private final SolrServer server; private static final Logger logger = LoggerFactory.getLogger(NCPRQuery.class); public NCPRQuery() { this.server = new HttpSolrServer(INDEX_URL); } public void execute() throws SolrServerException, QueryNodeException { this.query(this.getGeoQuery()); this.query(this.getOutputCurrentQuery()); this.query(this.getAccessible24Hours()); this.query(this.getWebsiteQuery()); this.query(this.getDeviceControllerFacet()); this.query(this.getNestedQuery()); this.query(this.getJsonQuery()); } public void query(final SolrQuery query) throws SolrServerException { final QueryResponse rsp = this.server.query(query); logger.info("Query: {}", query.getQuery()); logger.info("Hits: {}", rsp.getResults().getNumFound()); logger.info("Execution time: {} ms", rsp.getQTime()); logger.info(rsp.toString()); } /** * A query that shows how to use a custom datatype (uri) */ private SolrQuery getWebsiteQuery() { final SolrQuery query = new SolrQuery(); query.setQuery("DeviceOwner : { Website : uri(www.sourcelondon.net) }"); return query; } /** * A query that shows how to use range query on geo-location data (double) */ private SolrQuery getGeoQuery() { final SolrQuery query = new SolrQuery(); query.setQuery("ChargeDeviceLocation : { " + "Latitude : xsd:double([52 TO 53]), " + "Longitude : xsd:double([-2 TO 2]) " + "}"); return query; } /** * A query that shows how to use range query on long numeric value */ private SolrQuery getOutputCurrentQuery() { final SolrQuery query = new SolrQuery(); query.setQuery("(ChargeDeviceLocation : { " + "Latitude : xsd:double([52 TO 53]), " + "Longitude : xsd:double([-2 TO 2]) " + "}) AND " + "(Connector : [ { RatedOutputCurrent : xsd:long([32 TO *]) } ])"); return query; } /** * A query that shows how to combine range and textual queries */ private SolrQuery getAccessible24Hours() { final SolrQuery query = new SolrQuery(); query.setQuery("(ChargeDeviceLocation : { " + "Latitude : xsd:double([52 TO 53]), " + "Longitude : xsd:double([-2 TO 2]) " + "}) " + "AND " + "(Connector : [ { RatedOutputCurrent : xsd:long([32 TO *]) } ]) " + "AND " + "(Accessible24Hours : true)"); return query; } /** * A query that shows how to combine SIREn query with the Solr's facet feature * on a Solr field. */ private SolrQuery getDeviceControllerFacet() { final SolrQuery query = new SolrQuery(); query.setQuery("Connector : [ { RatedOutputCurrent : xsd:long([32 TO *]) } ]"); query.addFacetField("DeviceController_facet"); return query; } /** * A query that shows how to use the nested query parameter to use Solr's * query parsers on Solr's fields. */ private SolrQuery getNestedQuery() { final SolrQuery query = new SolrQuery(); query.setQuery("DeviceOwner : { Website : uri(www.sourcelondon.net) }"); query.setParam("nested", "{!lucene} name:university"); return query; } /** * A query that shows how to build programatically a query for the JSON * query parser. */ private SolrQuery getJsonQuery() throws QueryNodeException { final SolrQuery query = new SolrQuery(); query.setRequestHandler("json"); // Use the SIREn core API for building query expressions. final NodeTermQuery uri = new NodeTermQuery(new Term("", "www.sourcelondon.net")); uri.setDatatype("uri"); final NodeTermQuery website = new NodeTermQuery(new Term("", "Website")); website.setDatatype("json:field"); final NodeTermQuery owner = new NodeTermQuery(new Term("", "DeviceOwner")); owner.setDatatype("json:field"); // Use the query builder to create twig query using the JSON query syntax. final QueryBuilder builder = new QueryBuilder(); final TwigQuery twq = builder.newTwig(owner.toString("json")) .with( builder.newTwig(website.toString("json")) .with(builder.newNode(uri.toString("json"))), 2); query.setQuery(twq.toString()); return query; } public void close() { this.server.shutdown(); } public static void main(final String[] args) throws JsonProcessingException, IOException, SolrServerException, QueryNodeException { final NCPRQuery queryer = new NCPRQuery(); try { queryer.execute(); } finally { queryer.close(); } } }