optimize breaking strings based on commas, and small optimization to resolving routing values
This commit is contained in:
parent
8c49da12ff
commit
8c9dffc235
|
@ -28,6 +28,7 @@ import org.elasticsearch.action.search.ShardSearchFailure;
|
|||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.common.Base64;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.Unicode;
|
||||
import org.elasticsearch.common.collect.ImmutableMap;
|
||||
import org.elasticsearch.common.collect.Maps;
|
||||
|
@ -39,7 +40,6 @@ import org.elasticsearch.search.internal.InternalSearchRequest;
|
|||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author kimchy (Shay Banon)
|
||||
|
@ -47,12 +47,6 @@ import java.util.regex.Pattern;
|
|||
public abstract class TransportSearchHelper {
|
||||
|
||||
|
||||
private final static Pattern scrollIdPattern;
|
||||
|
||||
static {
|
||||
scrollIdPattern = Pattern.compile(";");
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the shard failures, and releases the cache (meaning this should only be called once!).
|
||||
*/
|
||||
|
@ -119,7 +113,7 @@ public abstract class TransportSearchHelper {
|
|||
} catch (IOException e) {
|
||||
throw new ElasticSearchIllegalArgumentException("Failed to decode scrollId", e);
|
||||
}
|
||||
String[] elements = scrollIdPattern.split(scrollId);
|
||||
String[] elements = Strings.splitStringToArray(scrollId, ';');
|
||||
int index = 0;
|
||||
String type = elements[index++];
|
||||
int contextSize = Integer.parseInt(elements[index++]);
|
||||
|
|
|
@ -46,7 +46,6 @@ import java.util.Arrays;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.elasticsearch.common.collect.Lists.*;
|
||||
import static org.elasticsearch.common.collect.MapBuilder.*;
|
||||
|
@ -64,8 +63,6 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
|
||||
private final long version;
|
||||
|
||||
public final static Pattern routingPattern = Pattern.compile(",");
|
||||
|
||||
private final ImmutableMap<String, IndexMetaData> indices;
|
||||
private final ImmutableMap<String, IndexTemplateMetaData> templates;
|
||||
|
||||
|
@ -137,7 +134,7 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
tmpAliasToIndexToSearchRoutingMap.put(aliasMd.alias(), indexToSearchRoutingMap);
|
||||
}
|
||||
if (aliasMd.searchRouting() != null) {
|
||||
indexToSearchRoutingMap.put(indexMetaData.index(), ImmutableSet.copyOf(routingPattern.split(aliasMd.searchRouting())));
|
||||
indexToSearchRoutingMap.put(indexMetaData.index(), ImmutableSet.copyOf(Strings.splitStringByCommaToSet(aliasMd.searchRouting())));
|
||||
} else {
|
||||
indexToSearchRoutingMap.put(indexMetaData.index(), ImmutableSet.<String>of());
|
||||
}
|
||||
|
@ -272,7 +269,7 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
*/
|
||||
private Map<String, Set<String>> resolveSearchRoutingAllIndices(String routing) {
|
||||
if (routing != null) {
|
||||
THashSet<String> r = new THashSet<String>(Arrays.asList(routingPattern.split(routing)));
|
||||
Set<String> r = Strings.splitStringByCommaToSet(routing);
|
||||
Map<String, Set<String>> routings = newHashMap();
|
||||
String[] concreteIndices = concreteAllIndices();
|
||||
for (String index : concreteIndices) {
|
||||
|
@ -285,9 +282,9 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
|
||||
public Map<String, Set<String>> resolveSearchRouting(@Nullable String routing, String aliasOrIndex) {
|
||||
Map<String, Set<String>> routings = null;
|
||||
List<String> paramRouting = null;
|
||||
Set<String> paramRouting = null;
|
||||
if (routing != null) {
|
||||
paramRouting = Arrays.asList(routingPattern.split(routing));
|
||||
paramRouting = Strings.splitStringByCommaToSet(routing);
|
||||
}
|
||||
|
||||
ImmutableMap<String, ImmutableSet<String>> indexToRoutingMap = aliasToIndexToSearchRoutingMap.get(aliasOrIndex);
|
||||
|
@ -320,11 +317,7 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
} else {
|
||||
// It's an index
|
||||
if (paramRouting != null) {
|
||||
Set<String> r = new THashSet<String>(paramRouting);
|
||||
if (routings == null) {
|
||||
routings = newHashMap();
|
||||
}
|
||||
routings.put(aliasOrIndex, r);
|
||||
routings = ImmutableMap.of(aliasOrIndex, paramRouting);
|
||||
}
|
||||
}
|
||||
return routings;
|
||||
|
@ -336,14 +329,6 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
return resolveSearchRoutingAllIndices(routing);
|
||||
}
|
||||
|
||||
Map<String, Set<String>> routings = null;
|
||||
List<String> paramRouting = null;
|
||||
// List of indices that don't require any routing
|
||||
Set<String> norouting = newHashSet();
|
||||
if (routing != null) {
|
||||
paramRouting = Arrays.asList(routingPattern.split(routing));
|
||||
}
|
||||
|
||||
if (aliasesOrIndices.length == 1) {
|
||||
if (aliasesOrIndices[0].equals("_all")) {
|
||||
return resolveSearchRoutingAllIndices(routing);
|
||||
|
@ -352,6 +337,14 @@ public class MetaData implements Iterable<IndexMetaData> {
|
|||
}
|
||||
}
|
||||
|
||||
Map<String, Set<String>> routings = null;
|
||||
Set<String> paramRouting = null;
|
||||
// List of indices that don't require any routing
|
||||
Set<String> norouting = newHashSet();
|
||||
if (routing != null) {
|
||||
paramRouting = Strings.splitStringByCommaToSet(routing);
|
||||
}
|
||||
|
||||
for (String aliasOrIndex : aliasesOrIndices) {
|
||||
ImmutableMap<String, ImmutableSet<String>> indexToRoutingMap = aliasToIndexToSearchRoutingMap.get(aliasOrIndex);
|
||||
if (indexToRoutingMap != null && !indexToRoutingMap.isEmpty()) {
|
||||
|
|
|
@ -106,7 +106,7 @@ public class PlainShardsIterator implements ShardsIterator {
|
|||
return shardRouting;
|
||||
}
|
||||
|
||||
@Override public ShardRouting nextActiveOrNull() throws NoSuchElementException {
|
||||
@Override public ShardRouting nextActiveOrNull() {
|
||||
int counter = this.counter;
|
||||
int index = this.index;
|
||||
while (counter++ < size()) {
|
||||
|
|
|
@ -42,15 +42,12 @@ import java.util.ArrayList;
|
|||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author kimchy (shay.banon)
|
||||
*/
|
||||
public class PlainOperationRouting extends AbstractComponent implements OperationRouting {
|
||||
|
||||
public final static Pattern routingPattern = Pattern.compile(",");
|
||||
|
||||
private final HashFunction hashFunction;
|
||||
|
||||
private final boolean useType;
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.elasticsearch.common;
|
|||
|
||||
import org.elasticsearch.common.collect.ImmutableSet;
|
||||
import org.elasticsearch.common.collect.Iterables;
|
||||
import org.elasticsearch.common.trove.set.hash.THashSet;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
@ -968,6 +969,78 @@ public class Strings {
|
|||
return toStringArray(set);
|
||||
}
|
||||
|
||||
public static Set<String> splitStringByCommaToSet(final String s) {
|
||||
return splitStringToSet(s, ',');
|
||||
}
|
||||
|
||||
public static String[] splitStringByCommaToArray(final String s) {
|
||||
return splitStringToArray(s, ',');
|
||||
}
|
||||
|
||||
public static Set<String> splitStringToSet(final String s, final char c) {
|
||||
final char[] chars = s.toCharArray();
|
||||
int count = 1;
|
||||
for (final char x : chars) {
|
||||
if (x == c) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
final THashSet<String> result = new THashSet<String>(count);
|
||||
final int len = chars.length;
|
||||
int start = 0; // starting index in chars of the current substring.
|
||||
int pos = 0; // current index in chars.
|
||||
int i = 0; // number of the current substring.
|
||||
for (; pos < len; pos++) {
|
||||
if (chars[pos] == c) {
|
||||
int size = pos - start;
|
||||
if (size > 0) { // only add non empty strings
|
||||
result.add(new String(chars, start, size));
|
||||
}
|
||||
start = pos + 1;
|
||||
}
|
||||
}
|
||||
int size = pos - start;
|
||||
if (size > 0) {
|
||||
result.add(new String(chars, start, size));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static String[] splitStringToArray(final String s, final char c) {
|
||||
final char[] chars = s.toCharArray();
|
||||
int count = 1;
|
||||
for (final char x : chars) {
|
||||
if (x == c) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
final String[] result = new String[count];
|
||||
final int len = chars.length;
|
||||
int start = 0; // starting index in chars of the current substring.
|
||||
int pos = 0; // current index in chars.
|
||||
int i = 0; // number of the current substring.
|
||||
for (; pos < len; pos++) {
|
||||
if (chars[pos] == c) {
|
||||
int size = pos - start;
|
||||
if (size > 0) {
|
||||
result[i++] = new String(chars, start, size);
|
||||
}
|
||||
start = pos + 1;
|
||||
}
|
||||
}
|
||||
int size = pos - start;
|
||||
if (size > 0) {
|
||||
result[i++] = new String(chars, start, size);
|
||||
}
|
||||
if (i != count) {
|
||||
// we have empty strings, copy over to a new array
|
||||
String[] result1 = new String[i];
|
||||
System.arraycopy(result, 0, result1, 0, i);
|
||||
return result1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Split a String at the first occurrence of the delimiter.
|
||||
* Does not include the delimiter in the result.
|
||||
|
|
|
@ -19,10 +19,10 @@
|
|||
|
||||
package org.elasticsearch.common.path;
|
||||
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.collect.ImmutableMap;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.elasticsearch.common.collect.MapBuilder.*;
|
||||
|
||||
|
@ -43,21 +43,21 @@ public class PathTrie<T> {
|
|||
|
||||
private final Decoder decoder;
|
||||
private final TrieNode<T> root;
|
||||
private final Pattern pattern;
|
||||
private final char separator;
|
||||
private T rootValue;
|
||||
|
||||
public PathTrie() {
|
||||
this("/", "*", NO_DECODER);
|
||||
this('/', "*", NO_DECODER);
|
||||
}
|
||||
|
||||
public PathTrie(Decoder decoder) {
|
||||
this("/", "*", decoder);
|
||||
this('/', "*", decoder);
|
||||
}
|
||||
|
||||
public PathTrie(String separator, String wildcard, Decoder decoder) {
|
||||
public PathTrie(char separator, String wildcard, Decoder decoder) {
|
||||
this.decoder = decoder;
|
||||
pattern = Pattern.compile(separator);
|
||||
root = new TrieNode<T>(separator, null, null, wildcard);
|
||||
this.separator = separator;
|
||||
root = new TrieNode<T>(new String(new char[]{separator}), null, null, wildcard);
|
||||
}
|
||||
|
||||
public class TrieNode<T> {
|
||||
|
@ -193,7 +193,7 @@ public class PathTrie<T> {
|
|||
}
|
||||
|
||||
public void insert(String path, T value) {
|
||||
String[] strings = pattern.split(path);
|
||||
String[] strings = Strings.splitStringToArray(path, separator);
|
||||
if (strings.length == 0) {
|
||||
rootValue = value;
|
||||
return;
|
||||
|
@ -214,7 +214,7 @@ public class PathTrie<T> {
|
|||
if (path.length() == 0) {
|
||||
return rootValue;
|
||||
}
|
||||
String[] strings = pattern.split(path);
|
||||
String[] strings = Strings.splitStringToArray(path, separator);
|
||||
if (strings.length == 0) {
|
||||
return rootValue;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.elasticsearch.action.ActionListener;
|
|||
import org.elasticsearch.action.get.GetRequest;
|
||||
import org.elasticsearch.action.get.GetResponse;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
|
@ -34,7 +35,6 @@ import org.elasticsearch.rest.XContentRestResponse;
|
|||
import org.elasticsearch.rest.XContentThrowableRestResponse;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.elasticsearch.rest.RestRequest.Method.*;
|
||||
import static org.elasticsearch.rest.RestStatus.*;
|
||||
|
@ -45,12 +45,6 @@ import static org.elasticsearch.rest.action.support.RestXContentBuilder.*;
|
|||
*/
|
||||
public class RestGetAction extends BaseRestHandler {
|
||||
|
||||
private final static Pattern fieldsPattern;
|
||||
|
||||
static {
|
||||
fieldsPattern = Pattern.compile(",");
|
||||
}
|
||||
|
||||
@Inject public RestGetAction(Settings settings, Client client, RestController controller) {
|
||||
super(settings, client);
|
||||
controller.registerHandler(GET, "/{index}/{type}/{id}", this);
|
||||
|
@ -69,7 +63,7 @@ public class RestGetAction extends BaseRestHandler {
|
|||
|
||||
String sField = request.param("fields");
|
||||
if (sField != null) {
|
||||
String[] sFields = fieldsPattern.split(sField);
|
||||
String[] sFields = Strings.splitStringByCommaToArray(sField);
|
||||
if (sFields != null) {
|
||||
getRequest.fields(sFields);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|||
import org.elasticsearch.search.sort.SortOrder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.elasticsearch.common.unit.TimeValue.*;
|
||||
import static org.elasticsearch.rest.RestRequest.Method.*;
|
||||
|
@ -55,15 +54,6 @@ import static org.elasticsearch.rest.action.support.RestXContentBuilder.*;
|
|||
*/
|
||||
public class RestSearchAction extends BaseRestHandler {
|
||||
|
||||
private final static Pattern fieldsPattern;
|
||||
|
||||
private final static Pattern indicesBoostPattern;
|
||||
|
||||
static {
|
||||
fieldsPattern = Pattern.compile(",");
|
||||
indicesBoostPattern = Pattern.compile(",");
|
||||
}
|
||||
|
||||
@Inject public RestSearchAction(Settings settings, Client client, RestController controller) {
|
||||
super(settings, client);
|
||||
controller.registerHandler(GET, "/_search", this);
|
||||
|
@ -192,7 +182,7 @@ public class RestSearchAction extends BaseRestHandler {
|
|||
if (!Strings.hasText(sField)) {
|
||||
searchSourceBuilder.noFields();
|
||||
} else {
|
||||
String[] sFields = fieldsPattern.split(sField);
|
||||
String[] sFields = Strings.splitStringByCommaToArray(sField);
|
||||
if (sFields != null) {
|
||||
for (String field : sFields) {
|
||||
searchSourceBuilder.field(field);
|
||||
|
@ -203,7 +193,7 @@ public class RestSearchAction extends BaseRestHandler {
|
|||
|
||||
String sSorts = request.param("sort");
|
||||
if (sSorts != null) {
|
||||
String[] sorts = fieldsPattern.split(sSorts);
|
||||
String[] sorts = Strings.splitStringByCommaToArray(sSorts);
|
||||
for (String sort : sorts) {
|
||||
int delimiter = sort.lastIndexOf(":");
|
||||
if (delimiter != -1) {
|
||||
|
@ -222,7 +212,7 @@ public class RestSearchAction extends BaseRestHandler {
|
|||
|
||||
String sIndicesBoost = request.param("indices_boost");
|
||||
if (sIndicesBoost != null) {
|
||||
String[] indicesBoost = indicesBoostPattern.split(sIndicesBoost);
|
||||
String[] indicesBoost = Strings.splitStringByCommaToArray(sIndicesBoost);
|
||||
for (String indexBoost : indicesBoost) {
|
||||
int divisor = indexBoost.indexOf(',');
|
||||
if (divisor == -1) {
|
||||
|
|
|
@ -29,18 +29,12 @@ import org.elasticsearch.index.query.QueryStringQueryBuilder;
|
|||
import org.elasticsearch.rest.RestRequest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author kimchy (Shay Banon)
|
||||
*/
|
||||
public class RestActions {
|
||||
|
||||
public final static Pattern indicesPattern = Pattern.compile(",");
|
||||
public final static Pattern typesPattern = Pattern.compile(",");
|
||||
public final static Pattern nodesIdsPattern = Pattern.compile(",");
|
||||
public final static Pattern genericPattern = Pattern.compile(",");
|
||||
|
||||
public static long parseVersion(RestRequest request) {
|
||||
if (request.hasParam("version")) {
|
||||
return request.paramAsLong("version", 0);
|
||||
|
@ -100,20 +94,20 @@ public class RestActions {
|
|||
if (indices == null) {
|
||||
return Strings.EMPTY_ARRAY;
|
||||
}
|
||||
return indicesPattern.split(indices);
|
||||
return Strings.splitStringByCommaToArray(indices);
|
||||
}
|
||||
|
||||
public static String[] splitTypes(String typeNames) {
|
||||
if (typeNames == null) {
|
||||
return Strings.EMPTY_ARRAY;
|
||||
}
|
||||
return typesPattern.split(typeNames);
|
||||
return Strings.splitStringByCommaToArray(typeNames);
|
||||
}
|
||||
|
||||
public static String[] splitNodes(String nodes) {
|
||||
if (nodes == null) {
|
||||
return Strings.EMPTY_ARRAY;
|
||||
}
|
||||
return nodesIdsPattern.split(nodes);
|
||||
return Strings.splitStringByCommaToArray(nodes);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,12 +21,11 @@ package org.elasticsearch.rest.support;
|
|||
|
||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||
import org.elasticsearch.common.Booleans;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.unit.ByteSizeValue;
|
||||
import org.elasticsearch.common.unit.TimeValue;
|
||||
import org.elasticsearch.rest.RestRequest;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.elasticsearch.common.unit.ByteSizeValue.*;
|
||||
import static org.elasticsearch.common.unit.TimeValue.*;
|
||||
|
||||
|
@ -35,8 +34,6 @@ import static org.elasticsearch.common.unit.TimeValue.*;
|
|||
*/
|
||||
public abstract class AbstractRestRequest implements RestRequest {
|
||||
|
||||
private static final Pattern commaPattern = Pattern.compile(",");
|
||||
|
||||
@Override public final String path() {
|
||||
return RestUtils.decodeComponent(rawPath());
|
||||
}
|
||||
|
@ -102,6 +99,6 @@ public abstract class AbstractRestRequest implements RestRequest {
|
|||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
return commaPattern.split(value);
|
||||
return Strings.splitStringByCommaToArray(value);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue