diff --git a/.gitignore b/.gitignore index cacf39d96..be935a01d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,10 @@ target/* .DS_Store # modules -*/.classpath -*/.project -*/.settings -*/target +**/.classpath +**/.project +**/.settings +**/target #files *.iml diff --git a/README.md b/README.md index ac5567c97..b5c604572 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -![travis ci build status](https://travis-ci.org/renekrie/querqy.png) [ ![Download](https://api.bintray.com/packages/renekrie/maven/querqy/images/download.svg) ](https://bintray.com/renekrie/maven/querqy/_latestVersion) +![travis ci build status](https://travis-ci.org/renekrie/querqy.png) +[ ![Download Querqy for Lucene/Solr](https://api.bintray.com/packages/renekrie/maven/querqy-for-lucene/images/download.svg) ](https://bintray.com/renekrie/maven/querqy-for-lucene/_latestVersion) # Querqy Querqy is a framework for query preprocessing in Java-based search engines. It comes with a powerful, rule-based preprocessor named 'Common Rules Preprocessor', which provides query-time synonyms, query-dependent boosting and down-ranking, and query-dependent filters. While the Common Rules Preprocessor is not specific to any search engine, Querqy provides a plugin to run it within the Solr search engine. @@ -6,7 +7,7 @@ Querqy is a framework for query preprocessing in Java-based search engines. It c ## Getting started: setting up Common Rules under Solr ### Getting Querqy and deploying it to Solr -Querqy versions 1.x.x work with Solr 4.10.x, while Querqy versions 2.x.x require Solr 5, and Querqy versions 3.x.x maps to Solr 6. Detailed Solr version mapping: +Querqy versions 1.x.x work with Solr 4.10.x, while Querqy versions 2.x.x require Solr 5, and Querqy versions 3.x.x map to Solr 6. Detailed Solr version mapping: - Querqy 2.0.x to 2.5.x - Solr 5.0 - Querqy 2.6.x to 2.7.x - Solr 5.1 @@ -15,7 +16,8 @@ Querqy versions 1.x.x work with Solr 4.10.x, while Querqy versions 2.x.x require - Querqy 2.10.x - Solr 5.5.x - Querqy 3.0.x - Solr 6.0.x -You can download a .jar file that includes Querqy and all required dependencies from [Bintray] (https://bintray.com/renekrie/maven/querqy) (querqy/querqy-solr/\/querqy-solr-\-jar-with-dependencies.jar) and simply put it into [Solr's lib folder](https://cwiki.apache.org/confluence/display/solr/Lib+Directives+in+SolrConfig). +You can download a .jar file that includes Querqy and all required dependencies from Bintray: [https://bintray.com/renekrie/maven/querqy-for-lucene](https://bintray.com/renekrie/maven/querqy-for-lucene) (Files - querqy/querqy-solr/\/querqy-solr-\-jar-with-dependencies.jar) and simply put it into [Solr's lib folder](https://cwiki.apache.org/confluence/display/solr/Lib+Directives+in+SolrConfig). +Please check the Bintray package [https://bintray.com/renekrie/maven/querqy](https://bintray.com/renekrie/maven/querqy) for Querqy core artifacts and Querqy versions prior to 2.7.4 (Solr 5.1), 2.8.4 (Solr 5.3), 2.9.5 (Solr 5.4), 2.10.4 (Solr 5.5), 3.0.3 (Solr 6.0). Alternatively, if you already have a Maven build for your Solr plugins, you can add the artifact 'querqy-solr' as a dependency to your pom.xml: @@ -263,9 +265,9 @@ kinder* => Wildcard matching can be used for all rule types. There are some restrictions in the current wildcard implementation, which might be removed in the future: - - Synonyms are the only rules type that can pick up the '$1' placeholder. + - Synonyms and boostings (UP/DOWN) are the only rule types that can pick up the '$1' placeholder. - The wildcard can only occur at the very end of the input matching. - - It cannot be combined with the right-hand input boundary marker (..."). + - It cannot be combined with the right-hand input boundary marker (..."). #### SYNONYM rules @@ -603,15 +605,18 @@ Querqy is licensed under the [Apache License, Version 2](http://www.apache.org/l ## Development -### Branches -Please base development on the branch for the corresponding Solr version. - ### Modules - + - `querqy-antlr` - An [ANTLR-based](http://www.antlr.org/) Querqy query parser (incomplete, do not use) - `querqy-core` - The core component. Search-engine independent, Querqy's query object model, Common Rules Rewriter - - `querqy-lucene` - Lucene-specific components. Builder for creating a Lucene query from Querqy's query object model - - `querqy-solr` - Solr-specific components. QParserPlugin, SearchComponent. + - `querqy-for-lucene/querqy-lucene` - Lucene-specific components. Builder for creating a Lucene query from Querqy's query object model + - `querqy-for-lucene/querqy-solr` - Solr-specific components. QParserPlugin, SearchComponent. + + querqy-core and querqy-for-lucene are released separately and version numbers will diverge. + +### Branches +Please base development on the branch for the corresponding Solr version. querqy-core development should be based on the branch for the latest Solr version. + ### Contributors diff --git a/pom.xml b/pom.xml index 560d31871..11305f28d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,147 +1,27 @@ - - 4.0.0 + + 4.0.0 - querqy - querqy-parent - 3.1.0-SNAPSHOT - pom - - + querqy + querqy-parent + 3.1.0-SNAPSHOT + pom + + git@github.com:renekrie/querqy.git scm:git:git@github.com:renekrie/querqy.git scm:git:git@github.com:renekrie/querqy.git - HEAD - - - - 3.2.0 - - - - UTF-8 - 6.1.0 - 2.1 - 4.11 - 1.3 - 1.10.19 - - - - querqy-core - querqy-antlr - querqy-lucene - querqy-solr - - - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - test - - - junit - junit - ${junit.version} - test - - - org.hamcrest - hamcrest-core - - - - - org.mockito - mockito-core - ${mockito.version} - test - - + HEAD + + + 3.2.0 + - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19 - - - Lucene60 - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - - - - maven-release-plugin - 2.5 - - false - release - true - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.7 - 1.7 - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.6 - - - - **/*Test.class - - - - - - - clean - - - - - - - - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.6 - - - + + querqy-core + querqy-antlr + querqy-for-lucene + - - - bintray-rene-maven - renekrie-maven-querqy - https://api.bintray.com/maven/renekrie/maven/querqy - - diff --git a/querqy-antlr/pom.xml b/querqy-antlr/pom.xml index 51a3f5d53..d04300fb3 100644 --- a/querqy-antlr/pom.xml +++ b/querqy-antlr/pom.xml @@ -1,68 +1,129 @@ - - 4.0.0 - - - querqy - querqy-parent - 3.1.0-SNAPSHOT - - - querqy-antlr - - - true - - - - - - ${project.groupId} - querqy-core - ${project.version} - - - - ${project.groupId} - querqy-core - ${project.version} - test-jar - test - - - - org.antlr - antlr4-runtime - 4.2.2 - - - org.abego.treelayout - org.abego.treelayout.core - - - - - - org.abego.treelayout - org.abego.treelayout.core - 1.0.1 - true - - - - - - - org.antlr - antlr4-maven-plugin - 4.2.2 - - - - antlr4 - - - - - - + + 4.0.0 + + querqy + querqy-antlr + 3.1.0-SNAPSHOT + + git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + HEAD + + + + 3.2.0 + + + + 3.0.2 + true + 4.11 + 1.3 + 1.10.19 + + + + + querqy-repo + Querqy repo + http://dl.bintray.com/renekrie/maven + + + + + + + ${project.groupId} + querqy-core + ${querqy.core.version} + + + + ${project.groupId} + querqy-core + ${querqy.core.version} + test-jar + test + + + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest-core + + + + + org.mockito + mockito-core + ${mockito.version} + test + + + + + org.antlr + antlr4-runtime + 4.2.2 + + + org.abego.treelayout + org.abego.treelayout.core + + + + + + org.abego.treelayout + org.abego.treelayout.core + 1.0.1 + true + + + + + + + org.antlr + antlr4-maven-plugin + 4.2.2 + + + + antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + + + + diff --git a/querqy-core/pom.xml b/querqy-core/pom.xml index 052f4184a..789eed274 100644 --- a/querqy-core/pom.xml +++ b/querqy-core/pom.xml @@ -1,27 +1,144 @@ - - 4.0.0 - - - querqy - querqy-parent - 3.1.0-SNAPSHOT - - - querqy-core - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - test-jar - - - - - - + + + 4.0.0 + + querqy-core + querqy + 3.1.0-SNAPSHOT + + + git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + HEAD + + + + 3.2.0 + + + + UTF-8 + 4.11 + 1.3 + 1.10.19 + + + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest-core + + + + + org.mockito + mockito-core + ${mockito.version} + test + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + + + + + maven-release-plugin + 2.5.3 + + false + release + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + + + + **/*Test.class + + + + + + + clean + + + + + + + + + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + + + + + + + bintray-rene-maven + renekrie-maven-querqy + https://api.bintray.com/maven/renekrie/maven/querqy + + + + diff --git a/querqy-core/src/main/java/querqy/CharSequenceUtil.java b/querqy-core/src/main/java/querqy/CharSequenceUtil.java index 8ea8142d9..780a4f2d1 100644 --- a/querqy-core/src/main/java/querqy/CharSequenceUtil.java +++ b/querqy-core/src/main/java/querqy/CharSequenceUtil.java @@ -1,55 +1,54 @@ /** - * + * */ package querqy; /** * @author René Kriegler, @renekrie - * */ public class CharSequenceUtil { - public static boolean equals(CharSequence seq1, Object obj) { + public static boolean equals(final CharSequence seq1, final Object obj) { if (seq1 == obj) return true; - if (seq1 == null || obj == null) + if (seq1 == null || obj == null) return false; - if (!CharSequence.class.isAssignableFrom(obj.getClass())) + if (!CharSequence.class.isAssignableFrom(obj.getClass())) return false; - CharSequence seq2 = (CharSequence) obj; - int length = seq1.length(); + final CharSequence seq2 = (CharSequence) obj; + final int length = seq1.length(); - if (length != seq2.length()) + if (length != seq2.length()) return false; - for (int i = 0; i < length; i++) { - char ch1 = seq1.charAt(i); - char ch2 = seq2.charAt(i); + for (int i = 0; i < length; i++) { + final char ch1 = seq1.charAt(i); + final char ch2 = seq2.charAt(i); if (ch1 != ch2) { - return false; + return false; } - } + } - return true; + return true; } - - public static int compare(CharSequence seq1, CharSequence seq2) { + + public static int compare(final CharSequence seq1, final CharSequence seq2) { for (int i = 0, len = Math.min(seq1.length(), seq2.length()); i < len; i++) { - char ch1 = seq1.charAt(i); - char ch2 = seq2.charAt(i); + final char ch1 = seq1.charAt(i); + final char ch2 = seq2.charAt(i); if (ch1 != ch2) { - return ch1 - ch2; + return ch1 - ch2; } - } + } - return seq1.length() - seq2.length(); + return seq1.length() - seq2.length(); } - - public static int hashCode(CharSequence seq) { + + public static int hashCode(final CharSequence seq) { final int prime = 31; int result = 1; @@ -59,5 +58,5 @@ public static int hashCode(CharSequence seq) { } return result; - } + } } diff --git a/querqy-core/src/main/java/querqy/ComparableCharSequence.java b/querqy-core/src/main/java/querqy/ComparableCharSequence.java index 033602fa5..ba0e16d98 100644 --- a/querqy-core/src/main/java/querqy/ComparableCharSequence.java +++ b/querqy-core/src/main/java/querqy/ComparableCharSequence.java @@ -16,15 +16,14 @@ * @author rene * */ -public interface ComparableCharSequence extends CharSequence, - Comparable { +public interface ComparableCharSequence extends CharSequence, Comparable { @Override - public int hashCode(); + int hashCode(); @Override - public boolean equals(Object obj); + boolean equals(Object obj); @Override - public ComparableCharSequence subSequence(int start, int end); + ComparableCharSequence subSequence(int start, int end); } diff --git a/querqy-core/src/main/java/querqy/ComparableCharSequenceWrapper.java b/querqy-core/src/main/java/querqy/ComparableCharSequenceWrapper.java index aae6429f3..91dcb6180 100644 --- a/querqy-core/src/main/java/querqy/ComparableCharSequenceWrapper.java +++ b/querqy-core/src/main/java/querqy/ComparableCharSequenceWrapper.java @@ -13,7 +13,7 @@ public class ComparableCharSequenceWrapper implements ComparableCharSequence { final CharSequence sequence; - public ComparableCharSequenceWrapper(CharSequence sequence) { + public ComparableCharSequenceWrapper(final CharSequence sequence) { this.sequence = sequence; } @@ -33,7 +33,7 @@ public int length() { * @see java.lang.CharSequence#charAt(int) */ @Override - public char charAt(int index) { + public char charAt(final int index) { return sequence.charAt(index); } @@ -43,7 +43,7 @@ public char charAt(int index) { * @see java.lang.CharSequence#subSequence(int, int) */ @Override - public ComparableCharSequence subSequence(int start, int end) { + public ComparableCharSequence subSequence(final int start, final int end) { // TODO: do subSequence as view in new wrapper return new ComparableCharSequenceWrapper(sequence.subSequence(start, end)); } @@ -54,7 +54,7 @@ public ComparableCharSequence subSequence(int start, int end) { * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override - public int compareTo(CharSequence other) { + public int compareTo(final CharSequence other) { return CharSequenceUtil.compare(this, other); } @@ -64,7 +64,7 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { return CharSequenceUtil.equals(this, obj); } diff --git a/querqy-core/src/main/java/querqy/CompoundCharSequence.java b/querqy-core/src/main/java/querqy/CompoundCharSequence.java index 88e1eb806..04e826286 100644 --- a/querqy-core/src/main/java/querqy/CompoundCharSequence.java +++ b/querqy-core/src/main/java/querqy/CompoundCharSequence.java @@ -14,11 +14,11 @@ public class CompoundCharSequence implements ComparableCharSequence { final CharSequence[] parts; - public CompoundCharSequence(List parts) { + public CompoundCharSequence(final List parts) { this(null, parts); } - public CompoundCharSequence(CharSequence separator, List parts) { + public CompoundCharSequence(final CharSequence separator, final List parts) { this(separator, parts.toArray(new CharSequence[parts.size()])); } @@ -28,7 +28,7 @@ public CompoundCharSequence(CharSequence separator, List * @param parts * The parts to combine. */ - public CompoundCharSequence(CharSequence separator, CharSequence... parts) { + public CompoundCharSequence(final CharSequence separator, final CharSequence... parts) { if (parts == null || parts.length == 0) { throw new IllegalArgumentException("Excpectinig one or more parts"); } @@ -37,10 +37,10 @@ public CompoundCharSequence(CharSequence separator, CharSequence... parts) { } else { this.parts = new CharSequence[parts.length * 2 - 1]; - for (int i = 0, len = parts.length; i < len; i++) { + for (int i = 0; i < parts.length; i++) { int pos = i * 2; this.parts[pos] = parts[i]; - if (i < len - 1) { + if (i < parts.length - 1) { this.parts[pos + 1] = separator; } } @@ -76,18 +76,18 @@ public int length() { * @see java.lang.CharSequence#charAt(int) */ @Override - public char charAt(int index) { + public char charAt(final int index) { if (parts.length == 1) { return parts[0].charAt(index); } - PartInfo partInfo = getPartInfoForCharIndex(index); + final PartInfo partInfo = getPartInfoForCharIndex(index); return parts[partInfo.partIndex].charAt(index - partInfo.globalStart); } - PartInfo getPartInfoForCharIndex(int index) { + PartInfo getPartInfoForCharIndex(final int index) { int globalEnd = 0; for (int i = 0, last = parts.length - 1; i <= last; i++) { @@ -107,7 +107,7 @@ PartInfo getPartInfoForCharIndex(int index) { * @see java.lang.CharSequence#subSequence(int, int) */ @Override - public ComparableCharSequence subSequence(int start, int end) { + public ComparableCharSequence subSequence(final int start, final int end) { if (parts.length == 1) { // TODO: do subsequence as view in wrapper @@ -121,19 +121,21 @@ public ComparableCharSequence subSequence(int start, int end) { throw new ArrayIndexOutOfBoundsException(start); } } - - PartInfo partInfoStart = getPartInfoForCharIndex(start); - PartInfo partInfoEnd = getPartInfoForCharIndex(end - 1); // end is - // exclusive + + final PartInfo partInfoStart = getPartInfoForCharIndex(start); + final PartInfo partInfoEnd = getPartInfoForCharIndex(end - 1); // end is exclusive + if (partInfoStart.partIndex == partInfoEnd.partIndex) { // TODO: do subsequence as view in wrapper - return new ComparableCharSequenceWrapper(parts[partInfoStart.partIndex].subSequence(start - partInfoStart.globalStart, end - - partInfoStart.globalStart)); + return new ComparableCharSequenceWrapper( + parts[partInfoStart.partIndex] + .subSequence(start - partInfoStart.globalStart, end - partInfoStart.globalStart)); } - CharSequence[] resParts = new CharSequence[partInfoEnd.partIndex - partInfoStart.partIndex + 1]; - resParts[0] = parts[partInfoStart.partIndex].subSequence(start - partInfoStart.globalStart, - parts[partInfoStart.partIndex].length()); + final CharSequence[] resParts = new CharSequence[partInfoEnd.partIndex - partInfoStart.partIndex + 1]; + resParts[0] = parts[partInfoStart.partIndex] + .subSequence(start - partInfoStart.globalStart, parts[partInfoStart.partIndex].length()); + for (int i = partInfoStart.partIndex + 1, j = 1; i < partInfoEnd.partIndex; i++) { resParts[j++] = parts[i]; } @@ -143,31 +145,31 @@ public ComparableCharSequence subSequence(int start, int end) { } class PartInfo { - int partIndex; - int globalStart; + final int partIndex; + final int globalStart; - public PartInfo(int partIndex, int globalStart) { - this.partIndex = partIndex; - this.globalStart = globalStart; - } + public PartInfo(final int partIndex, final int globalStart) { + this.partIndex = partIndex; + this.globalStart = globalStart; + } } - @Override - public int compareTo(CharSequence other) { - - // TODO: avoid calls to this.charAt(i) to make comparison faster - int length = length(); - for (int i = 0, len = Math.min(length, other.length()); i < len; i++) { - char ch1 = charAt(i); - char ch2 = other.charAt(i); - if (ch1 != ch2) { - return ch1 - ch2; - } - } + @Override + public int compareTo(final CharSequence other) { - return length - other.length(); + // TODO: avoid calls to this.charAt(i) to make comparison faster + final int length = length(); + for (int i = 0, len = Math.min(length, other.length()); i < len; i++) { + final char ch1 = charAt(i); + final char ch2 = other.charAt(i); + if (ch1 != ch2) { + return ch1 - ch2; + } + } - } + return length - other.length(); + + } @Override public int hashCode() { @@ -175,18 +177,18 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { return CharSequenceUtil.equals(this, obj); } @Override public String toString() { - StringBuilder buf = new StringBuilder(); - for (int i = 0; i < parts.length; i++) { - buf.append(parts[i].toString()); + final StringBuilder buf = new StringBuilder(); + for (int i = 0; i < parts.length; i++) { + buf.append(parts[i].toString()); - } - return buf.toString(); + } + return buf.toString(); } } diff --git a/querqy-core/src/main/java/querqy/LowerCaseCharSequence.java b/querqy-core/src/main/java/querqy/LowerCaseCharSequence.java index cef85c25e..ca97b93d0 100644 --- a/querqy-core/src/main/java/querqy/LowerCaseCharSequence.java +++ b/querqy-core/src/main/java/querqy/LowerCaseCharSequence.java @@ -11,18 +11,18 @@ public class LowerCaseCharSequence implements ComparableCharSequence { final CharSequence delegate; - public LowerCaseCharSequence(CharSequence delegate) { + public LowerCaseCharSequence(final CharSequence delegate) { this.delegate = delegate; } @Override - public char charAt(int index) { - char ch = delegate.charAt(index); + public char charAt(final int index) { + final char ch = delegate.charAt(index); return Character.isLowerCase(ch) ? ch : Character.toLowerCase(ch); } @Override - public ComparableCharSequence subSequence(int start, int end) { + public ComparableCharSequence subSequence(final int start, final int end) { return new LowerCaseCharSequence(delegate.subSequence(start, end)); } @@ -37,12 +37,12 @@ public int length() { } @Override - public int compareTo(CharSequence other) { + public int compareTo(final CharSequence other) { return CharSequenceUtil.compare(this, other); } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { return CharSequenceUtil.equals(this, obj); } diff --git a/querqy-core/src/main/java/querqy/SimpleComparableCharSequence.java b/querqy-core/src/main/java/querqy/SimpleComparableCharSequence.java index 1f00569d5..917fcb161 100644 --- a/querqy-core/src/main/java/querqy/SimpleComparableCharSequence.java +++ b/querqy-core/src/main/java/querqy/SimpleComparableCharSequence.java @@ -11,9 +11,9 @@ public class SimpleComparableCharSequence implements ComparableCharSequence { final char[] value; final int start; - int length; + final int length; - public SimpleComparableCharSequence(char[] value, int start, int length) { + public SimpleComparableCharSequence(final char[] value, final int start, final int length) { if ((start + length) > value.length) { throw new ArrayIndexOutOfBoundsException(start + length); } @@ -38,7 +38,7 @@ public int length() { * @see java.lang.CharSequence#charAt(int) */ @Override - public char charAt(int index) { + public char charAt(final int index) { if (index >= length) { throw new ArrayIndexOutOfBoundsException(index); } @@ -51,7 +51,7 @@ public char charAt(int index) { * @see java.lang.CharSequence#subSequence(int, int) */ @Override - public ComparableCharSequence subSequence(int start, int end) { + public ComparableCharSequence subSequence(final int start, final int end) { if (end > length) { throw new ArrayIndexOutOfBoundsException(end); @@ -64,7 +64,7 @@ public ComparableCharSequence subSequence(int start, int end) { } @Override - public int compareTo(CharSequence other) { + public int compareTo(final CharSequence other) { return CharSequenceUtil.compare(this, other); } @@ -75,7 +75,7 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { return CharSequenceUtil.equals(this, obj); } diff --git a/querqy-core/src/main/java/querqy/model/BooleanQuery.java b/querqy-core/src/main/java/querqy/model/BooleanQuery.java index 7a7c4388f..01aaef5c1 100644 --- a/querqy-core/src/main/java/querqy/model/BooleanQuery.java +++ b/querqy-core/src/main/java/querqy/model/BooleanQuery.java @@ -10,12 +10,12 @@ public class BooleanQuery extends SubQuery implements DisjunctionMaxClause, BooleanClause, BooleanParent, QuerqyQuery { - public BooleanQuery(BooleanParent parentQuery, Occur occur, boolean generated) { + public BooleanQuery(final BooleanParent parentQuery, final Occur occur, final boolean generated) { super(parentQuery, occur, generated); } @Override - public T accept(NodeVisitor visitor) { + public T accept(final NodeVisitor visitor) { return visitor.visit(this); } @@ -26,26 +26,26 @@ public String toString() { } @Override - public BooleanQuery clone(BooleanParent newParent) { - BooleanQuery bq = new BooleanQuery(newParent, occur, generated); - for (BooleanClause clause : clauses) { + public BooleanQuery clone(final BooleanParent newParent) { + final BooleanQuery bq = new BooleanQuery(newParent, occur, generated); + for (final BooleanClause clause : clauses) { bq.addClause(clause.clone(bq)); } return bq; } @Override - public BooleanQuery clone(DisjunctionMaxQuery newParent, boolean generated) { + public BooleanQuery clone(final DisjunctionMaxQuery newParent, boolean generated) { return clone((BooleanParent) newParent, generated); } @Override - public BooleanClause clone(BooleanQuery newParent) { + public BooleanClause clone(final BooleanQuery newParent) { return clone((BooleanParent) newParent); } @Override - public BooleanQuery clone(BooleanParent newParent, boolean generated) { + public BooleanQuery clone(final BooleanParent newParent, final boolean generated) { BooleanQuery bq = new BooleanQuery(newParent, occur, generated); for (BooleanClause clause : clauses) { bq.addClause(clause.clone(bq, generated)); @@ -54,7 +54,7 @@ public BooleanQuery clone(BooleanParent newParent, boolean generated) { } @Override - public BooleanClause clone(BooleanQuery newParent, boolean generated) { + public BooleanClause clone(final BooleanQuery newParent, final boolean generated) { return clone((BooleanParent) newParent, generated); } diff --git a/querqy-core/src/main/java/querqy/model/NodeVisitor.java b/querqy-core/src/main/java/querqy/model/NodeVisitor.java index 01440d437..118cbb960 100644 --- a/querqy-core/src/main/java/querqy/model/NodeVisitor.java +++ b/querqy-core/src/main/java/querqy/model/NodeVisitor.java @@ -9,14 +9,14 @@ */ public interface NodeVisitor { - public T visit(Query query); + T visit(Query query); - public T visit(DisjunctionMaxQuery disjunctionMaxQuery); + T visit(DisjunctionMaxQuery disjunctionMaxQuery); - public T visit(BooleanQuery booleanQuery); + T visit(BooleanQuery booleanQuery); - public T visit(Term term); + T visit(Term term); - public T visit(RawQuery rawQuery); + T visit(RawQuery rawQuery); } diff --git a/querqy-core/src/main/java/querqy/model/Query.java b/querqy-core/src/main/java/querqy/model/Query.java index ad561ff6a..491bfbb4b 100644 --- a/querqy-core/src/main/java/querqy/model/Query.java +++ b/querqy-core/src/main/java/querqy/model/Query.java @@ -1,33 +1,35 @@ /** - * + * */ package querqy.model; /** - * @author René Kriegler, @renekrie + * The top-level query as entered by the user. * + * @author René Kriegler, @renekrie */ -public class Query extends BooleanQuery { +public class Query extends BooleanQuery { + + public Query() { + super(null, Occur.SHOULD, false); + } + + @Override + public Query clone(BooleanParent newParent) { + Query q = new Query(); + for (BooleanClause clause : clauses) { + q.addClause(clause.clone(q)); + } + return q; + } - public Query() { - super(null, Occur.SHOULD, false); - } + @Override + public Query clone(BooleanParent newParent, boolean generated) { + Query q = new Query(); + for (BooleanClause clause : clauses) { + q.addClause(clause.clone(q, generated)); + } + return q; + } - @Override - public Query clone(BooleanParent newParent) { - Query q = new Query(); - for (BooleanClause clause : clauses) { - q.addClause(clause.clone(q)); - } - return q; - } - - @Override - public Query clone(BooleanParent newParent, boolean generated) { - Query q = new Query(); - for (BooleanClause clause : clauses) { - q.addClause(clause.clone(q, generated)); - } - return q; - } } diff --git a/querqy-core/src/main/java/querqy/model/RawQuery.java b/querqy-core/src/main/java/querqy/model/RawQuery.java index 4c3ab9b76..ee744ebaf 100644 --- a/querqy-core/src/main/java/querqy/model/RawQuery.java +++ b/querqy-core/src/main/java/querqy/model/RawQuery.java @@ -11,8 +11,7 @@ public class RawQuery extends Clause implements QuerqyQuery T accept(NodeVisitor visitor) { + public T accept(final NodeVisitor visitor) { return visitor.visit(this); } @Override - public RawQuery clone(BooleanParent newParent) { + public RawQuery clone(final BooleanParent newParent) { return clone(newParent, this.generated); } @Override - public RawQuery clone(BooleanParent newParent, boolean generated) { + public RawQuery clone(final BooleanParent newParent, final boolean generated) { return new RawQuery(newParent, queryString, occur, generated); } @@ -47,7 +46,7 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) diff --git a/querqy-core/src/main/java/querqy/model/Term.java b/querqy-core/src/main/java/querqy/model/Term.java index 9d225c589..33f3b4a55 100644 --- a/querqy-core/src/main/java/querqy/model/Term.java +++ b/querqy-core/src/main/java/querqy/model/Term.java @@ -19,7 +19,7 @@ public class Term extends AbstractNode implements Disjuncti protected final String field; protected final ComparableCharSequence value; - public Term(DisjunctionMaxQuery parentQuery, String field, CharSequence value, boolean generated) { + public Term(final DisjunctionMaxQuery parentQuery, final String field, final CharSequence value, final boolean generated) { super(parentQuery, generated); this.field = field; this.value = ComparableCharSequence.class.isAssignableFrom(value.getClass()) @@ -27,33 +27,34 @@ public Term(DisjunctionMaxQuery parentQuery, String field, CharSequence value, b : new ComparableCharSequenceWrapper(value); } - public Term(DisjunctionMaxQuery parentQuery, String field, CharSequence value) { + public Term(final DisjunctionMaxQuery parentQuery, final String field, final CharSequence value) { this(parentQuery, field, value, false); } - public Term(DisjunctionMaxQuery parentQuery, CharSequence value) { + public Term(final DisjunctionMaxQuery parentQuery, final CharSequence value) { this(parentQuery, null, value); } - public Term(DisjunctionMaxQuery parentQuery, CharSequence value, boolean generated) { + public Term(final DisjunctionMaxQuery parentQuery, final CharSequence value, final boolean generated) { this(parentQuery, null, value, generated); } - public Term(DisjunctionMaxQuery parentQuery, String field, char[] value, int start, int length, boolean generated) { + public Term(final DisjunctionMaxQuery parentQuery, final String field, final char[] value, + final int start, final int length, final boolean generated) { this(parentQuery, field, new SimpleComparableCharSequence(value, start, length), generated); } @Override - public Term clone(DisjunctionMaxQuery newParent) { + public Term clone(final DisjunctionMaxQuery newParent) { return clone(newParent, isGenerated()); } - public Term clone(DisjunctionMaxQuery newParent, boolean isGenerated) { + public Term clone(final DisjunctionMaxQuery newParent, final boolean isGenerated) { return new Term(newParent, field, value, isGenerated); } @Override - public T accept(NodeVisitor visitor) { + public T accept(final NodeVisitor visitor) { return visitor.visit(this); } @@ -62,7 +63,7 @@ public String getField() { } @Override - public char charAt(int index) { + public char charAt(final int index) { return value.charAt(index); } @@ -81,11 +82,11 @@ public int length() { } @Override - public ComparableCharSequence subSequence(int start, int end) { + public ComparableCharSequence subSequence(final int start, final int end) { return value.subSequence(start, end); } - public ComparableCharSequence toCharSequenceWithField(boolean lowerCaseValue) { + public ComparableCharSequence toCharSequenceWithField(final boolean lowerCaseValue) { ComparableCharSequence valueToUse = lowerCaseValue ? new LowerCaseCharSequence(this) : value; return (field == null) ? valueToUse : new CompoundCharSequence(":", field, valueToUse); } @@ -100,7 +101,7 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/LineParser.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/LineParser.java index 5c1b3231b..f8395d1e7 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/LineParser.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/LineParser.java @@ -196,15 +196,25 @@ public static Object parseBoostInstruction(String line, String lcLine, int lengt String boostLine = line.substring(lengthPredicate).trim(); char ch = boostLine.charAt(0); - if ((ch != '(' && ch != ':')) { - return new ValidationError("Cannot parse line, '(' or ':' expected: " + line); + switch (ch) { + + case '(': if (line.length() < 5) { + return new ValidationError("Cannot parse line, expecting boost factor and ':' after '(' in " + line); + } + break; + + case ':': if (line.length() == 1) { + return new ValidationError("Query expected: " + line); + } + break; + + default: + return new ValidationError("Cannot parse line, '(' or ':' expected: " + line); } + boostLine = boostLine.substring(1).trim(); - if (boostLine.length() == 1) { - return new ValidationError("Query expected: " + line); - } - + float boost = 1f; if (ch == '(') { int pos = boostLine.indexOf(')'); diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/BoostInstruction.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/BoostInstruction.java index 165018688..8addd8814 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/BoostInstruction.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/BoostInstruction.java @@ -1,106 +1,284 @@ /** - * + * */ package querqy.rewrite.commonrules.model; -import java.util.Map; -import java.util.Set; +import java.util.*; -import querqy.model.BoostQuery; -import querqy.model.ExpandedQuery; -import querqy.model.QuerqyQuery; -import querqy.model.Query; +import querqy.ComparableCharSequence; +import querqy.model.*; import querqy.model.Term; import querqy.rewrite.QueryRewriter; /** * @author René Kriegler, @renekrie - * */ public class BoostInstruction implements Instruction { - public enum BoostDirection { - UP, DOWN - } - - final QuerqyQuery query; - final BoostDirection direction; - float boost; - - public BoostInstruction(QuerqyQuery query, BoostDirection direction, float boost) { - if (query == null) { - throw new IllegalArgumentException("query must not be null"); - } - - if (direction == null) { - throw new IllegalArgumentException("direction must not be null"); - } - - this.query = query; - this.direction = direction; - this.boost = boost; - } - - /* (non-Javadoc) - * @see querqy.rewrite.commonrules.model.Instruction#apply(querqy.rewrite.commonrules.model.PositionSequence, - * querqy.rewrite.commonrules.model.TermMatches, int, int, querqy.model.ExpandedQuery, java.util.Map) - */ - @Override - public void apply(PositionSequence sequence, TermMatches termMatches, - int startPosition, int endPosition, ExpandedQuery expandedQuery, Map context) { - BoostQuery bq = new BoostQuery(query.clone(null, true), boost); - if (direction == BoostDirection.DOWN) { - expandedQuery.addBoostDownQuery(bq); - } else { - expandedQuery.addBoostUpQuery(bq); - } - - } - - @Override - public Set getGenerableTerms() { - return (query instanceof Query) - ? TermsCollector.collect((Query) query) - : QueryRewriter.EMPTY_GENERABLE_TERMS; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Float.floatToIntBits(boost); - result = prime * result - + ((direction == null) ? 0 : direction.hashCode()); - result = prime * result + ((query == null) ? 0 : query.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - BoostInstruction other = (BoostInstruction) obj; - if (Float.floatToIntBits(boost) != Float.floatToIntBits(other.boost)) - return false; - if (direction != other.direction) - return false; - if (query == null) { - if (other.query != null) + public enum BoostDirection { + UP, DOWN + } + + final QuerqyQuery query; + final BoostDirection direction; + final boolean hasPlaceHolder; + final float boost; + + public BoostInstruction(final QuerqyQuery query, final BoostDirection direction, final float boost) { + if (query == null) { + throw new IllegalArgumentException("query must not be null"); + } + + if (direction == null) { + throw new IllegalArgumentException("direction must not be null"); + } + + hasPlaceHolder = (query instanceof Query) + ? new ToPlaceHolderTermRewriter().rewritePlaceHolders((Query) query) + : false; + + this.query = query; + this.direction = direction; + this.boost = boost; + } + + /* (non-Javadoc) + * @see querqy.rewrite.commonrules.model.Instruction#apply(querqy.rewrite.commonrules.model.PositionSequence, + * querqy.rewrite.commonrules.model.TermMatches, int, int, querqy.model.ExpandedQuery, + * java.util.Map) + */ + @Override + public void apply(final PositionSequence sequence, final TermMatches termMatches, + final int startPosition, final int endPosition, final ExpandedQuery expandedQuery, + final Map context) { + + final QuerqyQuery q = (hasPlaceHolder) + ? new CloneAndReplacePlaceHolderRewriter(termMatches).cloneAndReplace(query) + : query.clone(null, true); + + final BoostQuery bq = new BoostQuery(q, boost); + if (direction == BoostDirection.DOWN) { + expandedQuery.addBoostDownQuery(bq); + } else { + expandedQuery.addBoostUpQuery(bq); + } + + } + + @Override + public Set getGenerableTerms() { + return (query instanceof Query) + ? TermsCollector.collectGenerableTerms((Query) query) + : QueryRewriter.EMPTY_GENERABLE_TERMS; + } + + public boolean hasPlaceHolderInBoostQuery() { + return hasPlaceHolder; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Float.floatToIntBits(boost); + result = prime * result + + ((direction == null) ? 0 : direction.hashCode()); + result = prime * result + ((query == null) ? 0 : query.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) return false; - } else if (!query.equals(other.query)) - return false; - return true; - } + if (getClass() != obj.getClass()) + return false; + final BoostInstruction other = (BoostInstruction) obj; + if (Float.floatToIntBits(boost) != Float.floatToIntBits(other.boost)) + return false; + if (direction != other.direction) + return false; + if (query == null) { + if (other.query != null) + return false; + } else if (!query.equals(other.query)) + return false; + return true; + } + + @Override + public String toString() { + return "BoostInstruction [query=" + query + ", direction=" + direction + + ", boost=" + boost + "]"; + } + + class CloneAndReplacePlaceHolderRewriter extends AbstractNodeVisitor { + + final TermMatches termMatches; + final LinkedList newParentStack = new LinkedList<>(); + + CloneAndReplacePlaceHolderRewriter(TermMatches termMatches) { + this.termMatches = termMatches; + } + + public QuerqyQuery cloneAndReplace(QuerqyQuery querqyQuery) { + if (querqyQuery instanceof Query) { + return (QuerqyQuery) visit((Query) query); + } else { + return (QuerqyQuery) querqyQuery.accept(this); + } + } + + protected Node getNewParent() { + return newParentStack.isEmpty() ? null : newParentStack.getLast(); + } + + + @Override + public Node visit(final Query query) { + Query clone = new Query(); + newParentStack.add(clone); + for (final BooleanClause clause : query.getClauses()) { + clone.addClause((BooleanClause) clause.accept(this)); + } + newParentStack.removeLast(); + return clone; + } + + @Override + public DisjunctionMaxQuery visit(final DisjunctionMaxQuery disjunctionMaxQuery) { + + + final DisjunctionMaxQuery newDMQ + = new DisjunctionMaxQuery((BooleanQuery) getNewParent(), disjunctionMaxQuery.occur, true); + newParentStack.add(newDMQ); + + for (final DisjunctionMaxClause clause : disjunctionMaxQuery.getClauses()) { + newDMQ.addClause((DisjunctionMaxClause) clause.accept(this)); + } + + newParentStack.removeLast(); + + return newDMQ; + + } + + @Override + public Node visit(final Term term) { + final ComparableCharSequence value = term.getValue(); + if (value instanceof querqy.rewrite.commonrules.model.Term) { + querqy.rewrite.commonrules.model.Term termValue = (querqy.rewrite.commonrules.model.Term) value; + final ComparableCharSequence newValue = termValue.fillPlaceholders(termMatches); + return new Term((DisjunctionMaxQuery) getNewParent(), term.getField(), newValue, true); + } else { + return term.clone((DisjunctionMaxQuery) getNewParent(), true); + } + } + + @Override + public Node visit(final BooleanQuery booleanQuery) { + + final BooleanQuery newBQ + = new BooleanQuery((BooleanParent) getNewParent(), booleanQuery.occur, true); + newParentStack.add(newBQ); + + for (final BooleanClause clause : booleanQuery.getClauses()) { + newBQ.addClause((BooleanClause) clause.accept(this)); + } + newParentStack.removeLast(); + + return newBQ; + + } + + @Override + public Node visit(final RawQuery rawQuery) { + return rawQuery.clone((BooleanParent) getNewParent(), true); + } + + } + + class ToPlaceHolderTermRewriter extends AbstractNodeVisitor { + + private boolean hasPlaceHolder = false; + + + public boolean rewritePlaceHolders(final Query query) { + visit(query); + return hasPlaceHolder; + } + + + @Override + public Node visit(final Query query) { + super.visit(query); + return query; + } + + @Override + public DisjunctionMaxQuery visit(final DisjunctionMaxQuery disjunctionMaxQuery) { + + boolean hasPlaceHolderChild = false; + + final List oldClauses = disjunctionMaxQuery.getClauses(); + + final List newClauses = new ArrayList<>(oldClauses.size()); + + for (final DisjunctionMaxClause clause : oldClauses) { + + final DisjunctionMaxClause mayBeRewritten = (DisjunctionMaxClause) clause.accept(this); + newClauses.add(mayBeRewritten); + hasPlaceHolderChild |= (mayBeRewritten != clause); + } + + if (hasPlaceHolderChild) { + + for (final DisjunctionMaxClause clause : oldClauses) { + disjunctionMaxQuery.removeClause(clause); + } + + for (final DisjunctionMaxClause clause : newClauses) { + disjunctionMaxQuery.addClause(clause); + } + + hasPlaceHolder = true; + } + + + return disjunctionMaxQuery; + } + + @Override + public Node visit(final Term term) { + final String value = term.getValue().toString(); + final int pos = value.indexOf('$'); + if ((pos < 0) || (pos == value.length() - 1) || !Character.isDigit(value.charAt(pos + 1))) { + return term; + } + final querqy.rewrite.commonrules.model.Term charSequence + = new querqy.rewrite.commonrules.model.Term( + value.toCharArray(), + 0, + value.length(), + term.getField() == null ? null : Collections.singletonList(term.getField())); + + return new Term(term.getParent(), term.getField(), charSequence, true); + } - @Override - public String toString() { - return "BoostInstruction [query=" + query + ", direction=" + direction - + ", boost=" + boost + "]"; - } + @Override + public Node visit(final BooleanQuery booleanQuery) { + super.visit(booleanQuery); + return booleanQuery; + } + @Override + public Node visit(final RawQuery rawQuery) { + super.visit(rawQuery); + return rawQuery; + } + } } diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/DeleteInstruction.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/DeleteInstruction.java index 2d7e4b1d2..18e499eb1 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/DeleteInstruction.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/DeleteInstruction.java @@ -3,11 +3,7 @@ */ package querqy.rewrite.commonrules.model; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import querqy.ComparableCharSequence; import querqy.model.BooleanQuery; @@ -23,16 +19,23 @@ public class DeleteInstruction implements Instruction { protected final List termsToDelete; protected final Set charSequencesToDelete; + protected final List prefixesToDeleted; /** * */ - public DeleteInstruction(List termsToDelete) { + public DeleteInstruction(final List termsToDelete) { this.termsToDelete = termsToDelete; charSequencesToDelete = new HashSet<>(); + final List prefixes = new ArrayList<>(); for (Term term : termsToDelete) { - charSequencesToDelete.addAll(term.getCharSequences(true)); + if (term instanceof PrefixTerm) { + prefixes.add((PrefixTerm) term); + } else { + charSequencesToDelete.addAll(term.getCharSequences(true)); + } } + prefixesToDeleted = prefixes.isEmpty() ? null : prefixes; } public List getTermsToDelete() { @@ -59,10 +62,7 @@ public void apply(PositionSequence sequence, TermMatches term for (querqy.model.Term term : position) { - ComparableCharSequence seq = term.toCharSequenceWithField(true); - - - if (pos >= startPosition && pos < endPosition && charSequencesToDelete.contains(seq)) { + if (pos >= startPosition && pos < endPosition && isToBeDeleted(term)) { // TODO: check whether it would be faster to use a LinkedHashMap // for toBeDeleted and then check whether .add(term) returns true if (hasRemaining) { @@ -115,6 +115,17 @@ public void apply(PositionSequence sequence, TermMatches term } + public boolean isToBeDeleted(final querqy.model.Term term) { + if (prefixesToDeleted != null) { + for (final PrefixTerm prefixTerm: prefixesToDeleted) { + if (prefixTerm.isPrefixOf(term)) { + return true; + } + } + } + return charSequencesToDelete.contains(term.toCharSequenceWithField(true)); + } + @Override public Set getGenerableTerms() { return QueryRewriter.EMPTY_GENERABLE_TERMS; diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/FilterInstruction.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/FilterInstruction.java index 30002feca..2bfb6f52d 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/FilterInstruction.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/FilterInstruction.java @@ -20,7 +20,7 @@ public class FilterInstruction implements Instruction { final QuerqyQuery filterQuery; - public FilterInstruction(QuerqyQuery filterQuery) { + public FilterInstruction(final QuerqyQuery filterQuery) { if (filterQuery == null) { throw new IllegalArgumentException("filterQuery must not be null"); } @@ -31,16 +31,17 @@ public FilterInstruction(QuerqyQuery filterQuery) { * @see querqy.rewrite.commonrules.model.Instruction#apply(querqy.rewrite.commonrules.model.PositionSequence, querqy.rewrite.commonrules.model.TermMatches, int, int, querqy.model.ExpandedQuery, java.util.Map) */ @Override - public void apply(PositionSequence sequence, TermMatches termMatches, - int startPosition, int endPosition, ExpandedQuery expandedQuery, Map context) { - expandedQuery.addFilterQuery((QuerqyQuery) filterQuery.clone(null, true)); + public void apply(final PositionSequence sequence, final TermMatches termMatches, + final int startPosition, final int endPosition, final ExpandedQuery expandedQuery, + final Map context) { + expandedQuery.addFilterQuery(filterQuery.clone(null, true)); } @Override public Set getGenerableTerms() { return (filterQuery instanceof Query) - ? TermsCollector.collect((Query) filterQuery) + ? TermsCollector.collectGenerableTerms((Query) filterQuery) : QueryRewriter.EMPTY_GENERABLE_TERMS; } @@ -54,14 +55,14 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; - FilterInstruction other = (FilterInstruction) obj; + final FilterInstruction other = (FilterInstruction) obj; if (filterQuery == null) { if (other.filterQuery != null) return false; diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/PrefixTerm.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/PrefixTerm.java index d5beaebe5..e67c3cdbb 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/PrefixTerm.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/PrefixTerm.java @@ -24,7 +24,7 @@ public PrefixTerm(char[] value, int start, int length, List fieldNames) } - public boolean isPrefixOf(CharSequence other) { + public boolean isPrefixOfCharSequence(final CharSequence other) { for (int i = 0, pos = start, len = Math.min(length, other.length()); i < len; i++) { char ch1 = value[pos++]; char ch2 = other.charAt(i); @@ -34,26 +34,51 @@ public boolean isPrefixOf(CharSequence other) { } return length <= other.length(); } - - @Override - public Term findFirstMatch(Collection haystack) { - for (Term h : haystack) { + public boolean isPrefixOf(final Term other) { - if (isPrefixOf(h)) { + if (isPrefixOfCharSequence(other)) { - if (fieldNames == h.fieldNames) { - return h; - } else { - if (h.fieldNames != null && fieldNames != null) { - for (String name : fieldNames) { - if (h.fieldNames.contains(name)) { - return h; - } + if (fieldNames == other.fieldNames) { + return true; + } else { + if (other.fieldNames != null && fieldNames != null) { + for (String name : fieldNames) { + if (other.fieldNames.contains(name)) { + return true; } } } } + } + + return false; + } + + public boolean isPrefixOf(final querqy.model.Term other) { + + if (isPrefixOfCharSequence(other)) { + + final String otherFieldname = other.getField(); + + if (fieldNames == null) { + return true; + } else if (otherFieldname != null && fieldNames.contains(otherFieldname)){ + return true; + } + } + + return false; + } + + @Override + public Term findFirstMatch(final Collection haystack) { + + for (Term h : haystack) { + + if (isPrefixOf(h)) { + return h; + } } diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/SynonymInstruction.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/SynonymInstruction.java index b8cef1df1..b1a498f06 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/SynonymInstruction.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/SynonymInstruction.java @@ -26,7 +26,7 @@ public class SynonymInstruction implements Instruction { /** * */ - public SynonymInstruction(List synonym) { + public SynonymInstruction(final List synonym) { if (synonym == null || synonym.isEmpty()) { throw new IllegalArgumentException("Synonym expansion required"); } @@ -38,25 +38,26 @@ public SynonymInstruction(List synonym) { * @see querqy.rewrite.commonrules.model.Instruction#apply(querqy.rewrite.commonrules.model.PositionSequence, querqy.rewrite.commonrules.model.TermMatches, int, int, querqy.model.ExpandedQuery, java.util.Map) */ @Override - public void apply(PositionSequence sequence, TermMatches termMatches, - int startPosition, int endPosition, ExpandedQuery expandedQuery, Map context) { + public void apply(final PositionSequence sequence, final TermMatches termMatches, + final int startPosition, final int endPosition, final ExpandedQuery expandedQuery, + final Map context) { switch (termMatches.size()) { case 0: throw new IllegalArgumentException("termMatches must not be empty"); case 1: { - Term match = termMatches.get(0).getQueryTerm(); - DisjunctionMaxQuery parent = match.getParent(); + final Term match = termMatches.get(0).getQueryTerm(); + final DisjunctionMaxQuery parent = match.getParent(); if (synonym.size() == 1) { addSynonymTermToDisjunctionMaxQuery(parent, synonym.get(0), termMatches); } else { - - BooleanQuery bq = new BooleanQuery(match.getParent(), Occur.SHOULD, true); + + final BooleanQuery bq = new BooleanQuery(match.getParent(), Occur.SHOULD, true); match.getParent().addClause(bq); - for (querqy.rewrite.commonrules.model.Term synTerm: synonym) { - DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(bq, Occur.MUST, true); + for (final querqy.rewrite.commonrules.model.Term synTerm: synonym) { + final DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(bq, Occur.MUST, true); bq.addClause(dmq); addSynonymTermToDisjunctionMaxQuery(dmq, synTerm, termMatches); } @@ -65,18 +66,18 @@ public void apply(PositionSequence sequence, TermMatches termMatches, } break; default: - for (TermMatch match: termMatches) { - - DisjunctionMaxQuery clauseDmq = match.getQueryTerm().getParent(); + for (final TermMatch match: termMatches) { + + final DisjunctionMaxQuery clauseDmq = match.getQueryTerm().getParent(); if (synonym.size() == 1) { addSynonymTermToDisjunctionMaxQuery(clauseDmq, synonym.get(0), termMatches); } else { - BooleanQuery bq = new BooleanQuery(clauseDmq, Occur.SHOULD, true); + final BooleanQuery bq = new BooleanQuery(clauseDmq, Occur.SHOULD, true); clauseDmq.addClause(bq); - for (querqy.rewrite.commonrules.model.Term synTerm: synonym) { - DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(bq, Occur.MUST, true); + for (final querqy.rewrite.commonrules.model.Term synTerm: synonym) { + final DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(bq, Occur.MUST, true); bq.addClause(dmq); addSynonymTermToDisjunctionMaxQuery(dmq, synTerm, termMatches); } @@ -89,13 +90,15 @@ public void apply(PositionSequence sequence, TermMatches termMatches, } - protected void addSynonymTermToDisjunctionMaxQuery(DisjunctionMaxQuery dmq, querqy.rewrite.commonrules.model.Term synTerm, TermMatches termMatches) { - List fieldNames = synTerm.getFieldNames(); - ComparableCharSequence charSequence = synTerm.fillPlaceholders(termMatches); + protected void addSynonymTermToDisjunctionMaxQuery(final DisjunctionMaxQuery dmq, + final querqy.rewrite.commonrules.model.Term synTerm, + final TermMatches termMatches) { + final List fieldNames = synTerm.getFieldNames(); + final ComparableCharSequence charSequence = synTerm.fillPlaceholders(termMatches); if (fieldNames == null || fieldNames.isEmpty()) { dmq.addClause(new Term(dmq, charSequence, true)); } else { - for (String fieldName: fieldNames) { + for (final String fieldName: fieldNames) { dmq.addClause(new Term(dmq, fieldName, charSequence, true)); } } @@ -103,14 +106,14 @@ protected void addSynonymTermToDisjunctionMaxQuery(DisjunctionMaxQuery dmq, quer @Override public Set getGenerableTerms() { - Set result = new HashSet(); + final Set result = new HashSet<>(); for (querqy.rewrite.commonrules.model.Term synTerm: synonym) { if (!synTerm.hasPlaceHolder()) { - List fieldNames = synTerm.getFieldNames(); + final List fieldNames = synTerm.getFieldNames(); if (fieldNames == null || fieldNames.isEmpty()) { result.add(new Term(null, synTerm, true)); } else { - for (String fieldName: fieldNames) { + for (final String fieldName: fieldNames) { result.add(new Term(null, fieldName, synTerm, true)); } } @@ -128,14 +131,14 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; - SynonymInstruction other = (SynonymInstruction) obj; + final SynonymInstruction other = (SynonymInstruction) obj; if (synonym == null) { if (other.synonym != null) return false; diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/Term.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/Term.java index d97a739e7..2d6b80406 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/Term.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/Term.java @@ -11,239 +11,243 @@ public class Term implements ComparableCharSequence { - public final String FIELD_CHAR = ":"; - protected final char[] value; - protected final int start; - protected final int length; - protected final List fieldNames; - protected final LinkedList placeHolders; - - public Term(char[] value, int start, int length, List fieldNames) { - if (start + length > value.length) { - throw new ArrayIndexOutOfBoundsException("start + length > value.length"); - } - this.value = value; - this.start = start; - this.length = length; - this.fieldNames = (fieldNames != null && fieldNames.isEmpty()) ? null : fieldNames; - this.placeHolders = parsePlaceHolders(); - } - - private enum ParseState {None, Started, InRef} - - public int getMaxPlaceHolderRef() { - return placeHolders == null ? -1 : placeHolders.getFirst().ref; - } - - public boolean hasPlaceHolder() { - return placeHolders != null && !placeHolders.isEmpty(); - } - - public ComparableCharSequence fillPlaceholders(TermMatches termMatches) { - if (placeHolders == null || placeHolders.isEmpty()) { - return this; - } - List parts = new LinkedList<>(); - int pos = 0; - for (PlaceHolder placeHolder: placeHolders) { - if (placeHolder.start > pos) { - parts.add(subSequence(pos, placeHolder.start)); - } - parts.add(termMatches.getReplacement(placeHolder.ref)); - pos = placeHolder.start + placeHolder.length; - } - if (pos < length) { - parts.add(subSequence(pos, start + length)); - } - return new CompoundCharSequence(null, parts); - } - - protected LinkedList parsePlaceHolders() { - - LinkedList placeHolders = new LinkedList<>(); - - ParseState state = ParseState.None; - int begin = -1; - int end = -1; - - for (int idx = start, last = start + length; idx < last; idx++) { - char ch = value[idx]; - switch (state) { - case None: - if (ch == '$') { - state = ParseState.Started; - } - break; - case Started: - if (Character.isDigit(ch)) { - begin = idx - 1; - end = idx; - state = ParseState.InRef; - } else if (ch != '$') { - state = ParseState.None; - begin = -1; - } - break; - case InRef: - if (Character.isDigit(ch)) { - end = idx; - } else { - int ref = Integer.parseInt(new String(value, begin + 1, end - begin)); - PlaceHolder placeHolder = new PlaceHolder(begin, end - begin + 1, ref); - - if (placeHolders.isEmpty() || placeHolders.getFirst().ref < ref) { - placeHolders.addFirst(placeHolder); - } else { - placeHolders.add(placeHolder); - } - state = ch == '$' ? ParseState.Started : ParseState.None; - } - break; - } - } - if (state == ParseState.InRef) { - int ref = Integer.parseInt(new String(value, begin + 1, end - begin)); - PlaceHolder placeHolder = new PlaceHolder(begin, end - begin + 1, ref); - - if (placeHolders.isEmpty() || placeHolders.getFirst().ref < ref) { - placeHolders.addFirst(placeHolder); - } else { - placeHolders.add(placeHolder); - } - } - - return placeHolders.isEmpty() ? null : placeHolders; - } - - @Override - public char charAt(int idx) { - if (idx >= length) { - throw new ArrayIndexOutOfBoundsException(idx); - } - return value[start + idx]; - } - - @Override - public int compareTo(CharSequence other) { - - for (int i = 0, pos = start, len = Math.min(length, other.length()); i < len; i++) { - char ch1 = value[pos++]; - char ch2 = other.charAt(i); - if (ch1 != ch2) { - return ch1 - ch2; - } - } - - return length - other.length(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - - result = prime * result - + ((fieldNames == null) ? 0 : fieldNames.hashCode()); - result = prime * result + length; - - for (int i = 0; i < length; i++) { - result = prime * result + value[start + i]; - } - - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - - if (!Term.class.isAssignableFrom(obj.getClass())) - return false; - - Term other = (Term) obj; - - if (fieldNames == null) { - if (other.fieldNames != null) + public final String FIELD_CHAR = ":"; + protected final char[] value; + protected final int start; + protected final int length; + protected final List fieldNames; + protected final LinkedList placeHolders; + + public Term(char[] value, int start, int length, List fieldNames) { + if (start + length > value.length) { + throw new ArrayIndexOutOfBoundsException("start + length > value.length"); + } + this.value = value; + this.start = start; + this.length = length; + this.fieldNames = (fieldNames != null && fieldNames.isEmpty()) ? null : fieldNames; + this.placeHolders = parsePlaceHolders(); + } + + private enum ParseState {None, Started, InRef} + + public int getMaxPlaceHolderRef() { + return placeHolders == null ? -1 : placeHolders.getFirst().ref; + } + + public boolean hasPlaceHolder() { + return placeHolders != null && !placeHolders.isEmpty(); + } + + + public ComparableCharSequence fillPlaceholders(final TermMatches termMatches) { + if (placeHolders == null || placeHolders.isEmpty()) { + return this; + } + + final List parts = new LinkedList<>(); + int pos = 0; + + for (final PlaceHolder placeHolder : placeHolders) { + if (placeHolder.start > pos) { + parts.add(subSequence(pos, placeHolder.start)); + } + parts.add(termMatches.getReplacement(placeHolder.ref)); + pos = placeHolder.start + placeHolder.length; + } + if (pos < length) { + parts.add(subSequence(pos, start + length)); + } + return new CompoundCharSequence(parts); + } + + protected LinkedList parsePlaceHolders() { + + final LinkedList placeHolders = new LinkedList<>(); + + ParseState state = ParseState.None; + int begin = -1; + int end = -1; + + for (int idx = start, last = start + length; idx < last; idx++) { + final char ch = value[idx]; + switch (state) { + case None: + if (ch == '$') { + state = ParseState.Started; + } + break; + case Started: + if (Character.isDigit(ch)) { + begin = idx - 1; + end = idx; + state = ParseState.InRef; + } else if (ch != '$') { + state = ParseState.None; + begin = -1; + } + break; + case InRef: + if (Character.isDigit(ch)) { + end = idx; + } else { + final int ref = Integer.parseInt(new String(value, begin + 1, end - begin)); + final PlaceHolder placeHolder = new PlaceHolder(begin, end - begin + 1, ref); + + if (placeHolders.isEmpty() || placeHolders.getFirst().ref < ref) { + placeHolders.addFirst(placeHolder); + } else { + placeHolders.add(placeHolder); + } + state = ch == '$' ? ParseState.Started : ParseState.None; + } + break; + } + } + if (state == ParseState.InRef) { + final int ref = Integer.parseInt(new String(value, begin + 1, end - begin)); + final PlaceHolder placeHolder = new PlaceHolder(begin, end - begin + 1, ref); + + if (placeHolders.isEmpty() || placeHolders.getFirst().ref < ref) { + placeHolders.addFirst(placeHolder); + } else { + placeHolders.add(placeHolder); + } + } + + return placeHolders.isEmpty() ? null : placeHolders; + } + + @Override + public char charAt(final int idx) { + if (idx >= length) { + throw new ArrayIndexOutOfBoundsException(idx); + } + return value[start + idx]; + } + + @Override + public int compareTo(final CharSequence other) { + + for (int i = 0, pos = start, len = Math.min(length, other.length()); i < len; i++) { + char ch1 = value[pos++]; + char ch2 = other.charAt(i); + if (ch1 != ch2) { + return ch1 - ch2; + } + } + + return length - other.length(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + + result = prime * result + + ((fieldNames == null) ? 0 : fieldNames.hashCode()); + result = prime * result + length; + + for (int i = 0; i < length; i++) { + result = prime * result + value[start + i]; + } + + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + + if (!Term.class.isAssignableFrom(obj.getClass())) return false; - } else if (!fieldNames.equals(other.fieldNames)) - return false; - if (length != other.length) - return false; - for (int i = 0; i < length; i++) { - if (value[start + i] != other.value[other.start + i]) { + Term other = (Term) obj; + + if (fieldNames == null) { + if (other.fieldNames != null) + return false; + } else if (!fieldNames.equals(other.fieldNames)) return false; - } - } + if (length != other.length) + return false; + + for (int i = 0; i < length; i++) { + if (value[start + i] != other.value[other.start + i]) { + return false; + } + } - return true; - } + return true; + } - @Override - public String toString() { - return "Term [fieldNames=" - + fieldNames + ", value=" + new String(value, start, length) + "]"; - } + @Override + public String toString() { + return "Term [fieldNames=" + + fieldNames + ", value=" + new String(value, start, length) + "]"; + } - public Term findFirstMatch(Collection haystack) { + public Term findFirstMatch(final Collection haystack) { - for (Term h : haystack) { - if (compareTo(h) == 0) { - if (fieldNames == h.fieldNames) { - return h; - } else { - if (h.fieldNames != null && fieldNames != null) { - for (String name : fieldNames) { - if (h.fieldNames.contains(name)) { - return h; - } - } - } + for (final Term h : haystack) { + if (compareTo(h) == 0) { + if (fieldNames == h.fieldNames) { + return h; + } else { + if (h.fieldNames != null && fieldNames != null) { + for (final String name : fieldNames) { + if (h.fieldNames.contains(name)) { + return h; + } + } + } + } } - } - } - - return null; - } - - @Override - public int length() { - return length; - } - - @Override - public ComparableCharSequence subSequence(int start, int end) { - if (end > length) { - throw new ArrayIndexOutOfBoundsException(end); - } - if (start < 0) { - throw new ArrayIndexOutOfBoundsException(start); - } - - return new SimpleComparableCharSequence(value, this.start + start, end - start); - } - - public List getCharSequences(boolean lowerCaseValue) { - - SimpleComparableCharSequence seq = new SimpleComparableCharSequence(value, start, length); - - ComparableCharSequence valueSequence = lowerCaseValue ? new LowerCaseCharSequence(seq) : seq; - - List seqs = new LinkedList<>(); - - if (fieldNames == null) { - seqs.add(valueSequence); - } else { - for (String name : fieldNames) { - seqs.add(new CompoundCharSequence(FIELD_CHAR, name, valueSequence)); - } - } - - return seqs; - } + } + + return null; + } + + @Override + public int length() { + return length; + } + + @Override + public ComparableCharSequence subSequence(final int start, final int end) { + if (end > length) { + throw new ArrayIndexOutOfBoundsException(end); + } + if (start < 0) { + throw new ArrayIndexOutOfBoundsException(start); + } + + return new SimpleComparableCharSequence(value, this.start + start, end - start); + } + + + public List getCharSequences(final boolean lowerCaseValue) { + + final SimpleComparableCharSequence seq = new SimpleComparableCharSequence(value, start, length); + + final ComparableCharSequence valueSequence = lowerCaseValue ? new LowerCaseCharSequence(seq) : seq; + + final List seqs = new LinkedList<>(); + + if (fieldNames == null) { + seqs.add(valueSequence); + } else { + for (final String name : fieldNames) { + seqs.add(new CompoundCharSequence(FIELD_CHAR, name, valueSequence)); + } + } + + return seqs; + } public List getFieldNames() { return fieldNames; @@ -252,7 +256,6 @@ public List getFieldNames() { public LinkedList getPlaceHolders() { return placeHolders; } - - + } \ No newline at end of file diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermMatches.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermMatches.java index 81014328f..cc08a7ea2 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermMatches.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermMatches.java @@ -27,23 +27,23 @@ public TermMatches() { super(); } - public TermMatches(Collection c) { + public TermMatches(final Collection c) { super(); - for (TermMatch match: c) { + for (final TermMatch match: c) { add(match); } } - public TermMatches(TermMatch match) { + public TermMatches(final TermMatch match) { super(); add(match); } - public ComparableCharSequence getReplacement(int position) { + public ComparableCharSequence getReplacement(final int position) { if (replacements == null) { throw new IndexOutOfBoundsException(Integer.toString(position)); } - ComparableCharSequence replacement = replacements.get(position); + final ComparableCharSequence replacement = replacements.get(position); if (replacement == null) { throw new IndexOutOfBoundsException(Integer.toString(position)); } @@ -52,7 +52,7 @@ public ComparableCharSequence getReplacement(int position) { } @Override - public boolean add(TermMatch match) { + public boolean add(final TermMatch match) { if (match.isPrefix) { updateReplacements(match); } @@ -60,31 +60,31 @@ public boolean add(TermMatch match) { } @Override - public void add(int index, TermMatch match) { + public void add(final int index, final TermMatch match) { throw new UnsupportedOperationException(); } @Override - public void addFirst(TermMatch match) { - Map newReplacements = new HashMap<>(); + public void addFirst(final TermMatch match) { + final Map newReplacements = new HashMap<>(); newReplacements.put(1, match.getWildcardMatch()); - for (Map.Entry entry : replacements.entrySet()) { + for (final Map.Entry entry : replacements.entrySet()) { newReplacements.put(entry.getKey() + 1, entry.getValue()); } replacements = newReplacements; } @Override - public boolean addAll(Collection c) { - for (TermMatch match: c) { + public boolean addAll(final Collection c) { + for (final TermMatch match: c) { updateReplacements(match); } return super.addAll(c); } - protected void updateReplacements(TermMatch match) { + protected void updateReplacements(final TermMatch match) { if (replacements == null) { - replacements = new HashMap(); + replacements = new HashMap<>(); } replacements.put(replacements.size() + 1, match.getWildcardMatch()); } diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermsCollector.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermsCollector.java index f73ae3ff7..e36c62e95 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermsCollector.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TermsCollector.java @@ -6,15 +6,20 @@ import java.util.HashSet; import java.util.Set; +import querqy.ComparableCharSequence; import querqy.model.AbstractNodeVisitor; import querqy.model.Query; import querqy.model.Term; /** + * + * Utility class that collects 'generable terms'. These are the terms from boost queries or filter queries + * as part of rewrite rules. Terms that contain placeholders will not be collected. + * * @author rene * */ -public class TermsCollector extends AbstractNodeVisitor { +class TermsCollector extends AbstractNodeVisitor { protected final Set result = new HashSet(); @@ -27,13 +32,20 @@ public Set getResult() { } @Override - public Term visit(Term term) { + public Term visit(final Term term) { + final ComparableCharSequence value = term.getValue(); + if (value instanceof querqy.rewrite.commonrules.model.Term) { + if (((querqy.rewrite.commonrules.model.Term) value).hasPlaceHolder()) { + // a term with a placeholder cannot be generated as such + return term; + } + } result.add(term); return term; } - public static Set collect(Query query) { - TermsCollector collector = new TermsCollector(); + public static Set collectGenerableTerms(final Query query) { + final TermsCollector collector = new TermsCollector(); collector.visit(query); return collector.getResult(); } diff --git a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TrieMapRulesCollection.java b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TrieMapRulesCollection.java index ffb51112f..8fce6de68 100644 --- a/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TrieMapRulesCollection.java +++ b/querqy-core/src/main/java/querqy/rewrite/commonrules/model/TrieMapRulesCollection.java @@ -39,8 +39,8 @@ public TrieMapRulesCollection(TrieMap> trieMap, boolean ignor * @see querqy.rewrite.commonrules.model.RulesCollection#getRewriteActions(querqy.rewrite.commonrules.model.PositionSequence) */ @Override - public List getRewriteActions(PositionSequence sequence) { - List result = new ArrayList<>(); + public List getRewriteActions(final PositionSequence sequence) { + final List result = new ArrayList<>(); if (sequence.isEmpty()) { return result; } @@ -50,18 +50,18 @@ public List getRewriteActions(PositionSequence seq // positions and look them up as rules input in the dictionary // LinkedList> positions = sequence.getPositions(); if (sequence.size() == 1) { - for (Term term : new ClassFilter<>(sequence.getFirst(), Term.class)) { - - States> states = trieMap.get(term.toCharSequenceWithField(ignoreCase)); - - State> stateExactMatch = states.getStateForCompleteSequence(); + for (final Term term : new ClassFilter<>(sequence.getFirst(), Term.class)) { + + final States> states = trieMap.get(term.toCharSequenceWithField(ignoreCase)); + + final State> stateExactMatch = states.getStateForCompleteSequence(); if (stateExactMatch.isFinal() && stateExactMatch.value != null) { result.add(new Action(stateExactMatch.value, new TermMatches(new TermMatch(term)), 0, 1)); } - - List>> statesForPrefixes = states.getPrefixes(); + + final List>> statesForPrefixes = states.getPrefixes(); if (statesForPrefixes != null) { - for (State> stateForPrefix: statesForPrefixes) { + for (final State> stateForPrefix: statesForPrefixes) { if (stateForPrefix.isFinal() && stateForPrefix.value != null) { result.add( @@ -83,16 +83,16 @@ public List getRewriteActions(PositionSequence seq int pos = 0; - for (List position : sequence) { + for (final List position : sequence) { boolean anyTermAtPosition = false; - for (InputSequenceElement element : position) { - - boolean isTerm = element instanceof Term; + for (final InputSequenceElement element : position) { + + final boolean isTerm = element instanceof Term; anyTermAtPosition |= isTerm; - - CharSequence charSequenceForLookup = null; + + final CharSequence charSequenceForLookup; if (isTerm) { charSequenceForLookup = ((Term) element).toCharSequenceWithField(ignoreCase); } else if (element instanceof InputBoundary) { @@ -102,22 +102,24 @@ public List getRewriteActions(PositionSequence seq } // combine term with prefixes (= sequences of terms) that brought us here - for (Prefix> prefix : prefixes) { - - States> states = trieMap.get( + for (final Prefix> prefix : prefixes) { + + final States> states = trieMap.get( new CompoundCharSequence(null, " ", charSequenceForLookup), prefix.stateInfo); - - int ofs = isTerm ? 1 : 0; + + final int ofs = isTerm ? 1 : 0; // exact matches - State> stateExactMatch = states.getStateForCompleteSequence(); + final State> stateExactMatch = states.getStateForCompleteSequence(); if (stateExactMatch.isKnown()) { if (stateExactMatch.isFinal()) { - TermMatches matches = new TermMatches(prefix.matches); - if (isTerm) matches.add(new TermMatch((Term) element)); + final TermMatches matches = new TermMatches(prefix.matches); + if (isTerm) { + matches.add(new TermMatch((Term) element)); + } result.add(new Action( stateExactMatch.value, matches, pos - matches.size() + ofs, pos + ofs)); } - Prefix> newPrefix = new Prefix>(prefix, stateExactMatch); + final Prefix> newPrefix = new Prefix>(prefix, stateExactMatch); if (isTerm) { newPrefix.addTerm(new TermMatch((Term) element)); } @@ -126,14 +128,14 @@ public List getRewriteActions(PositionSequence seq } // matches for prefixes (= beginnings of terms) - List>> statesForPrefixes = states.getPrefixes(); + final List>> statesForPrefixes = states.getPrefixes(); if (statesForPrefixes != null) { - for (State> stateForPrefix: statesForPrefixes) { + for (final State> stateForPrefix: statesForPrefixes) { if (stateForPrefix.isFinal() && stateForPrefix.value != null) { - TermMatches matches = new TermMatches(prefix.matches); + final TermMatches matches = new TermMatches(prefix.matches); if (isTerm) { - Term term = (Term) element; + final Term term = (Term) element; matches.add( new TermMatch(term, true, @@ -149,9 +151,9 @@ public List getRewriteActions(PositionSequence seq } // now see whether the term matches on its own... - States> states = trieMap.get(charSequenceForLookup); - - State> stateExactMatch = states.getStateForCompleteSequence(); + final States> states = trieMap.get(charSequenceForLookup); + + final State> stateExactMatch = states.getStateForCompleteSequence(); if (stateExactMatch.isKnown()) { if (stateExactMatch.isFinal()) { // we do not let match the boundary on its own: @@ -160,18 +162,18 @@ public List getRewriteActions(PositionSequence seq } } // ... and save it as a prefix to the following term - Prefix> newPrefix = isTerm - ? new Prefix>(new TermMatch((Term) element), stateExactMatch) - : new Prefix>(stateExactMatch); - newPrefixes.add(new Prefix>(newPrefix, stateExactMatch)); + final Prefix> newPrefix = isTerm + ? new Prefix<>(new TermMatch((Term) element), stateExactMatch) + : new Prefix<>(stateExactMatch); + newPrefixes.add(new Prefix<>(newPrefix, stateExactMatch)); } - - List>> statesForPrefixes = states.getPrefixes(); + + final List>> statesForPrefixes = states.getPrefixes(); if (statesForPrefixes != null) { - for (State> stateForPrefix: statesForPrefixes) { + for (final State> stateForPrefix: statesForPrefixes) { if (stateForPrefix.isFinal() && stateForPrefix.value != null) { if (isTerm) { - Term term = (Term) element; + final Term term = (Term) element; result.add(new Action( stateForPrefix.value, new TermMatches(new TermMatch(term, true, term.subSequence(stateForPrefix.index + 1, term.length()))), pos, pos + 1)); // TODO: continue with next match after prefix match } @@ -196,8 +198,8 @@ public List getRewriteActions(PositionSequence seq @Override public Set getInstructions() { - - Set result = new HashSet(); + + final Set result = new HashSet(); for (List instructionsList: trieMap) { for (Instructions instructions: instructionsList) { @@ -208,45 +210,34 @@ public Set getInstructions() { return result; } - - CharSequence getCharSequenceForLookup(InputSequenceElement element) { - if (element instanceof InputBoundary) { - return BOUNDARY_WORD; - } else if (element instanceof Term) { - return ((Term) element).toCharSequenceWithField(ignoreCase); - } else { - throw new IllegalArgumentException("Cannot handle sequence element type: " + element.getClass().getName()); - } - } - public static class Prefix { - State stateInfo; - List matches; + final State stateInfo; + final List matches; - public Prefix(Prefix prefix, TermMatch match, State stateInfo) { + public Prefix(final Prefix prefix, final TermMatch match, final State stateInfo) { matches = new LinkedList<>(prefix.matches); addTerm(match); this.stateInfo = stateInfo; } - public Prefix(Prefix prefix, State stateInfo) { + public Prefix(final Prefix prefix, final State stateInfo) { matches = new LinkedList<>(prefix.matches); this.stateInfo = stateInfo; } - public Prefix(TermMatch match, State stateInfo) { + public Prefix(final TermMatch match, final State stateInfo) { matches = new LinkedList<>(); matches.add(match); this.stateInfo = stateInfo; } - public Prefix(State stateInfo) { + public Prefix(final State stateInfo) { matches = new LinkedList<>(); this.stateInfo = stateInfo; } - private void addTerm(TermMatch term) { + private void addTerm(final TermMatch term) { matches.add(term); } diff --git a/querqy-core/src/test/java/querqy/rewrite/commonrules/LineParserTest.java b/querqy-core/src/test/java/querqy/rewrite/commonrules/LineParserTest.java index da807d014..f0d618eae 100644 --- a/querqy-core/src/test/java/querqy/rewrite/commonrules/LineParserTest.java +++ b/querqy-core/src/test/java/querqy/rewrite/commonrules/LineParserTest.java @@ -12,10 +12,9 @@ import org.hamcrest.TypeSafeMatcher; import org.junit.Test; -import querqy.rewrite.commonrules.model.DecorateInstruction; -import querqy.rewrite.commonrules.model.Input; -import querqy.rewrite.commonrules.model.PrefixTerm; -import querqy.rewrite.commonrules.model.Term; +import querqy.parser.WhiteSpaceQuerqyParserFactory; +import querqy.rewrite.commonrules.model.*; +import querqy.rewrite.commonrules.model.BoostInstruction.BoostDirection; public class LineParserTest { @@ -156,8 +155,35 @@ public void testThatBoundariesAreParsedInOtherwiseEmptyInput() throws Exception assertTrue(input.requiresLeftBoundary()); assertTrue(input.requiresRightBoundary()); } - - + + @Test + public void testThatBoostInstructionWithSingleLetterTermIsAccepted() throws Exception { + String line = "UP: x"; + String lcLine = line.toLowerCase(); + final Object instruction = LineParser + .parseBoostInstruction(line, lcLine, 2, BoostDirection.UP, new WhiteSpaceQuerqyParserFactory()); + assertTrue(instruction instanceof BoostInstruction); + } + + @Test + public void testThatBoostInstructionWithSingleLetterTermAndBoostFactorIsAccepted() throws Exception { + String line = "UP(5): x"; + String lcLine = line.toLowerCase(); + final Object instruction = LineParser + .parseBoostInstruction(line, lcLine, 2, BoostDirection.UP, new WhiteSpaceQuerqyParserFactory()); + assertTrue(instruction instanceof BoostInstruction); + } + + @Test + public void testThatPlayholdersAreParsedForBoostInstruction() throws Exception { + String line = "UP(500): 3$1"; + String lcLine = line.toLowerCase(); + final Object instruction = LineParser + .parseBoostInstruction(line, lcLine, 2, BoostDirection.UP, new WhiteSpaceQuerqyParserFactory()); + assertTrue(instruction instanceof BoostInstruction); + assertTrue(((BoostInstruction) instruction).hasPlaceHolderInBoostQuery()); + } + @SuppressWarnings("unchecked") @Test public void testParseTermExpressionSingleTerm() { diff --git a/querqy-core/src/test/java/querqy/rewrite/commonrules/model/BoostInstructionTest.java b/querqy-core/src/test/java/querqy/rewrite/commonrules/model/BoostInstructionTest.java index 340f8dda9..5ac37b5ba 100644 --- a/querqy-core/src/test/java/querqy/rewrite/commonrules/model/BoostInstructionTest.java +++ b/querqy-core/src/test/java/querqy/rewrite/commonrules/model/BoostInstructionTest.java @@ -12,12 +12,15 @@ import java.util.Collections; import java.util.Map; +import org.junit.Assert; import org.junit.Test; import querqy.model.BoostQuery; import querqy.model.ExpandedQuery; +import querqy.model.Query; import querqy.rewrite.commonrules.AbstractCommonRulesTest; import querqy.rewrite.commonrules.CommonRulesRewriter; +import querqy.rewrite.commonrules.LineParser; import querqy.rewrite.commonrules.model.BoostInstruction.BoostDirection; public class BoostInstructionTest extends AbstractCommonRulesTest { @@ -42,9 +45,7 @@ public void testThatBoostQueriesAreMarkedAsGenerated() { contains( boostQ( bq( - dmq( - term("a", true) - ), + dmq(term("a", true)), dmq( term("b", true)) ), 0.5f @@ -55,4 +56,161 @@ public void testThatBoostQueriesAreMarkedAsGenerated() { } + @Test + public void testThatUpQueriesAreOfTypeQuery() throws Exception { + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a b").getUserQuery(), BoostDirection.UP, 0.5f); + builder.addRule(new Input(Arrays.asList(mkTerm("x")), false, false), new Instructions(Arrays.asList((Instruction) boostInstruction))); + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + ExpandedQuery query = makeQuery("x"); + Collection upQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostUpQueries(); + for (BoostQuery bq : upQueries) { + Assert.assertTrue(bq.getQuery() instanceof Query); + } + + } + + @Test + public void testThatDownQueriesAreOfTypeQuery() throws Exception { + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a b$1").getUserQuery(), BoostDirection.DOWN, 0.2f); + + builder.addRule((Input) LineParser.parseInput("x k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x klm y"); + + + Collection downQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostDownQueries(); + + + for (BoostQuery bq : downQueries) { + Assert.assertTrue(bq.getQuery() instanceof Query); + } + + } + + @Test + public void testThatPlaceHolderGetsReplaced() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a b$1").getUserQuery(), BoostDirection.DOWN, 0.2f); + + builder.addRule((Input) LineParser.parseInput("x k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x klm y"); + + + Collection downQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostDownQueries(); + + assertThat(downQueries, + contains( + boostQ( + bq( + dmq( term("a", true)), + dmq( term("blm", true)) + ), + 0.2f + + ))); + + + + + + + + } + + + @Test + public void testThatPlaceHolderGetsReplacedAsASeperateToken() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a $1").getUserQuery(), BoostDirection.DOWN, 0.3f); + + builder.addRule((Input) LineParser.parseInput("x k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x klm y"); + + + Collection downQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostDownQueries(); + + assertThat(downQueries, + contains( + boostQ( + bq( + dmq( term("a", true)), + dmq( term("lm", true)) + ), + 0.3f + + ))); + + + + + + + + } + + @Test + public void testThatPlaceHolderGetsReplacedAsAnInfix() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + BoostInstruction boostInstruction = new BoostInstruction(makeQuery("a c$1d").getUserQuery(), BoostDirection.UP, 0.3f); + + builder.addRule((Input) LineParser.parseInput("k*"), new Instructions(Collections.singletonList((Instruction) boostInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x klm y"); + + + Collection upQueries = rewriter.rewrite(query, EMPTY_CONTEXT).getBoostUpQueries(); + + assertThat(upQueries, + contains( + boostQ( + bq( + dmq( term("a", true)), + dmq( term("clmd", true)) + ), + 0.3f + + ))); + + + + + + + + } } diff --git a/querqy-core/src/test/java/querqy/rewrite/commonrules/model/DeleteInstructionTest.java b/querqy-core/src/test/java/querqy/rewrite/commonrules/model/DeleteInstructionTest.java index d2de1f03c..f49ff434d 100644 --- a/querqy-core/src/test/java/querqy/rewrite/commonrules/model/DeleteInstructionTest.java +++ b/querqy-core/src/test/java/querqy/rewrite/commonrules/model/DeleteInstructionTest.java @@ -1,19 +1,24 @@ package querqy.rewrite.commonrules.model; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; import static querqy.QuerqyMatchers.*; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Map; import org.junit.Test; +import querqy.model.BoostQuery; import querqy.model.DisjunctionMaxQuery; import querqy.model.ExpandedQuery; import querqy.model.Query; import querqy.rewrite.commonrules.AbstractCommonRulesTest; import querqy.rewrite.commonrules.CommonRulesRewriter; +import querqy.rewrite.commonrules.LineParser; import querqy.rewrite.commonrules.model.DeleteInstruction; import querqy.rewrite.commonrules.model.Input; import querqy.rewrite.commonrules.model.Instruction; @@ -131,4 +136,101 @@ public void testThatTermIsNotRemovedOnceIfThereASecondDMQWithTheSameTermAndNoOth )); } + @Test + public void testThatDeleteIsAppliedToWildcardInput() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + + Input input = (Input) LineParser.parseInput("k*"); + + DeleteInstruction deleteInstruction = new DeleteInstruction(input.getInputTerms()); + + builder.addRule(input, new Instructions(Collections.singletonList((Instruction) deleteInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x klm"); + + + Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); + + + assertThat(rewritten, + bq( + dmq( + term("x") + ) + )); + + + } + + @Test + public void testThatDeleteIsAppliedToMultiTermWildcardInput() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + + Input input = (Input) LineParser.parseInput("ab k*"); + + DeleteInstruction deleteInstruction = new DeleteInstruction(input.getInputTerms()); + + builder.addRule(input, new Instructions(Collections.singletonList((Instruction) deleteInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("x ab klm"); + + + Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); + + + assertThat(rewritten, + bq( + dmq( + term("x") + ) + )); + + + } + + @Test + public void testThatWilcardTermIsNotDeletedIfItIsTheOnlyQueryTerm() throws Exception { + + RulesCollectionBuilder builder = new TrieMapRulesCollectionBuilder(false); + + Input input = (Input) LineParser.parseInput("k*"); + + DeleteInstruction deleteInstruction = new DeleteInstruction(input.getInputTerms()); + + builder.addRule(input, new Instructions(Collections.singletonList((Instruction) deleteInstruction))); + + + RulesCollection rules = builder.build(); + CommonRulesRewriter rewriter = new CommonRulesRewriter(rules); + + + ExpandedQuery query = makeQuery("klm"); + + + Query rewritten = rewriter.rewrite(query, EMPTY_CONTEXT).getUserQuery(); + + + assertThat(rewritten, + bq( + dmq( + term("klm") + ) + )); + + + } } diff --git a/querqy-for-lucene/pom.xml b/querqy-for-lucene/pom.xml new file mode 100644 index 000000000..f2f1bdc15 --- /dev/null +++ b/querqy-for-lucene/pom.xml @@ -0,0 +1,156 @@ + + 4.0.0 + + querqy + querqy-for-lucene + 3.1.0-SNAPSHOT + pom + + + git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + scm:git:git@github.com:renekrie/querqy.git + HEAD + + + + 3.2.0 + + + + UTF-8 + 3.0.5 + 3.0.2 + 6.1.0 + 2.1 + 4.11 + 1.3 + 1.10.19 + + + + querqy-lucene + querqy-solr + + + + + querqy-repo + Querqy repo + http://dl.bintray.com/renekrie/maven + + + + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest-core + + + + + org.mockito + mockito-core + ${mockito.version} + test + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19 + + + Lucene60 + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + + + maven-release-plugin + 2.5.3 + + false + release + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + + + + **/*Test.class + + + + + + + clean + + + + + + + + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + + + + + + + bintray-rene-maven + renekrie-maven-querqy-for-lucene + https://api.bintray.com/maven/renekrie/maven/querqy-for-lucene + + + diff --git a/querqy-lucene/pom.xml b/querqy-for-lucene/querqy-lucene/pom.xml similarity index 54% rename from querqy-lucene/pom.xml rename to querqy-for-lucene/querqy-lucene/pom.xml index 607a5f9c1..cf92d1e33 100644 --- a/querqy-lucene/pom.xml +++ b/querqy-for-lucene/querqy-lucene/pom.xml @@ -1,15 +1,16 @@ - - 4.0.0 - - - querqy - querqy-parent - 3.1.0-SNAPSHOT - - querqy-lucene - - - @@ -19,47 +20,47 @@ ${lucene.version} test - - - - commons-io - commons-io - ${commons.io.version} - - - - ${project.groupId} - querqy-core - ${project.version} - - - - ${project.groupId} - querqy-core - ${project.version} - test-jar - test - - - - ${project.groupId} - querqy-antlr - ${project.version} - true - - - - org.apache.lucene - lucene-analyzers-common - ${lucene.version} - provided - - - - - - - + + + + commons-io + commons-io + ${commons.io.version} + + + + ${project.groupId} + querqy-core + ${querqy.core.version} + + + + ${project.groupId} + querqy-core + ${querqy.core.version} + test-jar + test + + + + ${project.groupId} + querqy-antlr + ${querqy.antlr.version} + true + + + + org.apache.lucene + lucene-analyzers-common + ${lucene.version} + provided + + + + + + + org.apache.maven.plugins @@ -100,7 +101,7 @@ - + - + diff --git a/querqy-lucene/src/main/java/querqy/lucene/LuceneQueryUtil.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/LuceneQueryUtil.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/LuceneQueryUtil.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/LuceneQueryUtil.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParser.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParser.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParser.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParser.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriter.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriter.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriter.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriter.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequence.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequence.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequence.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequence.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequences.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequences.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequences.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/contrib/rewrite/Sequences.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/AbstractDocumentFrequencyAndTermContextProvider.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/AbstractDocumentFrequencyAndTermContextProvider.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/AbstractDocumentFrequencyAndTermContextProvider.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/AbstractDocumentFrequencyAndTermContextProvider.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/BooleanQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/BooleanQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/BooleanQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/BooleanQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/ConstantFieldBoost.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/ConstantFieldBoost.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/ConstantFieldBoost.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/ConstantFieldBoost.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/DependentTermQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DependentTermQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/DependentTermQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DependentTermQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/DisjunctionMaxQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DisjunctionMaxQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/DisjunctionMaxQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DisjunctionMaxQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyAndTermContextProvider.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyAndTermContextProvider.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyAndTermContextProvider.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyAndTermContextProvider.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyCorrection.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyCorrection.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyCorrection.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/DocumentFrequencyCorrection.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/FieldBoost.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/FieldBoost.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/FieldBoost.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/FieldBoost.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/IndependentFieldBoost.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/IndependentFieldBoost.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/IndependentFieldBoost.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/IndependentFieldBoost.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryBuilder.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryBuilder.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryBuilder.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryBuilder.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactoryAndPRMSQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactoryAndPRMSQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactoryAndPRMSQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/LuceneQueryFactoryAndPRMSQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/NeverMatchQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/NeverMatchQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/NeverMatchQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/NeverMatchQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/SearchFieldsAndBoosting.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/SearchFieldsAndBoosting.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/SearchFieldsAndBoosting.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/SearchFieldsAndBoosting.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProvider.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProvider.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProvider.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProvider.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermBoostQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermBoostQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/TermBoostQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermBoostQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/TermQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermScorer.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermScorer.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/TermScorer.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermScorer.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryBuilder.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryBuilder.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryBuilder.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryBuilder.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryFactory.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryFactory.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryFactory.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/TermSubQueryFactory.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/CacheKey.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/CacheKey.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/CacheKey.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/CacheKey.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCache.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCache.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCache.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCache.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCacheValue.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCacheValue.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCacheValue.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/cache/TermQueryCacheValue.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSAndQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSAndQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSAndQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSAndQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSFieldBoost.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSFieldBoost.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSFieldBoost.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSFieldBoost.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSQuery.java diff --git a/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSTermQuery.java b/querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSTermQuery.java similarity index 100% rename from querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSTermQuery.java rename to querqy-for-lucene/querqy-lucene/src/main/java/querqy/lucene/rewrite/prms/PRMSTermQuery.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParserTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParserTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParserTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/contrib/parser/AnalyzingQuerqyParserTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/contrib/rewrite/LuceneSynonymsRewriterTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/AbstractLuceneQueryTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/AbstractLuceneQueryTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/AbstractLuceneQueryTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/AbstractLuceneQueryTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/ConstantFieldBoostTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/ConstantFieldBoostTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/ConstantFieldBoostTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/ConstantFieldBoostTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/DependentTermQueryTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/DependentTermQueryTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/DependentTermQueryTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/DependentTermQueryTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/DocumentFrequencyCorrectionTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/DocumentFrequencyCorrectionTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/DocumentFrequencyCorrectionTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/DocumentFrequencyCorrectionTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/LuceneQueryBuilderTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/LuceneQueryBuilderTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/LuceneQueryBuilderTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/LuceneQueryBuilderTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProviderTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProviderTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProviderTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/StandardDocumentFrequencyAndTermContextProviderTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermBoostQueryTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermBoostQueryTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/TermBoostQueryTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermBoostQueryTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermSubQueryBuilderTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermSubQueryBuilderTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/TermSubQueryBuilderTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TermSubQueryBuilderTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/TestUtil.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TestUtil.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/TestUtil.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/TestUtil.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSAndQueryTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSAndQueryTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSAndQueryTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSAndQueryTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQueryTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQueryTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQueryTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSDisjunctionMaxQueryTest.java diff --git a/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSFieldBoostTest.java b/querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSFieldBoostTest.java similarity index 100% rename from querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSFieldBoostTest.java rename to querqy-for-lucene/querqy-lucene/src/test/java/querqy/lucene/rewrite/prms/PRMSFieldBoostTest.java diff --git a/querqy-for-lucene/querqy-solr/pom.xml b/querqy-for-lucene/querqy-solr/pom.xml new file mode 100644 index 000000000..821f924b1 --- /dev/null +++ b/querqy-for-lucene/querqy-solr/pom.xml @@ -0,0 +1,126 @@ + + 4.0.0 + + + querqy + querqy-for-lucene + 3.1.0-SNAPSHOT + + + querqy-solr + + + + + org.apache.solr + solr-test-framework + ${lucene.version} + test + + + + commons-io + commons-io + ${commons.io.version} + provided + + + + ${project.groupId} + querqy-lucene + ${project.version} + + + + ${project.groupId} + querqy-antlr + ${querqy.antlr.version} + + + + org.apache.solr + solr-core + ${lucene.version} + provided + + + + + commons-logging + commons-logging + 1.1.3 + test + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + ${project.artifactId}-${lucene.version}-${project.version} + + + + package + + jar + + + + + + + org.apache.maven.plugins + maven-source-plugin + + ${project.artifactId}-${lucene.version}-${project.version} + + + + attach-sources + + jar + + + + + + + + maven-assembly-plugin + + + ${project.artifactId}-${lucene.version}-${project.version} + + jar-with-dependencies + + + + + package + + single + + + + + + + maven-release-plugin + + ${project.artifactId}-${lucene.version}-${project.version} + + + + + + diff --git a/querqy-solr/src/main/java/querqy/solr/AbstractQuerqyDismaxQParserPlugin.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/AbstractQuerqyDismaxQParserPlugin.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/AbstractQuerqyDismaxQParserPlugin.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/AbstractQuerqyDismaxQParserPlugin.java diff --git a/querqy-solr/src/main/java/querqy/solr/DefaultQuerqyDismaxQParserPlugin.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/DefaultQuerqyDismaxQParserPlugin.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/DefaultQuerqyDismaxQParserPlugin.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/DefaultQuerqyDismaxQParserPlugin.java diff --git a/querqy-solr/src/main/java/querqy/solr/QuerqyDismaxQParser.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyDismaxQParser.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/QuerqyDismaxQParser.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyDismaxQParser.java diff --git a/querqy-solr/src/main/java/querqy/solr/QuerqyQueryComponent.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyQueryComponent.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/QuerqyQueryComponent.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyQueryComponent.java diff --git a/querqy-solr/src/main/java/querqy/solr/QuerqyReRankQuery.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyReRankQuery.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/QuerqyReRankQuery.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/QuerqyReRankQuery.java diff --git a/querqy-solr/src/main/java/querqy/solr/RewriterFactoryAdapter.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/RewriterFactoryAdapter.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/RewriterFactoryAdapter.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/RewriterFactoryAdapter.java diff --git a/querqy-solr/src/main/java/querqy/solr/SimpleCommonRulesRewriterFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SimpleCommonRulesRewriterFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/SimpleCommonRulesRewriterFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SimpleCommonRulesRewriterFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/SimpleQuerqyQParserFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SimpleQuerqyQParserFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/SimpleQuerqyQParserFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SimpleQuerqyQParserFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/SolrQuerqyParserFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SolrQuerqyParserFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/SolrQuerqyParserFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SolrQuerqyParserFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/SolrTermQueryCacheAdapter.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SolrTermQueryCacheAdapter.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/SolrTermQueryCacheAdapter.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SolrTermQueryCacheAdapter.java diff --git a/querqy-solr/src/main/java/querqy/solr/SynonymFormatCommonRulesRewriterFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SynonymFormatCommonRulesRewriterFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/SynonymFormatCommonRulesRewriterFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/SynonymFormatCommonRulesRewriterFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/TermQueryCachePreloader.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/TermQueryCachePreloader.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/TermQueryCachePreloader.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/TermQueryCachePreloader.java diff --git a/querqy-solr/src/main/java/querqy/solr/contrib/AnalyzingQuerqyParserFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/AnalyzingQuerqyParserFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/contrib/AnalyzingQuerqyParserFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/AnalyzingQuerqyParserFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/contrib/ShingleRewriterFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/ShingleRewriterFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/contrib/ShingleRewriterFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/ShingleRewriterFactory.java diff --git a/querqy-solr/src/main/java/querqy/solr/contrib/SolrSynonymsRewriterFactory.java b/querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/SolrSynonymsRewriterFactory.java similarity index 100% rename from querqy-solr/src/main/java/querqy/solr/contrib/SolrSynonymsRewriterFactory.java rename to querqy-for-lucene/querqy-solr/src/main/java/querqy/solr/contrib/SolrSynonymsRewriterFactory.java diff --git a/querqy-solr/src/test/java/querqy/solr/BoostMethodTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/BoostMethodTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/BoostMethodTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/BoostMethodTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java similarity index 93% rename from querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java index e7b3e1281..4f2a3294d 100644 --- a/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java +++ b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserTest.java @@ -25,6 +25,8 @@ public void index() throws Exception { assertU(adoc("id", "4", "f1", "b")); assertU(adoc("id", "5", "f1", "spellcheck", "f2", "test")); assertU(adoc("id", "6", "f1", "spellcheck filtered", "f2", "test")); + assertU(adoc("id", "7", "f1", "aaa")); + assertU(adoc("id", "8", "f1", "aaa bbb ccc", "f2", "w87")); assertU(commit()); } @@ -191,7 +193,7 @@ public void testThatMatchAllDoesNotThrowException() throws Exception { assertQ("Matchall fails", req, "//str[@name='parsedquery'][contains(.,'*:*')]", - "//result[@name='response' and @numFound='6']" + "//result[@name='response' and @numFound='8']" ); @@ -502,9 +504,38 @@ public void testThatGeneratedQueryFieldsAreApplied() throws Exception { ); req.close(); } - - public void verifyQueryString(SolrQueryRequest req, String q, String... expectedSubstrings) throws Exception { + @Test + public void testThatUpRuleCanPickUpPlaceHolder() throws Exception { + + SolrQueryRequest req = req("q", "aaa", + DisMaxParams.QF, "f1 f2", + "defType", "querqy", + "debugQuery", "true"); + + assertQ("Default ranking for picking up wildcard not working", + req, + "//result/doc[1]/str[@name='id'][text()='7']" + ); + req.close(); + + SolrQueryRequest req2 = req("q", "aaa w87", + DisMaxParams.QF, "f1 f2", + DisMaxParams.MM, "100%", + "defType", "querqy", + "debugQuery", "true"); + + assertQ("Ranking for picking up wildcard not working", + req2, + "//result/doc[1]/str[@name='id'][text()='8']", + "//result[@name='response' and @numFound='2']" + ); + req2.close(); + + + } + + public void verifyQueryString(SolrQueryRequest req, String q, String... expectedSubstrings) throws Exception { QuerqyDismaxQParser parser = new QuerqyDismaxQParser(q, null, req.getParams(), req, new RewriteChain(), new WhiteSpaceQuerqyParser(), null); diff --git a/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithCommonRulesTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithCommonRulesTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithCommonRulesTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithCommonRulesTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithEmptyCommonRulesTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithEmptyCommonRulesTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithEmptyCommonRulesTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithEmptyCommonRulesTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithStopwordsTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithStopwordsTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithStopwordsTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DefaultQuerqyDismaxQParserWithStopwordsTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/DocumentFrequencyCorrectionTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DocumentFrequencyCorrectionTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/DocumentFrequencyCorrectionTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/DocumentFrequencyCorrectionTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/FieldBoostTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/FieldBoostTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/FieldBoostTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/FieldBoostTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/ReRankBoostMethodTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/ReRankBoostMethodTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/ReRankBoostMethodTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/ReRankBoostMethodTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheBoostFactorTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheBoostFactorTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheBoostFactorTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheBoostFactorTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheFieldPreloadTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheFieldPreloadTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheFieldPreloadTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheFieldPreloadTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCachePreloadTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCachePreloadTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/SolrTermQueryCachePreloadTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCachePreloadTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheVsDocumentFrequencyCorrectionTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheVsDocumentFrequencyCorrectionTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheVsDocumentFrequencyCorrectionTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/SolrTermQueryCacheVsDocumentFrequencyCorrectionTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/contrib/QuerqyDismaxQParserWithSolrSynonymsTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/contrib/QuerqyDismaxQParserWithSolrSynonymsTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/contrib/QuerqyDismaxQParserWithSolrSynonymsTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/contrib/QuerqyDismaxQParserWithSolrSynonymsTest.java diff --git a/querqy-solr/src/test/java/querqy/solr/contrib/ShingleRewriterTest.java b/querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/contrib/ShingleRewriterTest.java similarity index 100% rename from querqy-solr/src/test/java/querqy/solr/contrib/ShingleRewriterTest.java rename to querqy-for-lucene/querqy-solr/src/test/java/querqy/solr/contrib/ShingleRewriterTest.java diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/boostUp.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/boostUp.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/boostUp.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/boostUp.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-before-shingles.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-before-shingles.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-before-shingles.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-before-shingles.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-shingles.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-shingles.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-shingles.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/rules-shingles.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-QuerqyDismaxQParserWithSolrSynonymsTest.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-QuerqyDismaxQParserWithSolrSynonymsTest.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-QuerqyDismaxQParserWithSolrSynonymsTest.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-QuerqyDismaxQParserWithSolrSynonymsTest.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-shingles-and-commonrules.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-shingles-and-commonrules.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-shingles-and-commonrules.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/solrconfig-shingles-and-commonrules.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/contrib/synonyms.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/synonyms.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/contrib/synonyms.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/contrib/synonyms.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt similarity index 87% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt index 1d0c1f4f6..2a8a45a91 100644 --- a/querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt +++ b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-DefaultQuerqyDismaxQParserTest.txt @@ -30,3 +30,8 @@ j => spellcheck => FILTER: * f1:filtered + +w* => + UP(5000): w$1 + DELETE + diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-dfc.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-dfc.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-dfc.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-dfc.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-field-preload.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-field-preload.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-field-preload.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache-field-preload.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules-cache.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-cache.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules-empty.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-empty.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules-empty.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules-empty.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/rules.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/rules.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/rules.txt diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/schema-stopwords.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/schema-stopwords.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/schema-stopwords.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/schema-stopwords.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/schema.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/schema.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/schema.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/schema.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-DefaultQuerqyDismaxQParserTest.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-DefaultQuerqyDismaxQParserTest.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-DefaultQuerqyDismaxQParserTest.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-DefaultQuerqyDismaxQParserTest.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-boost.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-boost.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-boost.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-boost.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-field-preload.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-field-preload.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-field-preload.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-field-preload.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-preloaded.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-preloaded.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-preloaded.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-preloaded.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-vs-documentfrequencycorrection.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-vs-documentfrequencycorrection.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-vs-documentfrequencycorrection.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache-vs-documentfrequencycorrection.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-cache.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules-empty.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules-empty.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules-empty.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules-empty.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules.xml b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules.xml similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules.xml rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/solrconfig-commonrules.xml diff --git a/querqy-solr/src/test/resources/solr/collection1/conf/stopwords.txt b/querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/stopwords.txt similarity index 100% rename from querqy-solr/src/test/resources/solr/collection1/conf/stopwords.txt rename to querqy-for-lucene/querqy-solr/src/test/resources/solr/collection1/conf/stopwords.txt diff --git a/querqy-solr/pom.xml b/querqy-solr/pom.xml deleted file mode 100644 index 8e6a1281d..000000000 --- a/querqy-solr/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - 4.0.0 - - - querqy - querqy-parent - 3.1.0-SNAPSHOT - - - querqy-solr - - - - - org.apache.solr - solr-test-framework - ${lucene.version} - test - - - - commons-io - commons-io - ${commons.io.version} - provided - - - - ${project.groupId} - querqy-lucene - ${project.version} - - - - ${project.groupId} - querqy-antlr - ${project.version} - - - - org.apache.solr - solr-core - ${lucene.version} - provided - - - - - commons-logging - commons-logging - 1.1.3 - test - - - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - ${project.artifactId}-${lucene.version}-${project.version} - - - - package - - jar - - - - - - - org.apache.maven.plugins - maven-source-plugin - - ${project.artifactId}-${lucene.version}-${project.version} - - - - attach-sources - - jar - - - - - - - - maven-assembly-plugin - - - ${project.artifactId}-${lucene.version}-${project.version} - - jar-with-dependencies - - - - - package - - single - - - - - - - maven-release-plugin - - ${project.artifactId}-${lucene.version}-${project.version} - - - - - -