Example usage for org.apache.lucene.util.automaton Operations minus

List of usage examples for org.apache.lucene.util.automaton Operations minus

Introduction

In this page you can find the example usage for org.apache.lucene.util.automaton Operations minus.

Prototype

static public Automaton minus(Automaton a1, Automaton a2, int maxDeterminizedStates) 

Source Link

Document

Returns a (deterministic) automaton that accepts the intersection of the language of a1 and the complement of the language of a2.

Usage

From source file:org.codelibs.elasticsearch.search.aggregations.bucket.terms.support.IncludeExclude.java

License:Apache License

private Automaton toAutomaton() {
    Automaton a = null;// w  w  w  .  j a v  a2s . c o m
    if (include != null) {
        a = include.toAutomaton();
    } else if (includeValues != null) {
        a = Automata.makeStringUnion(includeValues);
    } else {
        a = Automata.makeAnyString();
    }
    if (exclude != null) {
        a = Operations.minus(a, exclude.toAutomaton(), Operations.DEFAULT_MAX_DETERMINIZED_STATES);
    } else if (excludeValues != null) {
        a = Operations.minus(a, Automata.makeStringUnion(excludeValues),
                Operations.DEFAULT_MAX_DETERMINIZED_STATES);
    }
    return a;
}

From source file:org.elasticsearch.xpack.core.security.authz.accesscontrol.FieldSubsetReaderTests.java

License:Open Source License

public void testSourceFiltering() {
    // include on top-level value
    Map<String, Object> map = new HashMap<>();
    map.put("foo", 3);
    map.put("bar", "baz");

    CharacterRunAutomaton include = new CharacterRunAutomaton(Automata.makeString("foo"));
    Map<String, Object> filtered = FieldSubsetReader.filter(map, include, 0);
    Map<String, Object> expected = new HashMap<>();
    expected.put("foo", 3);

    assertEquals(expected, filtered);/*  w  w  w .  j  av  a2s . c  o m*/

    // include on inner wildcard
    map = new HashMap<>();
    Map<String, Object> subMap = new HashMap<>();
    subMap.put("bar", 42);
    subMap.put("baz", 6);
    map.put("foo", subMap);
    map.put("bar", "baz");

    include = new CharacterRunAutomaton(Automatons.patterns("foo.*"));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    expected.put("foo", subMap);

    assertEquals(expected, filtered);

    // include on leading wildcard
    include = new CharacterRunAutomaton(Automatons.patterns("*.bar"));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    subMap = new HashMap<>();
    subMap.put("bar", 42);
    expected.put("foo", subMap);

    assertEquals(expected, filtered);

    // include on inner value
    include = new CharacterRunAutomaton(Automatons.patterns("foo.bar"));
    filtered = FieldSubsetReader.filter(map, include, 0);

    assertEquals(expected, filtered);

    // exclude on exact value
    include = new CharacterRunAutomaton(Operations.minus(Automata.makeAnyString(),
            Automatons.patterns("foo.bar"), Operations.DEFAULT_MAX_DETERMINIZED_STATES));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    expected.put("bar", "baz");
    expected.put("foo", Collections.singletonMap("baz", 6));

    assertEquals(expected, filtered);

    // exclude on wildcard
    include = new CharacterRunAutomaton(Operations.minus(Automata.makeAnyString(), Automatons.patterns("foo.*"),
            Operations.DEFAULT_MAX_DETERMINIZED_STATES));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = Collections.singletonMap("bar", "baz");

    assertEquals(expected, filtered);

    // include on inner array
    map = new HashMap<>();
    List<Object> subArray = new ArrayList<>();
    subMap = new HashMap<>();
    subMap.put("bar", 42);
    subMap.put("baz", "foo");
    subArray.add(subMap);
    subArray.add(12);
    map.put("foo", subArray);

    include = new CharacterRunAutomaton(Automatons.patterns("foo.bar"));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    subArray = new ArrayList<>();
    subMap = new HashMap<>();
    subMap.put("bar", 42);
    subArray.add(subMap);
    expected.put("foo", subArray);

    assertEquals(expected, filtered);

    // include on inner array 2
    include = new CharacterRunAutomaton(Automatons.patterns("foo"));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    subArray = new ArrayList<>();
    subArray.add(12);
    expected.put("foo", subArray);

    assertEquals(expected, filtered);

    // exclude on inner array
    include = new CharacterRunAutomaton(Operations.minus(Automata.makeAnyString(),
            Automatons.patterns("foo.baz"), Operations.DEFAULT_MAX_DETERMINIZED_STATES));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    subArray = new ArrayList<>();
    subMap = new HashMap<>();
    subMap.put("bar", 42);
    subArray.add(subMap);
    subArray.add(12);
    expected.put("foo", subArray);

    assertEquals(expected, filtered);

    // exclude on inner array 2
    include = new CharacterRunAutomaton(Operations.minus(Automata.makeAnyString(), Automatons.patterns("foo"),
            Operations.DEFAULT_MAX_DETERMINIZED_STATES));
    filtered = FieldSubsetReader.filter(map, include, 0);
    expected = new HashMap<>();
    subArray = new ArrayList<>();
    subMap = new HashMap<>();
    subMap.put("bar", 42);
    subMap.put("baz", "foo");
    subArray.add(subMap);
    expected.put("foo", subArray);

    assertEquals(expected, filtered);

    // json array objects that have no matching fields should be left empty instead of being removed:
    // (otherwise nested inner hit source filtering fails with AOOB)
    map = new HashMap<>();
    map.put("foo", "value");
    List<Map<?, ?>> values = new ArrayList<>();
    values.add(Collections.singletonMap("foo", "1"));
    values.add(Collections.singletonMap("baz", "2"));
    map.put("bar", values);

    include = new CharacterRunAutomaton(Automatons.patterns("bar.baz"));
    filtered = FieldSubsetReader.filter(map, include, 0);

    expected = new HashMap<>();
    expected.put("bar", Arrays.asList(new HashMap<>(), Collections.singletonMap("baz", "2")));
    assertEquals(expected, filtered);
}

From source file:org.opengrok.suggest.query.SuggesterRangeQuery.java

License:Open Source License

/** {@inheritDoc} */
@Override// w w w  . j a  v a  2 s  .com
public TermsEnum getTermsEnumForSuggestions(final Terms terms) {
    if (terms == null) {
        return TermsEnum.EMPTY;
    }

    BytesRef prefix = getPrefix();
    if (prefix != null) {
        Automaton prefixAutomaton = PrefixQuery.toAutomaton(prefix);

        Automaton finalAutomaton;
        if (suggestPosition == SuggestPosition.LOWER) {
            Automaton binaryInt = Automata.makeBinaryInterval(getLowerTerm(), includesLower(), getUpperTerm(),
                    includesUpper());

            finalAutomaton = Operations.intersection(binaryInt, prefixAutomaton);
        } else {
            Automaton binaryInt = Automata.makeBinaryInterval(null, true, getLowerTerm(), !includesLower());

            finalAutomaton = Operations.minus(prefixAutomaton, binaryInt, Integer.MIN_VALUE);
        }

        CompiledAutomaton compiledAutomaton = new CompiledAutomaton(finalAutomaton);
        try {
            return compiledAutomaton.getTermsEnum(terms);
        } catch (IOException e) {
            logger.log(Level.WARNING, "Could not compile automaton for range suggestions", e);
        }
    }

    return TermsEnum.EMPTY;
}