EMMA Coverage Report (generated Tue Mar 05 16:36:55 GMT 2013)
[all classes][org.springframework.data.elasticsearch.core]

COVERAGE SUMMARY FOR SOURCE FILE [CriteriaQueryProcessor.java]

nameclass, %method, %block, %line, %
CriteriaQueryProcessor.java100% (2/2)86%  (6/7)89%  (281/314)89%  (48.9/55)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CriteriaQueryProcessor$1100% (1/1)100% (1/1)87%  (53/61)86%  (0.9/1)
<static initializer> 100% (1/1)87%  (53/61)86%  (0.9/1)
     
class CriteriaQueryProcessor100% (1/1)83%  (5/6)90%  (228/253)89%  (49/55)
buildNegationQuery (String, Iterator): QueryBuilder 0%   (0/1)0%   (0/17)0%   (0/4)
processCriteriaEntry (Criteria$OperationKey, Object, String): QueryBuilder 100% (1/1)93%  (105/113)88%  (15/17)
CriteriaQueryProcessor (): void 100% (1/1)100% (3/3)100% (2/2)
addBoost (QueryBuilder, float): void 100% (1/1)100% (13/13)100% (5/5)
createQueryFragmentForCriteria (Criteria): QueryBuilder 100% (1/1)100% (65/65)100% (16/16)
createQueryFromCriteria (Criteria): QueryBuilder 100% (1/1)100% (42/42)100% (11/11)

1/*
2 * Copyright 2013 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.springframework.data.elasticsearch.core;
17 
18import org.elasticsearch.index.query.BoolQueryBuilder;
19import org.elasticsearch.index.query.BoostableQueryBuilder;
20import org.elasticsearch.index.query.QueryBuilder;
21import org.springframework.data.elasticsearch.core.query.Criteria;
22import org.springframework.util.Assert;
23 
24import java.util.Iterator;
25import java.util.ListIterator;
26 
27import static org.elasticsearch.index.query.QueryBuilders.*;
28import static org.springframework.data.elasticsearch.core.query.Criteria.OperationKey;
29 
30/**
31 * CriteriaQueryProcessor
32 *
33 * @author Rizwan Idrees
34 * @author Mohsin Husen
35 */
36class CriteriaQueryProcessor {
37 
38 
39    QueryBuilder createQueryFromCriteria(Criteria criteria) {
40        BoolQueryBuilder query = boolQuery();
41 
42        ListIterator<Criteria> chainIterator = criteria.getCriteriaChain().listIterator();
43        while (chainIterator.hasNext()) {
44            Criteria chainedCriteria = chainIterator.next();
45            if(chainedCriteria.isOr()){
46                query.should(createQueryFragmentForCriteria(chainedCriteria));
47            }else if(chainedCriteria.isNegating()){
48                query.mustNot(createQueryFragmentForCriteria(chainedCriteria));
49            }else{
50                query.must(createQueryFragmentForCriteria(chainedCriteria));
51            }
52        }
53        return query;
54    }
55 
56 
57    private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
58        Iterator<Criteria.CriteriaEntry> it = chainedCriteria.getCriteriaEntries().iterator();
59        boolean singeEntryCriteria = (chainedCriteria.getCriteriaEntries().size() == 1);
60 
61        String fieldName = chainedCriteria.getField().getName();
62        Assert.notNull(fieldName,"Unknown field");
63        QueryBuilder query = null;
64 
65        if(singeEntryCriteria){
66            Criteria.CriteriaEntry entry = it.next();
67            query = processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName);
68        }else{
69            query = boolQuery();
70            while (it.hasNext()){
71                Criteria.CriteriaEntry entry = it.next();
72                ((BoolQueryBuilder)query).must(processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName));
73            }
74        }
75 
76        addBoost(query, chainedCriteria.getBoost());
77        return query;
78    }
79 
80 
81    private QueryBuilder processCriteriaEntry(OperationKey key, Object value, String fieldName) {
82        if (value == null) {
83            return null;
84        }
85        QueryBuilder query = null;
86 
87        switch (key){
88            case  EQUALS:
89                query = fieldQuery(fieldName, value); break;
90            case CONTAINS:
91                query = fieldQuery(fieldName,"*" + value + "*").analyzeWildcard(true); break;
92            case STARTS_WITH:
93                query = fieldQuery(fieldName,value +"*").analyzeWildcard(true); break;
94            case ENDS_WITH:
95                query = fieldQuery(fieldName, "*"+value).analyzeWildcard(true); break;
96            case EXPRESSION:
97                query = queryString((String)value).field(fieldName); break;
98            case BETWEEN:
99                Object[] ranges = (Object[]) value;
100                query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]); break;
101            case FUZZY:
102                query = fuzzyQuery(fieldName, (String) value); break;
103            case IN:
104                query = boolQuery();
105                Iterable<Object> collection = (Iterable<Object>) value;
106                for(Object item : collection){
107                   ((BoolQueryBuilder) query).should(fieldQuery(fieldName, item));
108                }
109                break;
110            }
111 
112        return query;
113    }
114 
115    private QueryBuilder buildNegationQuery(String fieldName, Iterator<Criteria.CriteriaEntry> it){
116        BoolQueryBuilder notQuery =  boolQuery();
117        while (it.hasNext()){
118            notQuery.mustNot(fieldQuery(fieldName, it.next().getValue()));
119        }
120        return notQuery;
121    }
122 
123    private void addBoost(QueryBuilder query, float boost){
124        if(Float.isNaN(boost)){
125            return;
126        }
127        if(query instanceof BoostableQueryBuilder){
128            ((BoostableQueryBuilder)query).boost(boost);
129        }
130 
131    }
132 
133 
134}

[all classes][org.springframework.data.elasticsearch.core]
EMMA 2.0.5312 (C) Vladimir Roubtsov