Project

General

Profile

1
package eu.dnetlib.data.search.utils.solr;
2

    
3
import eu.dnetlib.data.search.app.SearchServiceImpl;
4
import eu.dnetlib.data.search.solr.SolrResultSet;
5
import eu.dnetlib.data.search.web.api.SearchApiService;
6
import eu.dnetlib.data.search.web.utils.RequestResponseHandler;
7
import eu.dnetlib.functionality.cql.CqlTranslator;
8
import eu.dnetlib.functionality.cql.CqlTranslatorImpl;
9
import org.apache.log4j.BasicConfigurator;
10
import org.apache.solr.client.solrj.impl.CloudSolrClient;
11
import org.apache.solr.common.util.NamedList;
12
import org.junit.Assert;
13
import org.junit.Before;
14
import org.junit.Test;
15
import org.mockito.Mockito;
16
import org.z3950.zing.cql.CQLParseException;
17

    
18
import javax.servlet.http.HttpServletRequest;
19
import java.io.IOException;
20
import java.util.ArrayList;
21
import java.util.Arrays;
22
import java.util.List;
23

    
24
import static org.mockito.Matchers.anyString;
25
import static org.mockito.Mockito.doNothing;
26

    
27

    
28
/**
29
 * Created by kiatrop on 9/11/2016.
30
 */
31
public class SolrUtilsTest {
32

    
33
    private org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(SearchApiService.class);
34

    
35
    HttpServletRequest requestMock;
36
    RequestResponseHandler.Entity entity;
37
    List<String> refineFields = new ArrayList<String>();
38
    List<String> specialFacets = new ArrayList<String>();
39
    List<String> fieldQueries = new ArrayList<String>();
40
    List<String> fieldQueriesWithComma = new ArrayList<String>();
41
    CloudSolrClient mockSolrClient;
42
    SolrResultSet mockRS;
43

    
44
    @Before
45
    public  void before() {
46
        BasicConfigurator.configure();
47
        mockSolrClient = Mockito.mock(CloudSolrClient.class);
48
        doNothing().when(mockSolrClient).setDefaultCollection(anyString());
49

    
50
        mockRS = Mockito.mock(SolrResultSet.class);
51

    
52
        refineFields = Arrays.asList(new String[]{"relfunderid", "relfundinglevel0_id", "relfundinglevel1_id", "relfundinglevel2_id"});
53

    
54
        specialFacets =  Arrays.asList(new String[]{"relfundinglevel0_id", "relfundinglevel1_id"});
55

    
56
        fieldQueries = Arrays.asList(new String[]{"(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)",
57
                "relfundinglevel0_id exact ec___::EC::SP1" , "(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)"});
58

    
59
        fieldQueriesWithComma = Arrays.asList(new String[]{"(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)",
60
                "relfundinglevel0_id exact \"ec___::EC::SP1,ec___::EC::SP2\"" });
61

    
62
    }
63

    
64

    
65
    @Test
66
    public void createEprQuery() {
67
        String query = SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, specialFacets, fieldQueries);
68
        Assert.assertEquals("query=(oaftype=result)" +
69
                "&groupby=relfunderid,relfundinglevel0_id,relfundinglevel1_id,relfundinglevel2_id" +
70
                "&sf=relfundinglevel0_id,relfundinglevel1_id"+
71
                "&fq=(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT),relfundinglevel0_id exact ec___::EC::SP1," +
72
                        "(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)", query);
73

    
74

    
75
        //empty refine, empty fq, empty fc
76
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<>(),new ArrayList<String>());
77
        Assert.assertEquals("query=(oaftype=result)" +
78
                "&groupby=" +
79
                "&sf="+
80
                "&fq=", query);
81

    
82
        //empty refine, empty fq
83
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), specialFacets,new ArrayList<String>());
84
        Assert.assertEquals("query=(oaftype=result)" +
85
                "&groupby=" +
86
                "&sf=relfundinglevel0_id,relfundinglevel1_id"+
87
                "&fq=", query);
88

    
89

    
90
        //empty fq, empty sf
91
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, new ArrayList<>(),  new ArrayList<String>());
92
        Assert.assertEquals("query=(oaftype=result)" +
93
                "&groupby=relfunderid,relfundinglevel0_id,relfundinglevel1_id,relfundinglevel2_id" +
94
                "&sf="+
95
                "&fq=", query);
96

    
97
        //empty refine, empty sf
98
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<>(), fieldQueries);
99
        Assert.assertEquals("query=(oaftype=result)" +
100
                "&groupby=" +
101
                "&sf="+
102
                "&fq=(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT),relfundinglevel0_id exact ec___::EC::SP1," +
103
                "(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)", query);
104

    
105
        //empty refine, empty sf
106
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<>(), fieldQueries);
107
        Assert.assertEquals("query=(oaftype=result)" +
108
                "&groupby=" +
109
                "&sf="+
110
                "&fq=(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT),relfundinglevel0_id exact ec___::EC::SP1," +
111
                "(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)", query);
112

    
113
        //empty query, empty fc
114
        query = SearchServiceImpl.createEprQuery("", new ArrayList<String>(), new ArrayList<>(), new ArrayList<String>());
115
        Assert.assertEquals("query=" +
116
                "&groupby=" +
117
                "&sf="+
118
                "&fq=", query);
119

    
120
        //null values
121
        query = SearchServiceImpl.createEprQuery(null, null, null,null);
122
        Assert.assertEquals("query=" +
123
                "&groupby=" +
124
                "&sf="+
125
                "&fq=", query);
126

    
127
    }
128

    
129
    @Test
