1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.wikimedia.search.extra.simswitcher;
18
19 import static java.util.Objects.requireNonNull;
20
21 import java.io.IOException;
22 import java.util.Objects;
23
24 import org.apache.lucene.search.IndexSearcher;
25 import org.apache.lucene.search.Query;
26 import org.apache.lucene.search.ScoreMode;
27 import org.apache.lucene.search.Weight;
28 import org.apache.lucene.search.similarities.Similarity;
29
30 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
31
32
33
34
35
36
37
38 public class SimSwitcherQuery extends Query {
39 private final Similarity similarity;
40 private final Query subQuery;
41
42
43
44
45 public SimSwitcherQuery(Similarity similarity, Query subQuery) {
46 this.similarity = requireNonNull(similarity);
47 this.subQuery = requireNonNull(subQuery);
48 }
49
50
51 @Override
52 public String toString(String field) {
53 return "simswitch:" + field;
54 }
55
56 @Override
57 @SuppressFBWarnings(value = "BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS", justification = "handled by sameClassAs")
58 public boolean equals(Object obj) {
59 return sameClassAs(obj) &&
60
61
62 Objects.equals(similarity.toString(), ((SimSwitcherQuery)obj).similarity.toString()) &&
63 Objects.equals(subQuery, ((SimSwitcherQuery)obj).subQuery);
64 }
65
66 @Override
67 public int hashCode() {
68 return classHash() + Objects.hash(similarity, subQuery);
69 }
70
71 @Override
72 public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) throws IOException {
73 if (!scoreMode.needsScores()) {
74 return searcher.createWeight(subQuery, scoreMode, boost);
75 }
76 final Similarity oldSim = searcher.getSimilarity();
77 try {
78
79
80
81
82 searcher.setSimilarity(similarity);
83 return searcher.createWeight(subQuery, scoreMode, boost);
84 } finally {
85 searcher.setSimilarity(oldSim);
86 }
87 }
88
89
90
91
92 public Similarity getSimilarity() {
93 return similarity;
94 }
95
96
97
98
99 public Query getSubQuery() {
100 return subQuery;
101 }
102 }