|  | @@ -358,11 +358,11 @@ public class FunctionScoreTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // now test all together
 | 
	
		
			
				|  |  |          functionExplanation = getFiltersFunctionScoreExplanation(searcher
 | 
	
		
			
				|  |  | -                , RANDOM_SCORE_FUNCTION
 | 
	
		
			
				|  |  | -                , FIELD_VALUE_FACTOR_FUNCTION
 | 
	
		
			
				|  |  | -                , GAUSS_DECAY_FUNCTION
 | 
	
		
			
				|  |  | -                , EXP_DECAY_FUNCTION
 | 
	
		
			
				|  |  | -                , LIN_DECAY_FUNCTION
 | 
	
		
			
				|  |  | +            , RANDOM_SCORE_FUNCTION
 | 
	
		
			
				|  |  | +            , FIELD_VALUE_FACTOR_FUNCTION
 | 
	
		
			
				|  |  | +            , GAUSS_DECAY_FUNCTION
 | 
	
		
			
				|  |  | +            , EXP_DECAY_FUNCTION
 | 
	
		
			
				|  |  | +            , LIN_DECAY_FUNCTION
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          checkFiltersFunctionScoreExplanation(functionExplanation, "random score function (seed: 0)", 0);
 | 
	
	
		
			
				|  | @@ -398,7 +398,7 @@ public class FunctionScoreTests extends ESTestCase {
 | 
	
		
			
				|  |  |          FiltersFunctionScoreQuery.FilterFunction[] filterFunctions = new FiltersFunctionScoreQuery.FilterFunction[scoreFunctions.length];
 | 
	
		
			
				|  |  |          for (int i = 0; i < scoreFunctions.length; i++) {
 | 
	
		
			
				|  |  |              filterFunctions[i] = new FiltersFunctionScoreQuery.FilterFunction(
 | 
	
		
			
				|  |  | -                    new TermQuery(TERM), scoreFunctions[i]);
 | 
	
		
			
				|  |  | +                new TermQuery(TERM), scoreFunctions[i]);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return new FiltersFunctionScoreQuery(new TermQuery(TERM), scoreMode, filterFunctions, Float.MAX_VALUE, Float.MAX_VALUE * -1, combineFunction);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -610,4 +610,136 @@ public class FunctionScoreTests extends ESTestCase {
 | 
	
		
			
				|  |  |              assertNotNull(scorer.twoPhaseIterator());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testFunctionScoreHashCodeAndEquals() {
 | 
	
		
			
				|  |  | +        Float minScore = randomBoolean() ? null : 1.0f;
 | 
	
		
			
				|  |  | +        CombineFunction combineFunction = randomFrom(CombineFunction.values());
 | 
	
		
			
				|  |  | +        float maxBoost = randomBoolean() ? Float.POSITIVE_INFINITY : randomFloat();
 | 
	
		
			
				|  |  | +        ScoreFunction function = randomBoolean() ? null : new ScoreFunction(combineFunction) {
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public LeafScoreFunction getLeafScoreFunction(LeafReaderContext ctx) throws IOException {
 | 
	
		
			
				|  |  | +                return null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public boolean needsScores() {
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            protected boolean doEquals(ScoreFunction other) {
 | 
	
		
			
				|  |  | +                return other == this;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        FunctionScoreQuery q = new FunctionScoreQuery(new TermQuery(new Term("foo", "bar")), function, minScore, combineFunction, maxBoost);
 | 
	
		
			
				|  |  | +        FunctionScoreQuery q1 = new FunctionScoreQuery(new TermQuery(new Term("foo", "bar")), function, minScore, combineFunction, maxBoost);
 | 
	
		
			
				|  |  | +        assertEquals(q, q);
 | 
	
		
			
				|  |  | +        assertEquals(q.hashCode(), q.hashCode());
 | 
	
		
			
				|  |  | +        assertEquals(q, q1);
 | 
	
		
			
				|  |  | +        assertEquals(q.hashCode(), q1.hashCode());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        FunctionScoreQuery diffQuery = new FunctionScoreQuery(new TermQuery(new Term("foo", "baz")), function, minScore, combineFunction, maxBoost);
 | 
	
		
			
				|  |  | +        FunctionScoreQuery diffMinScore = new FunctionScoreQuery(q.getSubQuery(), function, minScore == null ? 1.0f : null, combineFunction, maxBoost);
 | 
	
		
			
				|  |  | +        ScoreFunction otherFunciton = function == null ? new ScoreFunction(combineFunction) {
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public LeafScoreFunction getLeafScoreFunction(LeafReaderContext ctx) throws IOException {
 | 
	
		
			
				|  |  | +                return null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public boolean needsScores() {
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            protected boolean doEquals(ScoreFunction other) {
 | 
	
		
			
				|  |  | +                return other == this;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } : null;
 | 
	
		
			
				|  |  | +        FunctionScoreQuery diffFunction = new FunctionScoreQuery(q.getSubQuery(), otherFunciton, minScore, combineFunction, maxBoost);
 | 
	
		
			
				|  |  | +        FunctionScoreQuery diffMaxBoost = new FunctionScoreQuery(new TermQuery(new Term("foo", "bar")), function, minScore, combineFunction, maxBoost == 1.0f ? 0.9f : 1.0f);
 | 
	
		
			
				|  |  | +        q1.setBoost(3.0f);
 | 
	
		
			
				|  |  | +        FunctionScoreQuery[] queries = new FunctionScoreQuery[] {
 | 
	
		
			
				|  |  | +            diffFunction,
 | 
	
		
			
				|  |  | +            diffMinScore,
 | 
	
		
			
				|  |  | +            diffQuery,
 | 
	
		
			
				|  |  | +            q,
 | 
	
		
			
				|  |  | +            q1,
 | 
	
		
			
				|  |  | +            diffMaxBoost
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        final int numIters = randomIntBetween(20, 100);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < numIters; i++) {
 | 
	
		
			
				|  |  | +            FunctionScoreQuery left = randomFrom(queries);
 | 
	
		
			
				|  |  | +            FunctionScoreQuery right = randomFrom(queries);
 | 
	
		
			
				|  |  | +            if (left == right) {
 | 
	
		
			
				|  |  | +                assertEquals(left, right);
 | 
	
		
			
				|  |  | +                assertEquals(left.hashCode(), right.hashCode());
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                assertNotEquals(left + " == " + right, left, right);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testFilterFunctionScoreHashCodeAndEquals() {
 | 
	
		
			
				|  |  | +        ScoreMode mode = randomFrom(ScoreMode.values());
 | 
	
		
			
				|  |  | +        CombineFunction combineFunction = randomFrom(CombineFunction.values());
 | 
	
		
			
				|  |  | +        ScoreFunction scoreFunction = new ScoreFunction(combineFunction) {
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public LeafScoreFunction getLeafScoreFunction(LeafReaderContext ctx) throws IOException {
 | 
	
		
			
				|  |  | +                return null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            public boolean needsScores() {
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            @Override
 | 
	
		
			
				|  |  | +            protected boolean doEquals(ScoreFunction other) {
 | 
	
		
			
				|  |  | +                return other == this;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        Float minScore = randomBoolean() ? null : 1.0f;
 | 
	
		
			
				|  |  | +        Float maxBoost = randomBoolean() ? Float.POSITIVE_INFINITY : randomFloat();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        FilterFunction function = new FilterFunction(new TermQuery(new Term("filter", "query")), scoreFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery q = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, new FilterFunction[] {function}, maxBoost, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery q1 = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, new FilterFunction[] {function}, maxBoost, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        assertEquals(q, q);
 | 
	
		
			
				|  |  | +        assertEquals(q.hashCode(), q.hashCode());
 | 
	
		
			
				|  |  | +        assertEquals(q, q1);
 | 
	
		
			
				|  |  | +        assertEquals(q.hashCode(), q1.hashCode());
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffCombineFunc = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, new FilterFunction[] {function}, maxBoost, minScore, combineFunction == CombineFunction.AVG ? CombineFunction.MAX : CombineFunction.AVG);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffQuery = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "baz")), mode, new FilterFunction[] {function}, maxBoost, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffMode = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode == ScoreMode.AVG ? ScoreMode.FIRST : ScoreMode.AVG, new FilterFunction[] {function}, maxBoost, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffMaxBoost = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, new FilterFunction[] {function}, maxBoost == 1.0f ? 0.9f : 1.0f, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffMinScore = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, new FilterFunction[] {function}, maxBoost, minScore == null ? 0.9f : null, combineFunction);
 | 
	
		
			
				|  |  | +        FilterFunction otherFunc = new FilterFunction(new TermQuery(new Term("filter", "other_query")), scoreFunction);
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery diffFunc = new FiltersFunctionScoreQuery(new TermQuery(new Term("foo", "bar")), mode, randomBoolean() ? new FilterFunction[] {function, otherFunc} : new FilterFunction[] {otherFunc}, maxBoost, minScore, combineFunction);
 | 
	
		
			
				|  |  | +        q1.setBoost(3.0f);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        FiltersFunctionScoreQuery[] queries = new FiltersFunctionScoreQuery[] {
 | 
	
		
			
				|  |  | +            diffQuery,
 | 
	
		
			
				|  |  | +            diffMaxBoost,
 | 
	
		
			
				|  |  | +            diffMinScore,
 | 
	
		
			
				|  |  | +            diffMode,
 | 
	
		
			
				|  |  | +            diffFunc,
 | 
	
		
			
				|  |  | +            q,
 | 
	
		
			
				|  |  | +            q1,
 | 
	
		
			
				|  |  | +            diffCombineFunc
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        final int numIters = randomIntBetween(20, 100);
 | 
	
		
			
				|  |  | +        for (int i = 0; i < numIters; i++) {
 | 
	
		
			
				|  |  | +            FiltersFunctionScoreQuery left = randomFrom(queries);
 | 
	
		
			
				|  |  | +            FiltersFunctionScoreQuery right = randomFrom(queries);
 | 
	
		
			
				|  |  | +            if (left == right) {
 | 
	
		
			
				|  |  | +                assertEquals(left, right);
 | 
	
		
			
				|  |  | +                assertEquals(left.hashCode(), right.hashCode());
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                assertNotEquals(left + " == " + right, left, right);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |