From 986423d2a57b1383bd260f488ee30a4ebff1d3f7 Mon Sep 17 00:00:00 2001 From: Radek Mensik Date: Tue, 2 Oct 2018 18:58:36 +0200 Subject: [PATCH] DATASOLR-485 Add possibility to have constant score operator --- .../data/solr/core/QueryParserBase.java | 5 +++++ .../data/solr/core/query/Criteria.java | 14 ++++++++++++++ .../data/solr/core/query/Crotch.java | 7 +++++++ .../springframework/data/solr/core/query/Node.java | 3 +++ .../data/solr/core/DefaultQueryParserTests.java | 14 ++++++++++++++ .../data/solr/core/query/CriteriaTests.java | 8 ++++++++ 6 files changed, 51 insertions(+) diff --git a/src/main/java/org/springframework/data/solr/core/QueryParserBase.java b/src/main/java/org/springframework/data/solr/core/QueryParserBase.java index 5e3436352..675d80b3b 100644 --- a/src/main/java/org/springframework/data/solr/core/QueryParserBase.java +++ b/src/main/java/org/springframework/data/solr/core/QueryParserBase.java @@ -76,6 +76,7 @@ public abstract class QueryParserBase implement protected static final String DELIMINATOR = ":"; protected static final String NOT = "-"; protected static final String BOOST = "^"; + protected static final String CONSTANT_SCORE = "^="; protected final GenericConversionService conversionService = new GenericConversionService(); private final List critieraEntryProcessors = new ArrayList<>(); @@ -228,6 +229,10 @@ protected String createQueryFragmentForCriteria(Criteria part) { queryFragment.append(BOOST).append(criteria.getBoost()); } + if (!Float.isNaN(criteria.getScore())) { + queryFragment.append(CONSTANT_SCORE).append(criteria.getScore()); + } + return queryFragment.toString(); } diff --git a/src/main/java/org/springframework/data/solr/core/query/Criteria.java b/src/main/java/org/springframework/data/solr/core/query/Criteria.java index 92dc295c5..ca641b011 100644 --- a/src/main/java/org/springframework/data/solr/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/solr/core/query/Criteria.java @@ -37,6 +37,7 @@ * @author Christoph Strobl * @author Philipp Jardas * @author Francisco Spaeth + * @author Radek Mensik */ public class Criteria extends Node { @@ -45,6 +46,7 @@ public class Criteria extends Node { private @Nullable Field field; private float boost = Float.NaN; + private float score = Float.NaN; private Set predicates = new LinkedHashSet<>(); @@ -391,6 +393,14 @@ public Criteria boost(float boost) { return this; } + public Criteria constantScore(float score) { + if (score < 0) { + throw new InvalidDataAccessApiUsageException("Score must not be negative."); + } + this.score = score; + return this; + } + /** * Crates new {@link Predicate} for {@code RANGE [lowerBound TO upperBound]} * @@ -602,6 +612,10 @@ public float getBoost() { return this.boost; } + public float getScore() { + return score; + } + /** * @return unmodifiable set of all {@link Predicate} */ diff --git a/src/main/java/org/springframework/data/solr/core/query/Crotch.java b/src/main/java/org/springframework/data/solr/core/query/Crotch.java index 5026b7e7e..0ceb40fb1 100644 --- a/src/main/java/org/springframework/data/solr/core/query/Crotch.java +++ b/src/main/java/org/springframework/data/solr/core/query/Crotch.java @@ -27,6 +27,7 @@ /** * @author Christoph Strobl + * @author Radek Mensik * @since 1.2 */ public class Crotch extends Criteria { @@ -56,6 +57,12 @@ public Crotch boost(float boost) { return this; } + @Override + public Crotch constantScore(float score) { + mostRecentSibling.constantScore(score); + return this; + } + @Override public Crotch not() { diff --git a/src/main/java/org/springframework/data/solr/core/query/Node.java b/src/main/java/org/springframework/data/solr/core/query/Node.java index 55730646b..eabbcaf70 100644 --- a/src/main/java/org/springframework/data/solr/core/query/Node.java +++ b/src/main/java/org/springframework/data/solr/core/query/Node.java @@ -25,6 +25,7 @@ /** * @author Christoph Strobl + * @author Radek Mensik * @since 1.2 */ public abstract class Node { @@ -175,6 +176,8 @@ protected void setNegating(boolean negating) { public abstract Node boost(float value); + public abstract Node constantScore(float score); + public abstract Node between(Object lowerBound, Object upperBound); public abstract Node between(Object lowerBound, Object upperBound, boolean includeLowerBound, diff --git a/src/test/java/org/springframework/data/solr/core/DefaultQueryParserTests.java b/src/test/java/org/springframework/data/solr/core/DefaultQueryParserTests.java index 5cc7f3bc9..ebfeb33cb 100644 --- a/src/test/java/org/springframework/data/solr/core/DefaultQueryParserTests.java +++ b/src/test/java/org/springframework/data/solr/core/DefaultQueryParserTests.java @@ -65,6 +65,7 @@ * @author Francisco Spaeth * @author Petar Tahchiev * @author Michael Rocke + * @author Radek Mensik */ public class DefaultQueryParserTests { @@ -259,12 +260,25 @@ public void testBoostMultipleValues() { assertEquals("field_1:(value_1 value_2)^2.0", queryParser.createQueryStringFromCriteria(criteria)); } + @Test + public void testScoreMultipleValues() { + + Criteria criteria = new Criteria("field_1").is("value_1").is("value_2").constantScore(3f); + assertEquals("field_1:(value_1 value_2)^=3.0", queryParser.createQueryStringFromCriteria(criteria)); + } + @Test public void testBoostMultipleCriteriasValues() { Criteria criteria = new Criteria("field_1").is("value_1").is("value_2").boost(2f).and("field_3").is("value_3"); assertEquals("field_1:(value_1 value_2)^2.0 AND field_3:value_3", queryParser.createQueryStringFromNode(criteria)); } + @Test + public void testScoreMultipleCriteriasValues() { + Criteria criteria = new Criteria("field_1").is("value_1").is("value_2").constantScore(3f).and("field_3").is("value_3"); + assertEquals("field_1:(value_1 value_2)^=3.0 AND field_3:value_3", queryParser.createQueryStringFromNode(criteria)); + } + @Test public void testBetween() { diff --git a/src/test/java/org/springframework/data/solr/core/query/CriteriaTests.java b/src/test/java/org/springframework/data/solr/core/query/CriteriaTests.java index 56b8a07a1..bbf2cc3be 100644 --- a/src/test/java/org/springframework/data/solr/core/query/CriteriaTests.java +++ b/src/test/java/org/springframework/data/solr/core/query/CriteriaTests.java @@ -38,6 +38,7 @@ * @author Christoph Strobl * @author John Dorman * @author Philipp Jardas + * @author Radek Mensik */ public class CriteriaTests { @@ -311,6 +312,13 @@ public void testBoost() { Assert.assertEquals(2f, criteria.getBoost(), 0); } + @Test + public void testConstantScore() { + Criteria criteria = new Criteria("field_1").is("value_1").constantScore(3f); + assertPredicate(criteria.getPredicates(), 0, OperationKey.EQUALS, "value_1"); + Assert.assertEquals(3f, criteria.getScore(), 0); + } + @Test public void testBetween() { Criteria criteria = new Criteria("field_1").between(100, 200);