Package org.sindice.siren.demo.ncpr

Source Code of org.sindice.siren.demo.ncpr.NCPRQuery

/**
* 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();
    }
  }

}
TOP

Related Classes of org.sindice.siren.demo.ncpr.NCPRQuery

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.