org.elasticsearch.index.query.RegexpFlag Maven / Gradle / Ivy
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch 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.elasticsearch.index.query;
import java.util.Locale;
import org.apache.lucene.util.automaton.RegExp;
import org.elasticsearch.common.Strings;
/**
* Regular expression syntax flags. Each flag represents optional syntax support in the regular expression:
*
* - INTERSECTION - Support for intersection notation: <expression> & <expression>
* - COMPLEMENT - Support for complement notation: <expression> & <expression>
* - EMPTY - Support for the empty language symbol: #
* - ANYSTRING - Support for the any string symbol: @
* - INTERVAL - Support for numerical interval notation: <n-m>
* - NONE - Disable support for all syntax options
* - ALL - Enables support for all syntax options
*
*
* @see RegexpQueryBuilder#flags(RegexpFlag...)
* @see RegexpQueryBuilder#flags(RegexpFlag...)
*/
public enum RegexpFlag {
/**
* Enables intersection of the form: <expression> & <expression>
*/
INTERSECTION(RegExp.INTERSECTION),
/**
* Enables complement expression of the form: ~<expression>
*/
COMPLEMENT(RegExp.COMPLEMENT),
/**
* Enables empty language expression: #
*/
EMPTY(RegExp.EMPTY),
/**
* Enables any string expression: @
*/
ANYSTRING(RegExp.ANYSTRING),
/**
* Enables numerical interval expression: <n-m>
*/
INTERVAL(RegExp.INTERVAL),
/**
* Disables all available option flags
*/
NONE(RegExp.NONE),
/**
* Enables all available option flags
*/
ALL(RegExp.ALL);
final int value;
private RegexpFlag(int value) {
this.value = value;
}
public int value() {
return value;
}
/**
* Resolves the combined OR'ed value for the given list of regular expression flags. The given flags must follow the
* following syntax:
*
* flag_name(|flag_name)*
*
* Where flag_name is one of the following:
*
* - INTERSECTION
* - COMPLEMENT
* - EMPTY
* - ANYSTRING
* - INTERVAL
* - NONE
* - ALL
*
*
* Example: INTERSECTION|COMPLEMENT|EMPTY
*
* @param flags A string representing a list of regular expression flags
* @return The combined OR'ed value for all the flags
*/
static int resolveValue(String flags) {
if (flags == null || flags.isEmpty()) {
return RegExp.ALL;
}
int magic = RegExp.NONE;
for (String s : Strings.delimitedListToStringArray(flags, "|")) {
if (s.isEmpty()) {
continue;
}
try {
RegexpFlag flag = RegexpFlag.valueOf(s.toUpperCase(Locale.ROOT));
if (flag == RegexpFlag.NONE) {
continue;
}
if (flag == RegexpFlag.ALL) {
return flag.value();
}
magic |= flag.value();
} catch (IllegalArgumentException iae) {
throw new IllegalArgumentException("Unknown regexp flag [" + s + "]");
}
}
return magic;
}
}