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> fieldQueries = new ArrayList<String>();
39
    List<String> fieldQueriesWithComma = new ArrayList<String>();
40
    CloudSolrClient mockSolrClient;
41
    SolrResultSet mockRS;
42

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

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

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

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

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

    
59
    }
60

    
61

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

    
70

    
71
        //empty refine, empty fq
72
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<String>());
73
        Assert.assertEquals("query=(oaftype=result)" +
74
                "&groupby=" +
75
                "&fq=", query);
76

    
77
        //empty fq
78
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, new ArrayList<String>());
79
        Assert.assertEquals("query=(oaftype=result)" +
80
                "&groupby=relfunderid,relfundinglevel0_id,relfundinglevel1_id,relfundinglevel2_id" +
81
                "&fq=", query);
82

    
83
        //empty refine
84
        query = SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), fieldQueries);
85
        Assert.assertEquals("query=(oaftype=result)" +
86
                "&groupby=" +
87
                "&fq=(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT),relfundinglevel0_id exact ec___::EC::SP1," +
88
                "(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)", query);
89

    
90
        //empty query
91
        query = SearchServiceImpl.createEprQuery("", new ArrayList<String>(), new ArrayList<String>());
92
        Assert.assertEquals("query=" +
93
                "&groupby=" +
94
                "&fq=", query);
95

    
96
        //null values
97
        query = SearchServiceImpl.createEprQuery(null, null, null);
98
        Assert.assertEquals("query=" +
99
                "&groupby=" +
100
                "&fq=", query);
101

    
102
    }
103

    
104
    @Test
105
    public void extractQueryOptions() throws IOException, CQLParseException {
106
        CqlTranslator cqlTranslator = new CqlTranslatorImpl();
107

    
108
        NamedList<String> actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, fieldQueries));
109
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
110
        Assert.assertEquals("__result", actual.get("fl"));
111
        Assert.assertEquals("true", actual.get("shards.tolerant"));
112
        Assert.assertEquals("true", actual.get("facet"));
113
        Assert.assertEquals("1", actual.get("facet.mincount"));
114
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
115
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
116
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
117
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
118
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
119
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
120
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
121
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
122
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
123
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
124

    
125
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, fieldQueriesWithComma));
126
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
127
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact \"ec___::EC::SP1,ec___::EC::SP2\"")));
128

    
129
        //empty refine, empty fq
130
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), new ArrayList<String>()));
131
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
132
        Assert.assertEquals("__result", actual.get("fl"));
133
        Assert.assertNull(actual.get("q.op"));
134
        Assert.assertEquals("true", actual.get("shards.tolerant"));
135
        Assert.assertNull(actual.get("facet"));
136
        Assert.assertNull(actual.get("facet.mincount"));
137
        Assert.assertNull(actual.get("facet.threads"));
138
        Assert.assertNull(actual.get("facet.field"));
139
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
140
        Assert.assertNull(actual.get("fq"));
141
        Assert.assertTrue(actual.getAll("fq").isEmpty());
142

    
143
        //empty fq
144
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, new ArrayList<String>()));
145
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
146
        Assert.assertEquals("__result", actual.get("fl"));
147
        Assert.assertNull(actual.get("q.op"));
148
        Assert.assertEquals("true", actual.get("shards.tolerant"));
149
        Assert.assertEquals("true", actual.get("facet"));
150
        Assert.assertEquals("1", actual.get("facet.mincount"));
151
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
152
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
153
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
154
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
155
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
156
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
157
        Assert.assertNull(actual.get("fq"));
158
        Assert.assertTrue(actual.getAll("fq").isEmpty());
159

    
160
        //null fq
161
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", refineFields, null));
162
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
163
        Assert.assertEquals("__result", actual.get("fl"));
164
        Assert.assertNull(actual.get("q.op"));
165
        Assert.assertEquals("true", actual.get("shards.tolerant"));
166
        Assert.assertEquals("true", actual.get("facet"));
167
        Assert.assertEquals("1", actual.get("facet.mincount"));
168
        Assert.assertEquals(refineFields.size() + "", actual.get("facet.threads"));
169
        Assert.assertEquals(refineFields.size(), actual.getAll("facet.field").size());
170
        Assert.assertTrue(actual.getAll("facet.field").contains("relfunderid"));
171
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel1_id"));
172
        Assert.assertTrue(actual.getAll("facet.field").contains("relfundinglevel2_id"));
173
        Assert.assertFalse(actual.getAll("facet.field").contains("relfundinglevel3_id"));
174
        Assert.assertNull(actual.get("fq"));
175
        Assert.assertTrue(actual.getAll("fq").isEmpty());
176

    
177
        //empty refine
178
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", new ArrayList<String>(), fieldQueries));
179
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
180
        Assert.assertEquals("__result", actual.get("fl"));
181
//        Assert.assertEquals("AND", actual.get("q.op"));
182
        Assert.assertEquals("true", actual.get("shards.tolerant"));
183
        Assert.assertNull(actual.get("facet"));
184
        Assert.assertNull(actual.get("facet.mincount"));
185
        Assert.assertNull(actual.get("facet.threads"));
186
        Assert.assertNull(actual.get("facet.field"));
187
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
188
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
189
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)")));
190
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
191
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
192

    
193
        //null refine
194
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", null, fieldQueries));
195
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
196
        Assert.assertEquals("__result", actual.get("fl"));
197
  //      Assert.assertEquals("AND", actual.get("q.op"));
198
        Assert.assertEquals("true", actual.get("shards.tolerant"));
199
        Assert.assertNull(actual.get("facet"));
200
        Assert.assertNull(actual.get("facet.mincount"));
201
        Assert.assertNull(actual.get("facet.threads"));
202
        Assert.assertNull(actual.get("facet.field"));
203
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
204
        Assert.assertEquals(fieldQueries.size(), actual.getAll("fq").size());
205
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene(("(relfunderid exact ec___::EC) and (relfunderid exact wt___::WT)"))));
206
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("relfundinglevel0_id exact ec___::EC::SP1")));
207
        Assert.assertTrue(actual.getAll("fq").contains(cqlTranslator.toLucene("(relfundinglevel1_id exact ec___::EC::SP1::VALUE1) or (relfundinglevel1_id exact ec___::EC::SP1::VALUE2)")));
208

    
209
        //null refine, null fq
210
        actual = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery("(oaftype=result)", null, null));
211
        Assert.assertEquals(cqlTranslator.toLucene("(oaftype=result)"), actual.get("q"));
212
        Assert.assertEquals("__result", actual.get("fl"));
213
        Assert.assertNull(actual.get("q.op"));
214
        Assert.assertEquals("true", actual.get("shards.tolerant"));
215
        Assert.assertNull(actual.get("facet"));
216
        Assert.assertNull(actual.get("facet.mincount"));
217
        Assert.assertNull(actual.get("facet.threads"));
218
        Assert.assertNull(actual.get("facet.field"));
219
        Assert.assertTrue(actual.getAll("facet.field").isEmpty());
220
        Assert.assertNull(actual.get("fq"));
221
        Assert.assertTrue(actual.getAll("fq").isEmpty());
222
    }
223

    
224
    @Test(expected=CQLParseException.class)
225
    public void extractQueryOptionsEmptyQuery() throws IOException, CQLParseException {
226
        NamedList<String> actual  = SolrResultSetOptionsUtil.extractQueryOptions(SearchServiceImpl.createEprQuery(null, null, null));
227
    }
228

    
229
}
    (1-1/1)