EMMA Coverage Report (generated Mon Jan 28 16:15:17 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 2012 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 
30class CriteriaQueryProcessor {
31 
32 
33    QueryBuilder createQueryFromCriteria(Criteria criteria) {
34        BoolQueryBuilder query = boolQuery();
35 
36        ListIterator<Criteria> chainIterator = criteria.getCriteriaChain().listIterator();
37        while (chainIterator.hasNext()) {
38            Criteria chainedCriteria = chainIterator.next();
39            if(chainedCriteria.isOr()){
40                query.should(createQueryFragmentForCriteria(chainedCriteria));
41            }else if(chainedCriteria.isNegating()){
42                query.mustNot(createQueryFragmentForCriteria(chainedCriteria));
43            }else{
44                query.must(createQueryFragmentForCriteria(chainedCriteria));
45            }
46        }
47        return query;
48    }
49 
50 
51    private QueryBuilder createQueryFragmentForCriteria(Criteria chainedCriteria) {
52        Iterator<Criteria.CriteriaEntry> it = chainedCriteria.getCriteriaEntries().iterator();
53        boolean singeEntryCriteria = (chainedCriteria.getCriteriaEntries().size() == 1);
54 
55        String fieldName = chainedCriteria.getField().getName();
56        Assert.notNull(fieldName,"Unknown field");
57        QueryBuilder query = null;
58 
59        if(singeEntryCriteria){
60            Criteria.CriteriaEntry entry = it.next();
61            query = processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName);
62        }else{
63            query = boolQuery();
64            while (it.hasNext()){
65                Criteria.CriteriaEntry entry = it.next();
66                ((BoolQueryBuilder)query).must(processCriteriaEntry(entry.getKey(), entry.getValue(), fieldName));
67            }
68        }
69 
70        addBoost(query, chainedCriteria.getBoost());
71        return query;
72    }
73 
74 
75    private QueryBuilder processCriteriaEntry(OperationKey key, Object value, String fieldName) {
76        if (value == null) {
77            return null;
78        }
79        QueryBuilder query = null;
80 
81        switch (key){
82            case  EQUALS:
83                query = fieldQuery(fieldName, value); break;
84            case CONTAINS:
85                query = fieldQuery(fieldName,"*" + value + "*").analyzeWildcard(true); break;
86            case STARTS_WITH:
87                query = fieldQuery(fieldName,value +"*").analyzeWildcard(true); break;
88            case ENDS_WITH:
89                query = fieldQuery(fieldName, "*"+value).analyzeWildcard(true); break;
90            case EXPRESSION:
91                query = queryString((String)value).field(fieldName); break;
92            case BETWEEN:
93                Object[] ranges = (Object[]) value;
94                query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]); break;
95            case FUZZY:
96                query = fuzzyQuery(fieldName, (String) value); break;
97            case IN:
98                query = boolQuery();
99                Iterable<Object> collection = (Iterable<Object>) value;
100                for(Object item : collection){
101                   ((BoolQueryBuilder) query).should(fieldQuery(fieldName, item));
102                }
103                break;
104        }
105 
106        return query;
107    }
108 
109    private QueryBuilder buildNegationQuery(String fieldName, Iterator<Criteria.CriteriaEntry> it){
110        BoolQueryBuilder notQuery =  boolQuery();
111        while (it.hasNext()){
112            notQuery.mustNot(fieldQuery(fieldName, it.next().getValue()));
113        }
114        return notQuery;
115    }
116 
117    private void addBoost(QueryBuilder query, float boost){
118        if(Float.isNaN(boost)){
119            return;
120        }
121        if(query instanceof BoostableQueryBuilder){
122            ((BoostableQueryBuilder)query).boost(boost);
123        }
124 
125    }
126 
127 
128}

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