Class FeatureValuePathImpl

java.lang.Object
org.apache.uima.cas.impl.FeatureValuePathImpl
All Implemented Interfaces:
FeatureValuePath

public class FeatureValuePathImpl extends Object implements FeatureValuePath
Contains CAS Type and Feature objects to represent a feature path of the form feature1/.../featureN. Each part that is enclosed within / is referred to as "path snippet" below. Also contains the necessary evaluation logic to yield the value of the feature path. For leaf snippets, the following "special features" are defined:
  • coveredText() can be accessed using evaluateAsString
  • typeName() can be accessed using evaluateAsString
  • fsId() can be accessed using evaluateAsInt. Its result can be used to retrieve an FS from the current LowLevel-CAS.
  • uniqueId() can be accessed using evaluateAsInt. Its result can be used to uniquely identify an FS for a document (even if the document is split over several CAS chunks)
Handling of Arrays
  • A feature path may contain 0 or more features of type FSArray, but not as the last path snippet. The next path snippet must contain the fully qualified type name, example: family/members[0]/somepackage.Person:name
  • A feature path may also contain 0 or 1 feature of type IntArray, StringArray, FloatArray, but only as the last path snippet.
For array-valued features, the following access operators are defined:
  • [index] returns the array entry at index
  • [last] returns the last entry of the array
  • [] returns an array of values. [] is only allowed 0 or 1 time in a feature path. If it is used, getValueType will return one of the following: CAS.TYPE_NAME_STRING_ARRAY ,CAS.TYPE_NAME_INTEGER_ARRAY,CAS.TYPE_NAME_FLOAT_ARRAY.
If the feature path is defined directly for an FSArray, an actual feature name can be omitted, and only the array access operator can be used. Examples:
                        
                         
                          
                           
                            
                             
                              
                               
                                
                                 
                                                                            []/somepackage.Person:coveredText()
                                                                             [last]/somepackage.Person:fsId()
 
 
 
 
 
 
 
 
 
 
 

Usage
  • To create the feature path, use FeaturePath.getFeaturePath. Note that the client code needs to keep track of the "start type" of the feature path, that is, the type that contains the attribute used in the first snippet of the path.
  • At typeSystemInit of your component (CAS consumer or TAE), call typeSystemInit of the feature path.
  • Call getValueType to find out whether the feature path evaluates to a String, and int, a float, or their array counterparts.
  • Depending on the leaf type, call the appropriate evaluateAs methods
  • Field Details

    • CAS_TYPE_CHECKS

      private static final boolean CAS_TYPE_CHECKS
      See Also:
    • CONTAINER_TO_ELEMENTYPE_MAP

      private static final Map<String,String> CONTAINER_TO_ELEMENTYPE_MAP
    • LIST_TO_ARRAYTYPE_MAP

      private static final Map<String,String> LIST_TO_ARRAYTYPE_MAP
    • COVERED_TEXT

      private static final String COVERED_TEXT
      See Also:
    • EMPTY_LIST_TYPE_NAMES

      private static final String[] EMPTY_LIST_TYPE_NAMES
    • FS_ID

      private static final String FS_ID
      See Also:
    • LAST_ARRAY_ENTRY

      private static final int LAST_ARRAY_ENTRY
      See Also:
    • LAST_ARRAY_ENTRY_MARKER

      private static final String LAST_ARRAY_ENTRY_MARKER
      See Also:
    • LIST_TYPE_NAMES

      private static final String[] LIST_TYPE_NAMES
    • SIMPLE_VAL_TYPES

      private static final String[] SIMPLE_VAL_TYPES
    • TYPE_CLASS_FLOATLIST

      private static final int TYPE_CLASS_FLOATLIST
      See Also:
    • TYPE_CLASS_FSLIST

      private static final int TYPE_CLASS_FSLIST
      See Also:
    • TYPE_CLASS_INTEGERLIST

      private static final int TYPE_CLASS_INTEGERLIST
      See Also:
    • TYPE_CLASS_STRINGLIST

      private static final int TYPE_CLASS_STRINGLIST
      See Also:
    • TYPE_NAME

      private static final String TYPE_NAME
      See Also:
    • UNIQUE_ID

      private static final String UNIQUE_ID
      See Also:
    • USE_ALL_ENTRIES

      private static final int USE_ALL_ENTRIES
      See Also:
    • arrayIndex

      private int arrayIndex
    • childPath

      private final FeatureValuePathImpl childPath
    • emptyListTypes

      private Type[] emptyListTypes
    • featureCode

      private int featureCode
    • featureName

      private String featureName
    • featureRangeType

      private int featureRangeType
    • headFeature

      private int headFeature
    • isArrayOrList

      private boolean isArrayOrList
    • isArrayType

      private boolean isArrayType
    • isBracketsOnly

      private boolean isBracketsOnly
    • isCoveredTextFeature

      private boolean isCoveredTextFeature
    • isFsIdFeature

      private boolean isFsIdFeature
    • isListType

      private boolean isListType
    • isSimpleRangeType

      private boolean isSimpleRangeType
    • isTypeNameFeature

      private boolean isTypeNameFeature
    • isUniqueIdFeature

      private boolean isUniqueIdFeature
    • listType

      private int listType
    • tailFeature

      private int tailFeature
    • typeCode

      private int typeCode
    • typeNameInSnippet

      private final String typeNameInSnippet
    • valueTypeName

      private String valueTypeName
  • Constructor Details

  • Method Details

    • getFeaturePath

      public static FeatureValuePathImpl getFeaturePath(String featurePath) throws CASRuntimeException
      Throws:
      CASRuntimeException
    • evaluate

      public Object evaluate(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluate in interface FeatureValuePath
    • evaluateAsFloat

      public Float evaluateAsFloat(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluateAsFloat in interface FeatureValuePath
    • evaluateAsFloatArray

      public Float[] evaluateAsFloatArray(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluateAsFloatArray in interface FeatureValuePath
    • evaluateAsInt

      public Integer evaluateAsInt(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluateAsInt in interface FeatureValuePath
    • evaluateAsIntArray

      public Integer[] evaluateAsIntArray(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluateAsIntArray in interface FeatureValuePath
    • evaluateAsString

      public String evaluateAsString(int currentFS, LowLevelCAS cas)
      Evaluates each snippet of the feature path. Returns a String representation of the leaf value of the path. Returns null if some feature within the path is not set. If the leaf snippet is COVERED_TEXT, returns the covered text of currentFS.
      Specified by:
      evaluateAsString in interface FeatureValuePath
      Parameters:
      currentFS - the current Feature Structure
      cas - CAS
      Returns:
      A string representation of the leaf value.
    • evaluateAsStringArray

      public String[] evaluateAsStringArray(int currentFS, LowLevelCAS cas)
      Specified by:
      evaluateAsStringArray in interface FeatureValuePath
    • getFSType

      public int getFSType()
      Returns the type for which the last feature in the feature path is defined. Assumes that typeSystemInit has been called prior to this method.
      • For a feature path feature1/.../featureN-1/featureN, returns the type of featureN.
      • For a feature path feature1/.../featureN-1/typeN:featureN, returns the type code for typeN. (For example, if the range type of featureN-1 is FSList or FSArray)
      • For a feature path feature1, where feature1 is simple-valued, returns the type that was used in typeSystemInit
      Specified by:
      getFSType in interface FeatureValuePath
      Returns:
      the type for which the last feature in the feature path is defined.
    • getValueType

      public String getValueType()
      Returns the type that this feature path will evaluate to. Can be used to select the correct "evaluateAs" method.
      Specified by:
      getValueType in interface FeatureValuePath
      Returns:
      String the type that this feature path will evaluate to. Will be one of the following:
      • CAS.TYPE_NAME_STRING
      • CAS.TYPE_NAME_STRING_ARRAY
      • CAS.TYPE_NAME_INTEGER
      • CAS.TYPE_NAME_INTEGER_ARRAY
      • CAS.TYPE_NAME_FLOAT
      • CAS.TYPE_NAME_FLOAT_ARRAY
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • typeSystemInit

      public void typeSystemInit(int fsType, LowLevelTypeSystem ts) throws CASRuntimeException
      Specified by:
      typeSystemInit in interface FeatureValuePath
      Throws:
      CASRuntimeException
    • isBuiltInFeature

      private boolean isBuiltInFeature()
    • determineArray

      private final void determineArray() throws CASRuntimeException
      Checks whether the feature snippet denotes array access (i.e., has [..] attached to it). If so, determines the arrayIndex to use within evaluation, which can be a number, the special element "last" or simple [], which means "all elements"
      Throws:
      CASRuntimeException - If the closing ] is missing, or the number is not an integer
    • getArrayIndex

      private int getArrayIndex(int arraySize)
    • getFeatureInSnippet

      private final String getFeatureInSnippet(String pathSnippet)
    • getFsAtIndex

      private int getFsAtIndex(int currentFS, LowLevelCAS cas, int arraySize)
    • getFsAtListIndex

      private int getFsAtListIndex(LowLevelCAS cas, int listFS)
      Assumes that arrayIndex!=USE_ALL_ENTRIES, and that the listType is TYPE_CLASS_FSLIST
      Parameters:
      cas - the low level CAS
      the - list feature structure
      Returns:
      int A reference to the fs given in arrayIndex, or 0 if the list does not contain an entry for that index.
    • getHeadValue

      private Object getHeadValue(LowLevelCAS cas, int listFS)
    • getTypeInSnippet

      private final String getTypeInSnippet(String pathSnippet)
    • getValueAtIndexRec

      private Object getValueAtIndexRec(LowLevelCAS cas, int listFS, ArrayList list, int count)
    • getValueAtListIndex

      private Object getValueAtListIndex(LowLevelCAS cas, int listFS)
      Parameters:
      cas - CAS
      listFS - the list Feature Structure
      Returns:
      Object If arrayIndex = USE_ALL_ENTRIES, returns an ArrayList containing all entries. Otherwise, returns a String, Integer, or Float. Returns null if the list does not contain an entry for arrayIndex, or is empty.
    • isBracketsOnly

      private boolean isBracketsOnly()
    • isEmptyList

      private boolean isEmptyList(LowLevelCAS cas, int type)