|  | @@ -19,7 +19,6 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  package org.elasticsearch.common.lucene.search.function;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import org.apache.lucene.search.ComplexExplanation;
 | 
	
		
			
				|  |  |  import org.apache.lucene.search.Explanation;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public enum CombineFunction {
 | 
	
	
		
			
				|  | @@ -35,16 +34,15 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = queryBoost * Math.min(funcExpl.getValue(), maxBoost) * queryExpl.getValue();
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            res.addDetail(queryExpl);
 | 
	
		
			
				|  |  | -            ComplexExplanation minExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            minExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            minExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            res.addDetail(minExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation boostExpl = Explanation.match(maxBoost, "maxBoost");
 | 
	
		
			
				|  |  | +            Explanation minExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.min(funcExpl.getValue(), maxBoost),
 | 
	
		
			
				|  |  | +                    "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, boostExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    queryExpl, minExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      REPLACE {
 | 
	
	
		
			
				|  | @@ -59,15 +57,15 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = queryBoost * Math.min(funcExpl.getValue(), maxBoost);
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            ComplexExplanation minExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            minExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            minExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            res.addDetail(minExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation boostExpl = Explanation.match(maxBoost, "maxBoost");
 | 
	
		
			
				|  |  | +            Explanation minExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.min(funcExpl.getValue(), maxBoost),
 | 
	
		
			
				|  |  | +                    "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, boostExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    minExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -83,19 +81,14 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = queryBoost * (Math.min(funcExpl.getValue(), maxBoost) + queryExpl.getValue());
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            ComplexExplanation minExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            minExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            minExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            ComplexExplanation sumExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost) + queryExpl.getValue(),
 | 
	
		
			
				|  |  | -                    "sum of");
 | 
	
		
			
				|  |  | -            sumExpl.addDetail(queryExpl);
 | 
	
		
			
				|  |  | -            sumExpl.addDetail(minExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(sumExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation minExpl = Explanation.match(Math.min(funcExpl.getValue(), maxBoost), "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, Explanation.match(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | +            Explanation sumExpl = Explanation.match(Math.min(funcExpl.getValue(), maxBoost) + queryExpl.getValue(), "sum of",
 | 
	
		
			
				|  |  | +                    queryExpl, minExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    sumExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -111,19 +104,15 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = toFloat(queryBoost * (queryExpl.getValue() + Math.min(funcExpl.getValue(), maxBoost)) / 2.0);
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            ComplexExplanation minExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            minExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            minExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            ComplexExplanation avgExpl = new ComplexExplanation(true,
 | 
	
		
			
				|  |  | -                    toFloat((Math.min(funcExpl.getValue(), maxBoost) + queryExpl.getValue()) / 2.0), "avg of");
 | 
	
		
			
				|  |  | -            avgExpl.addDetail(queryExpl);
 | 
	
		
			
				|  |  | -            avgExpl.addDetail(minExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(avgExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation minExpl = Explanation.match(Math.min(funcExpl.getValue(), maxBoost), "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, Explanation.match(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | +            Explanation avgExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    toFloat((Math.min(funcExpl.getValue(), maxBoost) + queryExpl.getValue()) / 2.0), "avg of",
 | 
	
		
			
				|  |  | +                    queryExpl, minExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    avgExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -139,19 +128,16 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = toFloat(queryBoost * Math.min(queryExpl.getValue(), Math.min(funcExpl.getValue(), maxBoost)));
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            ComplexExplanation innerMinExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            innerMinExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            innerMinExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            ComplexExplanation outerMinExpl = new ComplexExplanation(true, Math.min(Math.min(funcExpl.getValue(), maxBoost),
 | 
	
		
			
				|  |  | -                    queryExpl.getValue()), "min of");
 | 
	
		
			
				|  |  | -            outerMinExpl.addDetail(queryExpl);
 | 
	
		
			
				|  |  | -            outerMinExpl.addDetail(innerMinExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(outerMinExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation innerMinExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.min(funcExpl.getValue(), maxBoost), "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, Explanation.match(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | +            Explanation outerMinExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.min(Math.min(funcExpl.getValue(), maxBoost), queryExpl.getValue()), "min of",
 | 
	
		
			
				|  |  | +                    queryExpl, innerMinExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    outerMinExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -167,19 +153,16 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @Override
 | 
	
		
			
				|  |  | -        public ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  | +        public Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost) {
 | 
	
		
			
				|  |  |              float score = toFloat(queryBoost * Math.max(queryExpl.getValue(), Math.min(funcExpl.getValue(), maxBoost)));
 | 
	
		
			
				|  |  | -            ComplexExplanation res = new ComplexExplanation(true, score, "function score, product of:");
 | 
	
		
			
				|  |  | -            ComplexExplanation innerMinExpl = new ComplexExplanation(true, Math.min(funcExpl.getValue(), maxBoost), "Math.min of");
 | 
	
		
			
				|  |  | -            innerMinExpl.addDetail(funcExpl);
 | 
	
		
			
				|  |  | -            innerMinExpl.addDetail(new Explanation(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | -            ComplexExplanation outerMaxExpl = new ComplexExplanation(true, Math.max(Math.min(funcExpl.getValue(), maxBoost),
 | 
	
		
			
				|  |  | -                    queryExpl.getValue()), "max of");
 | 
	
		
			
				|  |  | -            outerMaxExpl.addDetail(queryExpl);
 | 
	
		
			
				|  |  | -            outerMaxExpl.addDetail(innerMinExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(outerMaxExpl);
 | 
	
		
			
				|  |  | -            res.addDetail(new Explanation(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | +            Explanation innerMinExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.min(funcExpl.getValue(), maxBoost), "min of:",
 | 
	
		
			
				|  |  | +                    funcExpl, Explanation.match(maxBoost, "maxBoost"));
 | 
	
		
			
				|  |  | +            Explanation outerMaxExpl = Explanation.match(
 | 
	
		
			
				|  |  | +                    Math.max(Math.min(funcExpl.getValue(), maxBoost), queryExpl.getValue()), "max of:",
 | 
	
		
			
				|  |  | +                    queryExpl, innerMinExpl);
 | 
	
		
			
				|  |  | +            return Explanation.match(score, "function score, product of:",
 | 
	
		
			
				|  |  | +                    outerMaxExpl, Explanation.match(queryBoost, "queryBoost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      };
 | 
	
	
		
			
				|  | @@ -198,5 +181,5 @@ public enum CombineFunction {
 | 
	
		
			
				|  |  |          return Double.compare(floatVersion, input) == 0 || input == 0.0d ? 0 : 1.d - (floatVersion) / input;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public abstract ComplexExplanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost);
 | 
	
		
			
				|  |  | +    public abstract Explanation explain(float queryBoost, Explanation queryExpl, Explanation funcExpl, float maxBoost);
 | 
	
		
			
				|  |  |  }
 |