EMMA Coverage Report (generated Mon Jan 28 10:01:43 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%  (253/284)88%  (44.2/50)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CriteriaQueryProcessor$1100% (1/1)100% (1/1)87%  (47/54)87%  (0.9/1)
<static initializer> 100% (1/1)87%  (47/54)87%  (0.9/1)
     
class CriteriaQueryProcessor100% (1/1)83%  (5/6)90%  (206/230)89%  (44.4/50)
buildNegationQuery (String, Iterator): QueryBuilder 0%   (0/1)0%   (0/17)0%   (0/4)
processCriteriaEntry (Criteria$OperationKey, Object, String): QueryBuilder 100% (1/1)92%  (83/90)85%  (11/13)
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 
98        }
99 
100        return query;
101    }
102 
103    private QueryBuilder buildNegationQuery(String fieldName, Iterator<Criteria.CriteriaEntry> it){
104        BoolQueryBuilder notQuery =  boolQuery();
105        while (it.hasNext()){
106            notQuery.mustNot(fieldQuery(fieldName, it.next().getValue()));
107        }
108        return notQuery;
109    }
110 
111    private void addBoost(QueryBuilder query, float boost){
112        if(Float.isNaN(boost)){
113            return;
114        }
115        if(query instanceof BoostableQueryBuilder){
116            ((BoostableQueryBuilder)query).boost(boost);
117        }
118 
119    }
120 
121 
122}

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