/*
 * Copyright 2008-2013 Microarray Informatics Team, EMBL-European Bioinformatics Institute
 *
 * 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.
 *
 *
 * For further details of the Gene Expression Atlas project, including source code,
 * downloads and documentation, please see:
 *
 * http://gxa.github.com/gxa
 */

package uk.ac.ebi.atlas.solr.query.builders;

import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;

/**
 * This is a builder, keep always in mind that builders are potentially stateful.
 * If you need to build different query strings within the same client process
 * you must use a new instance of builder for each query.
 */
public class BioentityIdentifierQueryBuilder extends SolrQueryBuilder<BioentityIdentifierQueryBuilder>{
    private static final Logger LOGGER = Logger.getLogger(BioentityIdentifierQueryBuilder.class);

    public static final String BIOENTITY_IDENTIFIER_FIELD = "bioentity_identifier";
    public static final String PROPERTY_SEARCH_FIELD = "property_value_search";
    public static final String PROPERTY_LOWER_FIELD = "property_value_lower";
    private static final int MAX_GENE_IDS_TO_FETCH = 1000000;

    private boolean applyOrOnQueryStringContent;
    private String queryString;
    private String propertyName = PROPERTY_LOWER_FIELD; //by default we want exact match

    public BioentityIdentifierQueryBuilder withExactMatch(boolean exactMatch){
        propertyName = exactMatch ? PROPERTY_LOWER_FIELD : PROPERTY_SEARCH_FIELD;
        return this;
    }

    public BioentityIdentifierQueryBuilder forQueryString(String queryString, boolean applyOrOnQueryStringContent){
        this.queryString = queryString.replace(":", "\\:");
        this.applyOrOnQueryStringContent = applyOrOnQueryStringContent;
        return this;
    }

    public SolrQuery build() {

        StringBuilder queryConditionBuilder = new StringBuilder(propertyName).append(":");

        if (applyOrOnQueryStringContent){
            queryConditionBuilder.insert(0, "{!lucene q.op=OR df=" + propertyName + "}(").append(queryString).append(")");
        } else {
            queryConditionBuilder.append("\"").append(queryString).append("\"");
        }

        queryStringBuilder.insert(0, queryConditionBuilder);

        SolrQuery solrQuery = buildQueryObject(queryStringBuilder.toString());

        return solrQuery;
    }

    private SolrQuery buildQueryObject(String queryString) {

        SolrQuery solrQuery = new SolrQuery(queryString);
        solrQuery.setFields(BIOENTITY_IDENTIFIER_FIELD);
        solrQuery.setParam("group", true);
        solrQuery.setParam("group.field", BIOENTITY_IDENTIFIER_FIELD);
        solrQuery.setParam("group.main", true);
        solrQuery.setRows(MAX_GENE_IDS_TO_FETCH);

        LOGGER.debug("<buildQueryObject> solr query: " + solrQuery.toString());

        return solrQuery;
    }

    @Override
    protected BioentityIdentifierQueryBuilder getThis() {
        return this;
    }
}

@@ -2467,32 +2467,140 @@
 StringContent)%7B%0A
+            // use default %22lucene%22 parser and set default operator to OR and default field to propertyName%0A
             quer

add comments