Fixed open/close index api when using wildcard only
Named wildcards were not always properly replaced with proper values by PathTrie. Delete index (curl -XDELETE localhost:9200/*) worked anyway as the named wildcard is the last path element (and even if {index} didn't get replaced with '*', the empty string would have mapped to all indices anyway). When the named wildcard wasn't the last path element (e.g. curl -XPOST localhost:29200/*/_close), the variable didn't get replaced with the current '*' value, but with the empty string, which leads to an error as empty index is not allowed by open/close index. Closes #4564
This commit is contained in:
parent
c6fefacb2f
commit
6c23ace68f
|
@ -0,0 +1,82 @@
|
||||||
|
setup:
|
||||||
|
- do:
|
||||||
|
indices.create:
|
||||||
|
index: test_index1
|
||||||
|
- do:
|
||||||
|
indices.create:
|
||||||
|
index: test_index2
|
||||||
|
- do:
|
||||||
|
indices.create:
|
||||||
|
index: test_index3
|
||||||
|
- do:
|
||||||
|
cluster.health:
|
||||||
|
wait_for_status: yellow
|
||||||
|
|
||||||
|
---
|
||||||
|
"All indices":
|
||||||
|
- do:
|
||||||
|
indices.close:
|
||||||
|
index: _all
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: forbidden
|
||||||
|
search:
|
||||||
|
index: test_index2
|
||||||
|
|
||||||
|
- do:
|
||||||
|
indices.open:
|
||||||
|
index: _all
|
||||||
|
|
||||||
|
- do:
|
||||||
|
cluster.health:
|
||||||
|
wait_for_status: yellow
|
||||||
|
|
||||||
|
- do:
|
||||||
|
search:
|
||||||
|
index: test_index2
|
||||||
|
|
||||||
|
---
|
||||||
|
"Trailing wildcard":
|
||||||
|
- do:
|
||||||
|
indices.close:
|
||||||
|
index: test_*
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: forbidden
|
||||||
|
search:
|
||||||
|
index: test_index2
|
||||||
|
|
||||||
|
- do:
|
||||||
|
indices.open:
|
||||||
|
index: test_*
|
||||||
|
|
||||||
|
- do:
|
||||||
|
cluster.health:
|
||||||
|
wait_for_status: yellow
|
||||||
|
|
||||||
|
- do:
|
||||||
|
search:
|
||||||
|
index: test_index2
|
||||||
|
|
||||||
|
---
|
||||||
|
"Only wildcard":
|
||||||
|
- do:
|
||||||
|
indices.close:
|
||||||
|
index: '*'
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: forbidden
|
||||||
|
search:
|
||||||
|
index: test_index3
|
||||||
|
|
||||||
|
- do:
|
||||||
|
indices.open:
|
||||||
|
index: '*'
|
||||||
|
|
||||||
|
- do:
|
||||||
|
cluster.health:
|
||||||
|
wait_for_status: yellow
|
||||||
|
|
||||||
|
- do:
|
||||||
|
search:
|
||||||
|
index: test_index3
|
|
@ -157,23 +157,20 @@ public class PathTrie<T> {
|
||||||
|
|
||||||
String token = path[index];
|
String token = path[index];
|
||||||
TrieNode<T> node = children.get(token);
|
TrieNode<T> node = children.get(token);
|
||||||
boolean usedWildcard = false;
|
boolean usedWildcard;
|
||||||
if (node == null) {
|
if (node == null) {
|
||||||
node = children.get(wildcard);
|
node = children.get(wildcard);
|
||||||
if (node == null) {
|
if (node == null) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
|
||||||
usedWildcard = true;
|
|
||||||
if (params != null && node.isNamedWildcard()) {
|
|
||||||
put(params, node.namedWildcard(), token);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
usedWildcard = true;
|
||||||
|
} else {
|
||||||
|
usedWildcard = token.equals(wildcard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put(params, node, token);
|
||||||
|
|
||||||
if (index == (path.length - 1)) {
|
if (index == (path.length - 1)) {
|
||||||
if (params != null && node.isNamedWildcard()) {
|
|
||||||
put(params, node.namedWildcard(), token);
|
|
||||||
}
|
|
||||||
return node.value;
|
return node.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,9 +178,7 @@ public class PathTrie<T> {
|
||||||
if (res == null && !usedWildcard) {
|
if (res == null && !usedWildcard) {
|
||||||
node = children.get(wildcard);
|
node = children.get(wildcard);
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
if (params != null && node.isNamedWildcard()) {
|
put(params, node, token);
|
||||||
put(params, node.namedWildcard(), token);
|
|
||||||
}
|
|
||||||
res = node.retrieve(path, index + 1, params);
|
res = node.retrieve(path, index + 1, params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,8 +186,10 @@ public class PathTrie<T> {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void put(Map<String, String> params, String key, String value) {
|
private void put(Map<String, String> params, TrieNode<T> node, String value) {
|
||||||
params.put(key, decoder.decode(value));
|
if (params != null && node.isNamedWildcard()) {
|
||||||
|
params.put(node.namedWildcard(), decoder.decode(value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.junit.Test;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.google.common.collect.Maps.newHashMap;
|
import static com.google.common.collect.Maps.newHashMap;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.nullValue;
|
import static org.hamcrest.Matchers.nullValue;
|
||||||
|
|
||||||
|
@ -113,11 +112,32 @@ public class PathTrieTests extends ElasticsearchTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEndWithNamedWildcardAndLookupWithWildcard() {
|
public void testNamedWildcardAndLookupWithWildcard() {
|
||||||
PathTrie<String> trie = new PathTrie<String>();
|
PathTrie<String> trie = new PathTrie<String>();
|
||||||
trie.insert("x/{test}", "test1");
|
trie.insert("x/{test}", "test1");
|
||||||
|
trie.insert("{test}/a", "test2");
|
||||||
|
trie.insert("/{test}", "test3");
|
||||||
|
trie.insert("/{test}/_endpoint", "test4");
|
||||||
|
trie.insert("/*/{test}/_endpoint", "test5");
|
||||||
|
|
||||||
Map<String, String> params = newHashMap();
|
Map<String, String> params = newHashMap();
|
||||||
assertThat(trie.retrieve("/x/*", params), equalTo("test1"));
|
assertThat(trie.retrieve("/x/*", params), equalTo("test1"));
|
||||||
assertThat(params.get("test"), equalTo("*"));
|
assertThat(params.get("test"), equalTo("*"));
|
||||||
|
|
||||||
|
params = newHashMap();
|
||||||
|
assertThat(trie.retrieve("/b/a", params), equalTo("test2"));
|
||||||
|
assertThat(params.get("test"), equalTo("b"));
|
||||||
|
|
||||||
|
params = newHashMap();
|
||||||
|
assertThat(trie.retrieve("/*", params), equalTo("test3"));
|
||||||
|
assertThat(params.get("test"), equalTo("*"));
|
||||||
|
|
||||||
|
params = newHashMap();
|
||||||
|
assertThat(trie.retrieve("/*/_endpoint", params), equalTo("test4"));
|
||||||
|
assertThat(params.get("test"), equalTo("*"));
|
||||||
|
|
||||||
|
params = newHashMap();
|
||||||
|
assertThat(trie.retrieve("a/*/_endpoint", params), equalTo("test5"));
|
||||||
|
assertThat(params.get("test"), equalTo("*"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue