blob: 1ed78bdd715c82a73e6478e7ea58f5cec2d74d4b [file] [log] [blame]
/*
* 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.
*/
package org.apache.uima.cas;
import java.util.ArrayList;
import org.apache.uima.cas.impl.ConstraintFactoryImpl;
/**
* Methods to create {@link org.apache.uima.cas.FSMatchConstraint}s for filtered iterators or other
* use. A constraint is an object which represents a test or a series of tests joined with "and" or
* "or". Each test consists of a test predicate plus an optional "path" which specifies how to walk
* through a chain of references, starting from a feature structure being tested, to reach the value
* to be tested.
* <p>
* Tests include
* <ul>
* <li>type subsumption --(satisfied if the CAS feature structure being tested is of a specified
* type (or is a subtype of that type). </li>
* <li>value equality</li>
* <li>for numeric values - range testing</li>
* </ul>
*
* Constraints can be used by calling their "match" method, passing as an argument the value to
* test. If the constraint includes the "path", the argument is a feature structure; the path
* specifies how to reach the value to test, starting with the feature structure. Otherwise, the
* value to test depends on the constraint; for an {@link org.apache.uima.cas.FSIntConstraint}, for
* instance, the value would be an integer.
*/
public abstract class ConstraintFactory {
/**
* Create a new type constraint. A type constraint contains one or more types to test against. A
* type constraint must be initialized by adding one or more types to it. The match is true if any
* of the types are the same or a super type of the feature structure being tested by the
* constraint.
*
* @return A new type constraint with the type set to the top type.
*/
public abstract FSTypeConstraint createTypeConstraint();
/**
* Create a new int constraint. An int constraint must be initialized after it's created by adding
* one or more tests to it.
*
* @return A new int constraint, completely unconstrained.
*/
public abstract FSIntConstraint createIntConstraint();
/**
* Create a new float constraint. A float constraint must be initialized after it's created by
* adding one or more tests to it.
*
* @return A new float constraint, completely unconstrained.
*/
public abstract FSFloatConstraint createFloatConstraint();
/**
* Create a new String constraint. A String constraint must be initialized after it's created by
* adding one or more tests to it.
*
* @return A new String constraint, completely unconstrained.
*/
public abstract FSStringConstraint createStringConstraint();
/**
* Combine a constraint test with a path from a feature structure instance to the value to be
* tested. This is called "embedding" a constraint under a path. For example, create an int
* constraint, and then embed it under some int valued feature, such as the start feature of an
* annotation.
*
* @param path
* The path to embed the constraint under. Create a new path with
* {@link CAS#createFeaturePath() CAS.createFeaturePath()}.
* @param constraint
* The constraint to be embedded.
* @return A new FSMatchConstraint.
*/
public abstract FSMatchConstraint embedConstraint(FeaturePath path, FSConstraint constraint);
/**
* Embed a constraint under a path. For example, create an int constraint, and then embed it under
* some int valued feature, such as the start feature of an annotation.
*
* @param path
* The path to embed the constraint under. This is a list of {@link Feature features}.
* @param constraint
* The constraint to be embedded.
* @return A new FSMatchConstraint.
*/
public abstract FSMatchConstraint embedConstraint(ArrayList path, FSConstraint constraint);
/**
* Conjoin two constraints.
*
* @param c1
* The first conjunct.
* @param c2
* The second conjunct.
* @return A new FSMatchConstraint, representing the conjunction of <code>c1</code> and
* <code>c2</code>.
*/
public abstract FSMatchConstraint and(FSMatchConstraint c1, FSMatchConstraint c2);
/**
* Disjoin two constraints.
*
* @param c1
* The first disjunct.
* @param c2
* The second disjunct.
* @return A new FSMatchConstraint, representing the disjunction of <code>c1</code> and
* <code>c2</code>.
*/
public abstract FSMatchConstraint or(FSMatchConstraint c1, FSMatchConstraint c2);
/**
* Create a new constraint factory.
*
* @return A new ConstraintFactory instance.
*/
public static ConstraintFactory instance() {
return new ConstraintFactoryImpl();
}
}