mirror of https://github.com/apache/lucene.git
LUCENE-2717: BasicOperations.concatenate creates invariant if the RHS is the empty language
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1026104 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a98050eb5a
commit
c15e002d70
|
@ -61,6 +61,8 @@ final public class BasicOperations {
|
|||
static public Automaton concatenate(Automaton a1, Automaton a2) {
|
||||
if (a1.isSingleton() && a2.isSingleton()) return BasicAutomata
|
||||
.makeString(a1.singleton + a2.singleton);
|
||||
if (isEmpty(a1) || isEmpty(a2))
|
||||
return BasicAutomata.makeEmpty();
|
||||
// adding epsilon transitions with the NFA concatenation algorithm
|
||||
// in this case always produces a resulting DFA, preventing expensive
|
||||
// redundant determinize() calls for this common case.
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
package org.apache.lucene.util.automaton;
|
||||
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF 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.
|
||||
*/
|
||||
|
||||
import org.apache.lucene.util.LuceneTestCase;
|
||||
|
||||
/**
|
||||
* This test builds some randomish NFA/DFA and minimizes them.
|
||||
* the minimal and non-minimal are compared to ensure they are the same.
|
||||
*/
|
||||
public class TestMinimize extends LuceneTestCase {
|
||||
public void test() {
|
||||
int num = 10000 * RANDOM_MULTIPLIER;
|
||||
for (int i = 0; i < num; i++) {
|
||||
Automaton a = randomishAutomaton();
|
||||
Automaton b = a.clone();
|
||||
MinimizationOperations.minimize(b);
|
||||
assertTrue(BasicOperations.sameLanguage(a, b));
|
||||
}
|
||||
}
|
||||
|
||||
private Automaton randomishAutomaton() {
|
||||
// get two random Automata from regexps
|
||||
Automaton a1 = AutomatonTestUtil.randomRegexp(random).toAutomaton();
|
||||
if (random.nextBoolean())
|
||||
a1 = BasicOperations.complement(a1);
|
||||
|
||||
Automaton a2 = AutomatonTestUtil.randomRegexp(random).toAutomaton();
|
||||
if (random.nextBoolean())
|
||||
a2 = BasicOperations.complement(a2);
|
||||
|
||||
// combine them in random ways
|
||||
switch(random.nextInt(3)) {
|
||||
case 0: return BasicOperations.concatenate(a1, a2);
|
||||
case 1: return BasicOperations.union(a1, a2);
|
||||
default: return BasicOperations.minus(a1, a2);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue