Author: schor Date: Tue Feb 16 22:31:38 2016 New Revision: 1730761 URL: http://svn.apache.org/viewvc?rev=1730761&view=rev Log: [UIMA-4673] make the hash map from short feat names to features permanent, final. Speed up isAppropriateFeature test. Add a boolean hasRef, true if any slot is an fs ref - used for lazy init in form 4 deserialization
Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java?rev=1730761&r1=1730760&r2=1730761&view=diff ============================================================================== --- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java (original) +++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java Tue Feb 16 22:31:38 2016 @@ -118,7 +118,7 @@ public class TypeImpl implements Type, C private final List<TypeImpl> directSubtypes = new ArrayList<>(); // ******** Features ********* - private Map<String, FeatureImpl> staticMergedFeatures = new LinkedHashMap<>(1); // set to null at commit time + private final Map<String, FeatureImpl> staticMergedFeatures = new LinkedHashMap<>(1); // set to null at commit time private final List<FeatureImpl> staticMergedFeaturesList = new ArrayList<>(0); // set after commit private final List<FeatureImpl> staticMergedFeaturesIntroducedByThisType = new ArrayList<>(0); @@ -331,11 +331,12 @@ public class TypeImpl implements Type, C */ @Override public int getNumberOfFeatures() { - return (staticMergedFeatures != null) ? staticMergedFeatures.size() : staticMergedFeaturesList.size(); + return staticMergedFeatures.size(); } public boolean isAppropriateFeature(Feature feature) { - return feature == getFeatureByBaseName(feature.getShortName()); + TypeImpl domain = (TypeImpl) feature.getDomain(); + return domain.subsumes(this); } /** @@ -389,15 +390,7 @@ public class TypeImpl implements Type, C */ @Override public FeatureImpl getFeatureByBaseName(String featureShortName) { - if (staticMergedFeatures != null) { - return staticMergedFeatures.get(featureShortName); - } - for (FeatureImpl fi : staticMergedFeaturesList) { - if (fi.getShortName().equals(featureShortName)) { - return fi; - } - } - return null; + return staticMergedFeatures.get(featureShortName); } /** @@ -453,7 +446,7 @@ public class TypeImpl implements Type, C */ @Override public List<Feature> getFeatures() { - return new ArrayList<>( (staticMergedFeatures != null) ? staticMergedFeatures.values() : staticMergedFeaturesList); + return new ArrayList<>(getFeatureImpls()); } /** @@ -462,8 +455,7 @@ public class TypeImpl implements Type, C * @return the list of feature impls */ public List<FeatureImpl> getFeatureImpls() { - if (staticMergedFeatures != null) { - // means not yet committed + if (!tsi.isCommitted()) { // recompute the list if needed int nbrOfFeats = staticMergedFeatures.size(); if (nbrOfFeats != staticMergedFeaturesList.size()) { @@ -477,18 +469,21 @@ public class TypeImpl implements Type, C synchronized (staticMergedFeaturesList) { staticMergedFeaturesList.clear(); staticMergedFeaturesList.addAll(superType.getFeatureImpls()); - staticMergedFeaturesList.addAll(staticMergedFeaturesIntroducedByThisType); - if (superType.hasRefFeature) { - hasRefFeature = true; - } else { - for (FeatureImpl fi : staticMergedFeaturesIntroducedByThisType) { - if (fi.getRangeImpl().isRefType) { - hasRefFeature = true; - break; - } + staticMergedFeaturesList.addAll(staticMergedFeaturesIntroducedByThisType); + } + } + + private void computeHasRef() { + if (superType.hasRefFeature) { + hasRefFeature = true; + } else { + for (FeatureImpl fi : staticMergedFeaturesIntroducedByThisType) { + if (fi.getRangeImpl().isRefType) { + hasRefFeature = true; + break; } } - } + } } Stream<FeatureImpl> getFeaturesAsStream() { @@ -739,11 +734,15 @@ public class TypeImpl implements Type, C // creator = fi; // } - public boolean subsumes(TypeImpl ti) { + final public boolean subsumes(TypeImpl ti) { + if (depthFirstCode <= ti.depthFirstCode && ti.depthFirstCode < depthFirstNextSibling) { + return true; + } if (depthFirstNextSibling != 0) { - return (depthFirstCode <= ti.depthFirstCode && ti.depthFirstCode < depthFirstNextSibling); + return false; } + return getTypeSystem().subsumes(this, ti); } @@ -766,9 +765,8 @@ public class TypeImpl implements Type, C if (level != 1) { // skip for top level; no features there, but no super type either computeStaticMergedFeaturesList(); + computeHasRef(); } - - staticMergedFeatures = null; depthFirstCode = level ++; for (TypeImpl subti : directSubtypes) {