framework.retrieval.engine.query.item.QueryItem.java Source code

Java tutorial

Introduction

Here is the source code for framework.retrieval.engine.query.item.QueryItem.java

Source

/**
 * Copyright 2010 
 *
 * 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 framework.retrieval.engine.query.item;

import java.io.Serializable;

import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;

import framework.base.snoic.base.util.StringClass;
import framework.retrieval.engine.RetrievalType;
import framework.retrieval.engine.analyzer.IRAnalyzerFactory;
import framework.retrieval.engine.query.RetrievalQueryException;

/**
 * QueryItem
 * @author 
 *
 */
public class QueryItem implements Serializable {
    private static final long serialVersionUID = -2389520247054981268L;

    public static final BooleanClause.Occur MUST = BooleanClause.Occur.MUST;
    public static final BooleanClause.Occur SHOULD = BooleanClause.Occur.SHOULD;
    public static final BooleanClause.Occur MUST_NOT = BooleanClause.Occur.MUST_NOT;

    private RetrievalType.RDocItemType docItemType = RetrievalType.RDocItemType.CONTENT;
    private String name = null;
    private String value = null;
    private boolean regex = false;

    private Query query = null;
    private QueryWrap queryWrap = null;
    private IRAnalyzerFactory analyzerFactory = null;

    /**
     * 
     * @param analyzerFactory      ?
     * @param docItemType      
     * @param name            ??
     * @param keyWord            
     */
    public QueryItem(IRAnalyzerFactory analyzerFactory, RetrievalType.RDocItemType docItemType, Object name,
            String keyWord) {
        this.analyzerFactory = analyzerFactory;
        this.docItemType = docItemType;
        this.name = StringClass.getString(name).toUpperCase();
        this.value = keyWord;
        query = createQuery(docItemType, this.name, keyWord, false);
    }

    public QueryItem(IRAnalyzerFactory analyzerFactory, RetrievalType.RDocItemType docItemType, Object name,
            String keyWord, Float score) {
        this.analyzerFactory = analyzerFactory;
        this.docItemType = docItemType;
        this.name = StringClass.getString(name).toUpperCase();
        this.value = keyWord;
        query = createQuery(docItemType, this.name, keyWord, false, score);
    }

    /**
     * 
     * @param analyzerFactory      ?
     * @param docItemType      
     * @param name            ??
     * @param keyWord            
     * @param regex            ??
     */
    public QueryItem(IRAnalyzerFactory analyzerFactory, RetrievalType.RDocItemType docItemType, Object name,
            String keyWord, boolean regex) {
        this.analyzerFactory = analyzerFactory;
        this.docItemType = docItemType;
        this.name = StringClass.getString(name).toUpperCase();
        this.value = keyWord;
        this.regex = regex;
        query = createQuery(docItemType, this.name, keyWord, this.regex);
    }

    /**
     * ?
     * @return
     */
    public RetrievalType.RDocItemType getDocItemType() {
        return docItemType;
    }

    /**
     * ???
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * ?
     * @return
     */
    public String getValue() {
        return value;
    }

    /**
     * ??
     * @return
     */
    public boolean isRegex() {
        return regex;
    }

    /**
     * ?QueryWrap
     * @return
     */
    public QueryWrap getQueryWrap() {
        synchronized (this) {
            if (queryWrap == null) {
                queryWrap = new QueryWrap(this, query);
            }
        }
        return queryWrap;
    }

    /**
     * OR?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem should(QueryItem queryItem) {
        if (!(this.query instanceof BooleanQuery)) {
            throw new RetrievalQueryException(
                    "QueryItem public QueryItem should(BooleanClause.Occur occur,QueryItem queryItem) ");
        }
        Query theQuery = queryItem.getQueryWrap().getQuery();
        BooleanQuery query = new BooleanQuery();
        query.add(this.query, QueryItem.MUST);
        query.add(theQuery, QueryItem.SHOULD);
        this.query = query;
        return this;
    }

    /**
     * OR?
     * @param occur      ?QueryItem?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem should(BooleanClause.Occur occur, QueryItem queryItem) {

        Query theQuery = queryItem.getQueryWrap().getQuery();

        BooleanQuery query = new BooleanQuery();
        query.add(this.query, occur);
        query.add(theQuery, QueryItem.SHOULD);
        this.query = query;

        return this;
    }

    /**
     * AND?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem must(QueryItem queryItem) {
        if (!(this.query instanceof BooleanQuery)) {
            throw new RetrievalQueryException(
                    "QueryItem public QueryItem should(BooleanClause.Occur occur,QueryItem queryItem) ");
        }

        Query theQuery = queryItem.getQueryWrap().getQuery();

        BooleanQuery query = new BooleanQuery();
        query.add(this.query, MUST);
        query.add(theQuery, QueryItem.MUST);
        this.query = query;

        return this;
    }

    /**
     * AND?
     * @param occur      ?QueryItem?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem must(BooleanClause.Occur occur, QueryItem queryItem) {

        Query theQuery = queryItem.getQueryWrap().getQuery();

        BooleanQuery query = new BooleanQuery();
        query.add(this.query, occur);
        query.add(theQuery, QueryItem.MUST);
        this.query = query;

        return this;
    }

    /**
     * NOT?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem mustNot(QueryItem queryItem) {
        if (!(this.query instanceof BooleanQuery)) {
            throw new RetrievalQueryException(
                    "QueryItem public QueryItem should(BooleanClause.Occur occur,QueryItem queryItem) ");
        }

        Query theQuery = queryItem.getQueryWrap().getQuery();

        BooleanQuery query = new BooleanQuery();
        query.add(this.query, QueryItem.MUST);
        query.add(theQuery, QueryItem.MUST_NOT);
        this.query = query;

        return this;
    }

    /**
     * NOT?
     * @param occur      ?QueryItem?
     * @param queryItem   ?QueryItem
     * @return
     */
    public QueryItem mustNot(BooleanClause.Occur occur, QueryItem queryItem) {

        Query theQuery = queryItem.getQueryWrap().getQuery();

        BooleanQuery query = new BooleanQuery();
        query.add(this.query, occur);
        query.add(theQuery, QueryItem.MUST_NOT);
        this.query = query;

        return this;
    }

    /**
     * Query
     * @param docItemType
     * @param name
     * @param keyWord
     * @param regex
     * @return
     */
    private Query createQuery(RetrievalType.RDocItemType docItemType, String name, String keyWord, boolean regex) {
        return createQuery(docItemType, name, keyWord, regex, null);
    }

    private Query createQuery(RetrievalType.RDocItemType docItemType, String name, String keyWord, boolean regex,
            Float score) {
        Query query = null;
        if (regex) {
            query = new WildcardQuery(new Term(name, keyWord));
        } else {
            if (docItemType == RetrievalType.RDocItemType.KEYWORD || docItemType == RetrievalType.RDocItemType.DATE
                    || docItemType == RetrievalType.RDocItemType.NUMBER) {
                query = new TermQuery(new Term(name, keyWord));
                if (score != null)
                    query.setBoost(score);
            } else if (docItemType == RetrievalType.RDocItemType.PROPERTY
                    || docItemType == RetrievalType.RDocItemType.CONTENT) {
                if (score == null)
                    query = QueryUtil.createQuery(analyzerFactory, name, keyWord);
                else
                    query = QueryUtil.createQuery(analyzerFactory, name, keyWord, score);
            }
        }
        return query;
    }

    public String toString() {
        return query.toString();
    }
}