/*
* 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 org.apache.lucene.util.automaton.RegExp;
import org.elasticsearch.common.Strings;
import java.util.Locale;
/**
* Regular expression syntax flags. Each flag represents optional syntax support in the regular expression:
* <ul>
* <li><tt>INTERSECTION</tt> - Support for intersection notation: <tt><expression> & <expression></tt></li>
* <li><tt>COMPLEMENT</tt> - Support for complement notation: <tt><expression> & <expression></tt></li>
* <li><tt>EMPTY</tt> - Support for the empty language symbol: <tt>#</tt></li>
* <li><tt>ANYSTRING</tt> - Support for the any string symbol: <tt>@</tt></li>
* <li><tt>INTERVAL</tt> - Support for numerical interval notation: <tt><n-m></tt></li>
* <li><tt>NONE</tt> - Disable support for all syntax options</li>
* <li><tt>ALL</tt> - Enables support for all syntax options</li>
* </ul>
*
* @see RegexpQueryBuilder#flags(RegexpFlag...)
* @see RegexpQueryBuilder#flags(RegexpFlag...)
*/
public enum RegexpFlag {
/**
* Enables intersection of the form: <tt><expression> & <expression></tt>
*/
INTERSECTION(RegExp.INTERSECTION),
/**
* Enables complement expression of the form: <tt>~<expression></tt>
*/
COMPLEMENT(RegExp.COMPLEMENT),
/**
* Enables empty language expression: <tt>#</tt>
*/
EMPTY(RegExp.EMPTY),
/**
* Enables any string expression: <tt>@</tt>
*/
ANYSTRING(RegExp.ANYSTRING),
/**
* Enables numerical interval expression: <tt><n-m></tt>
*/
INTERVAL(RegExp.INTERVAL),
/**
* Disables all available option flags
*/
NONE(RegExp.NONE),
/**
* Enables all available option flags
*/
ALL(RegExp.ALL);
final int value;
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:
* <p>
* <tt>flag_name</tt>(|<tt>flag_name</tt>)*
* <p>
* Where <tt>flag_name</tt> is one of the following:
* <ul>
* <li>INTERSECTION</li>
* <li>COMPLEMENT</li>
* <li>EMPTY</li>
* <li>ANYSTRING</li>
* <li>INTERVAL</li>
* <li>NONE</li>
* <li>ALL</li>
* </ul>
* <p>
* Example: <tt>INTERSECTION|COMPLEMENT|EMPTY</tt>
*
* @param flags A string representing a list of regular expression flags
* @return The combined OR'ed value for all the flags
*/
public 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;
}
}