130
    public void extractQueryOptions() throws IOException, CQLParseException {
131
        CqlTranslator cqlTranslator = new CqlTranslatorImpl();
132

    
133
        NamedList<String> actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, specialFacets, fieldQueries));
134
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
135
        Assert.assertEquals("__result", actual.get("fl"));
136
        Assert.assertEquals("true", actual.get("shards.tolerant"));
137
        Assert.assertEquals("true", actual.get("facet"));
138
        Assert.assertEquals("1", actual.get("facet.mincount"));
139
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
140
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
141
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
142
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
143
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
144
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
145

    
146
        Assert.assertNotNull(actual.get("f.relfundinglevel0_id.facet.limit"));
147
        Assert.assertEquals(actual.get("f.relfundinglevel0_id.facet.limit"), "-1");
148
        Assert.assertNotNull(actual.get("f.relfundinglevel1_id.facet.limit"));
149
        Assert.assertEquals(actual.get("f.relfundinglevel1_id.facet.limit"), "-1");
150
        Assert.assertNull(actual.get("f.relfundinglevel3_id.facet.limit"));
151

    
152
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
153
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
154
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
155
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
156

    
157
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, specialFacets, fieldQueriesWithComma));
158
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
159
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact \"ec___::EC::SP1,ec___::EC::SP2\"")));
160

    
161
        //empty refine, empty fc, empty fq
162
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<>(), new ArrayList<String>()));
163
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
164
        Assert.assertEquals("__result", actual.get("fl"));
165
        Assert.assertNull(actual.get("q.op"));
166
        Assert.assertEquals("true", actual.get("shards.tolerant"));
167
        Assert.assertNull(actual.get("facet"));
168
        Assert.assertNull(actual.get("facet.mincount"));
169
        Assert.assertNull(actual.get("facet.threads"));
170
        Assert.assertNull(actual.get("facet.field"));
171
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
172
        Assert.assertNull(actual.get("fq"));
173
        Assert.assertTrue(actual.getAll("fq").isEmpty());
174

    
175
        //empty fq, empty fc
176
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, new ArrayList<>(), new ArrayList<String>()));
177
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
178
        Assert.assertEquals("__result", actual.get("fl"));
179
        Assert.assertNull(actual.get("q.op"));
180
        Assert.assertEquals("true", actual.get("shards.tolerant"));
181
        Assert.assertEquals("true", actual.get("facet"));
182
        Assert.assertEquals("1", actual.get("facet.mincount"));
183
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
184
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
185
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
186
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
187
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
188
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
189
        Assert.assertNull(actual.get("f.relfundinglevel0_id.facet.limit"));
190
        Assert.assertNull(actual.get("f.relfundinglevel1_id.facet.limit"));
191
        Assert.assertNull(actual.get("fq"));
192
        Assert.assertTrue(actual.getAll("fq").isEmpty());
193

    
194
        //null fc, null fq
195
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, null, null));
196
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
197
        Assert.assertEquals("__result", actual.get("fl"));
198
        Assert.assertNull(actual.get("q.op"));
199
        Assert.assertEquals("true", actual.get("shards.tolerant"));
200
        Assert.assertEquals("true", actual.get("facet"));
201
        Assert.assertEquals("1", actual.get("facet.mincount"));
202
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
203
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
204
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
205
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
206
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
207
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
208
        Assert.assertNull(actual.get("fq"));
209
        Assert.assertTrue(actual.getAll("fq").isEmpty());
210

    
211
        //empty refine, empty fc
212
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<>(), fieldQueries));
213
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
214
        Assert.assertEquals("__result", actual.get("fl"));
215
//        Assert.assertEquals("AND", actual.get("q.op"));
216
        Assert.assertEquals("true", actual.get("shards.tolerant"));
217
        Assert.assertNull(actual.get("facet"));
218
        Assert.assertNull(actual.get("facet.mincount"));
219
        Assert.assertNull(actual.get("facet.threads"));
220
        Assert.assertNull(actual.get("facet.field"));
221
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
222
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
223
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
224
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
225
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
226

    
227
        //null refine, null fc
228
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", null, null, fieldQueries));
229
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
230
        Assert.assertEquals("__result", actual.get("fl"));
231
  //      Assert.assertEquals("AND", actual.get("q.op"));
232
        Assert.assertEquals("true", actual.get("shards.tolerant"));
233
        Assert.assertNull(actual.get("facet"));
234
        Assert.assertNull(actual.get("facet.mincount"));
235
        Assert.assertNull(actual.get("facet.threads"));
236
        Assert.assertNull(actual.get("facet.field"));
237
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
238
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
239
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene(("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)"))));
240
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
241
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
242

    
243
        //null refine, null fc, null fq
244
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", null, null, null));
245
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
246
        Assert.assertEquals("__result", actual.get("fl"));
247
        Assert.assertNull(actual.get("q.op"));
248
        Assert.assertEquals("true", actual.get("shards.tolerant"));
249
        Assert.assertNull(actual.get("facet"));
250
        Assert.assertNull(actual.get("facet.mincount"));
251
        Assert.assertNull(actual.get("facet.threads"));
252
        Assert.assertNull(actual.get("facet.field"));
253
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
254
        Assert.assertNull(actual.get("fq"));
255
        Assert.assertTrue(actual.getAll("fq").isEmpty());
256
    }
257

    
258
    @Test(expected=CQLParseException.class)
259
    public void extractQueryOptionsEmptyQuery() throws IOException, CQLParseException {
260
        NamedList<String> actual  = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery(null, null, null, null));
261
    }
262

    
263
}
    (1-1/1)