You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2016/08/22 11:00:05 UTC
lucene-solr:master: SOLR-9412: Add failOnMissingParams option to
MacroExpander, add TestMacroExpander class. (Jon Dorando, Christine Poerschke)
Repository: lucene-solr
Updated Branches:
refs/heads/master 80f916780 -> c9c2d5537
SOLR-9412: Add failOnMissingParams option to MacroExpander, add TestMacroExpander class. (Jon Dorando, Christine Poerschke)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c9c2d553
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c9c2d553
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c9c2d553
Branch: refs/heads/master
Commit: c9c2d5537adede62313e51186b75fab08fc6ad1f
Parents: 80f9167
Author: Christine Poerschke <cp...@apache.org>
Authored: Mon Aug 22 10:36:07 2016 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Mon Aug 22 10:36:07 2016 +0100
----------------------------------------------------------------------
solr/CHANGES.txt | 6 +
.../solr/request/macro/MacroExpander.java | 12 ++
.../solr/request/macro/TestMacroExpander.java | 116 +++++++++++++++++++
3 files changed, 134 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c9c2d553/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8ccce7e..349d0cc 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -69,6 +69,12 @@ Bug Fixes
* SOLR-9310: PeerSync fails on a node restart due to IndexFingerPrint mismatch (Pushkar Raste, noble)
+Other Changes
+----------------------
+
+* SOLR-9412: Add failOnMissingParams option to MacroExpander, add TestMacroExpander class.
+ (Jon Dorando, Christine Poerschke)
+
================== 6.2.0 ==================
Versions of Major Components
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c9c2d553/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java b/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
index ff8a19b..7db4cb0 100644
--- a/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
+++ b/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
@@ -34,10 +34,16 @@ public class MacroExpander {
private String macroStart = MACRO_START;
private char escape = '\\';
private int level;
+ private final boolean failOnMissingParams;
public MacroExpander(Map<String,String[]> orig) {
+ this(orig, false);
+ }
+
+ public MacroExpander(Map<String,String[]> orig, boolean failOnMissingParams) {
this.orig = orig;
+ this.failOnMissingParams = failOnMissingParams;
}
public static Map<String,String[]> expand(Map<String,String[]> params) {
@@ -163,8 +169,14 @@ public class MacroExpander {
String replacement = replacementList!=null ? replacementList[0] : defVal;
if (replacement != null) {
String expandedReplacement = expand(replacement);
+ if (failOnMissingParams && expandedReplacement == null) {
+ return null;
+ }
sb.append(expandedReplacement);
}
+ else if (failOnMissingParams) {
+ return null;
+ }
} catch (SyntaxError syntaxError) {
// append the part we would have skipped
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c9c2d553/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java b/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
new file mode 100644
index 0000000..5b16a11
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.request.macro;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.apache.lucene.util.LuceneTestCase;
+import org.junit.Test;
+
+/*
+ * Tests for the MacroExpander
+ */
+public class TestMacroExpander extends LuceneTestCase {
+
+ @Test
+ public void testExamples() {
+ final Map<String,String[]> testParams = new HashMap<String,String[]>();
+ final MacroExpander me;
+ // example behavior unaffected by absence or value of failOnMissingParams
+ if (random().nextBoolean()) {
+ me = new MacroExpander(testParams);
+ } else {
+ final boolean failOnMissingParams = random().nextBoolean();
+ me = new MacroExpander(testParams, failOnMissingParams);
+ }
+
+ //default examples: https://cwiki.apache.org/confluence/display/solr/Parameter+Substitution
+ // and http://yonik.com/solr-query-parameter-substitution/
+
+ //using params
+ String[] lowParams = {"50"};
+ testParams.put("low",lowParams);
+ String[] highParams = {"100"};
+ testParams.put("high",highParams);
+
+ String testQuery = "q=popularity:[ ${low} TO ${high} ]";
+
+ assertEquals("q=popularity:[ 50 TO 100 ]", me.expand(testQuery));
+
+ //using default values
+ testQuery = "q=popularity:[ ${low:10} TO ${high:20} ]";
+ assertEquals("q=popularity:[ 50 TO 100 ]", me.expand(testQuery));
+
+ testParams.clear();
+ assertEquals("q=popularity:[ 10 TO 20 ]", me.expand(testQuery));
+
+ //multiple levels of substitutions
+ testQuery = "q=${pop_query}";
+ String[] popQueryParams = {"${pop_field}:[ ${low} TO ${high} ] AND inStock:true"};
+ String[] popFieldParams = {"popularity"};
+ testParams.put("low",lowParams);
+ testParams.put("high",highParams);
+ testParams.put("pop_query",popQueryParams);
+ testParams.put("pop_field",popFieldParams);
+
+ assertEquals("q=popularity:[ 50 TO 100 ] AND inStock:true", me.expand(testQuery));
+
+ //end default examples
+ }
+
+ @Test
+ public void testOnMissingParams() {
+ final Map<String,String[]> testParams = new HashMap<String,String[]>();
+ final MacroExpander meSkipOnMissingParams = new MacroExpander(testParams);
+ final MacroExpander meFailOnMissingParams = new MacroExpander(testParams, true);
+
+ final String low = "50";
+ final String high = "100";
+ testParams.put("low", new String[]{ low });
+ testParams.put("high", new String[]{ high });
+
+ final String testQuery = "q=popularity:[ ${low} TO ${high} ]";
+
+ //when params all present the expansion results match
+ final String expandedQuery = "q=popularity:[ "+low+" TO "+high+" ]";
+ assertEquals(expandedQuery, meSkipOnMissingParams.expand(testQuery));
+ assertEquals(expandedQuery, meFailOnMissingParams.expand(testQuery));
+
+ //when param(s) missing and have no default the expansion results differ
+ final String expandedLow;
+ final String expandedHigh;
+ if (random().nextBoolean()) { // keep low
+ expandedLow = low;
+ } else {
+ expandedLow = "";
+ testParams.remove("low");
+ }
+ if (random().nextBoolean()) { // keep high
+ expandedHigh = high;
+ } else {
+ expandedHigh = "";
+ testParams.remove("high");
+ }
+ assertEquals("q=popularity:[ "+expandedLow+" TO "+expandedHigh+" ]",
+ meSkipOnMissingParams.expand(testQuery));
+ if (testParams.size() < 2) { // at least one of the two parameters missing
+ assertEquals(null, meFailOnMissingParams.expand(testQuery));
+ }
+ }
+
+}