org.ihtsdo.otf.refset.graph.gao.SearchGao.java Source code

Java tutorial

Introduction

Here is the source code for org.ihtsdo.otf.refset.graph.gao.SearchGao.java

Source

/**
* Copyright 2014 IHTSDO
* 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.ihtsdo.otf.refset.graph.gao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;

import org.ihtsdo.otf.refset.domain.SearchResult;
import org.ihtsdo.otf.refset.graph.RefsetGraphAccessException;
import org.ihtsdo.otf.refset.graph.RefsetGraphFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.databind.JsonNode;

/**class retrieves search results for given text search criteria. At the moment it is very basic but after demo it will be replaced 
 * by code using either elastic search java client or spring-es  
 *
 */
@Repository
public class SearchGao {

    private static final Logger LOGGER = LoggerFactory.getLogger(SearchGao.class);
    private static final String QUERY = "/refset/Member/_search?q=referenceComponentId,title %s&from=%s&size=%s";
    private RefsetGraphFactory f;
    private String url;
    private RestTemplate rt;

    @Resource(name = "searchServerUrl")
    public void setUrl(String url) {

        this.url = url;
    }

    /**
     * @param rt the rt to set
     */
    @Resource(name = "refset.auth.RestTemplate")
    public void setRt(RestTemplate rt) {
        this.rt = rt;
    }

    /**
     * @param factory the factory to set
     */
    @Resource(name = "refsetGraphFactory")
    public void setFactory(RefsetGraphFactory factory) {

        this.f = factory;
    }

    /**
     * @param refsetId
     * @param from
     * @param to
     * @return
     * @throws RefsetGraphAccessException
     */
    public SearchResult<String> getSearchResult(String query, Integer from, Integer to)
            throws RefsetGraphAccessException {

        SearchResult<String> result = new SearchResult<String>();

        //TitanGraph g = null;

        try {

            //g = f.getReadOnlyGraph();
            String queryString = String.format(url + QUERY, query, from, to - from);
            LOGGER.debug("Getting getting search result for {}", queryString);

            JsonNode response = rt.getForObject(queryString, JsonNode.class);

            LOGGER.debug("search service call successfully returned with {} ", response);

            Iterator<String> fields = response.fieldNames();
            while (fields.hasNext()) {
                String field = fields.next();
                if ("took".equalsIgnoreCase(field)) {

                    result.setTime(response.get(field).asInt());
                }

                if ("hits".equalsIgnoreCase(field)) {

                    Iterator<String> hitsFields = response.get(field).fieldNames();

                    while (hitsFields.hasNext()) {

                        String hitsField = hitsFields.next();

                        if ("total".equalsIgnoreCase(hitsField)) {

                            result.setTotalNoOfResults(response.get(field).get(hitsField).asInt());
                        }

                        if ("hits".equalsIgnoreCase(hitsField)) {

                            Iterator<JsonNode> source = response.get(field).get(hitsField).elements();
                            List<String> r = new ArrayList<String>();

                            while (source.hasNext()) {

                                String uuid = source.next().at("/_source/parentId").asText();
                                if (!StringUtils.isEmpty(uuid) && !r.contains(uuid)) {

                                    r.add(uuid);
                                }

                            }

                            //for now override total with number of records.TODO need something else 
                            result.setTotalNoOfResults(r.size());
                            result.setRecords(r);

                        }

                    }
                }

            }

        } catch (Exception e) {

            //RefsetGraphFactory.rollback(g);         
            LOGGER.error("Error getting refsets member history", e);
            throw new RefsetGraphAccessException(e.getMessage(), e);

        }

        return result;
    }

}