public override FilterStateResult signalCheckpoint() { #if TODO FilterStateResult result; FilterState next = getNextState(); if (next != null) { int metering = filter.getMetering(); if (next is FeatureFilterState) { if (features.Count > 0) { FeatureGroups feature_groups; foreach (Feature i in features) { feature_groups[filter.assign(i, current_env)].Add(i); } FeatureFilterState state = (FeatureFilterState)next; result = meterGroups(filter, feature_groups, state, metering, current_env); } else { result.set(FilterStateResult.Status.STATUS_NODATA, filter); } } else if (next is FragmentFilterState) { FragmentFilterState state = (FragmentFilterState)next; if (features.Count > 0) { FeatureGroups groups; foreach (Feature i in features) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else if (fragments.Count > 0) { FragmentGroups groups; foreach (Fragment i in fragments) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else { result.set(FilterStateResult.Status.STATUS_NODATA, filter); } } else if (next is NodeFilterState) { NodeFilterState state = (NodeFilterState)next; if (features.Count > 0) { FeatureGroups feature_groups; foreach (Feature i in features) { feature_groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, feature_groups, state, metering, current_env); } else if (fragments.Count > 0) { FragmentGroups groups; foreach (Fragment i in fragments) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else if (nodes.Count > 0) { NodeGroups groups; foreach (AttributedNode i in nodes) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else { result.set(FilterStateResult.Status.STATUS_NODATA, filter); } } else if (next is CollectionFilterState) { CollectionFilterState state = (CollectionFilterState)next; if (features.Count > 0) { FeatureGroups feature_groups; foreach (Feature i in features) { feature_groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, feature_groups, state, metering, current_env); } else if (fragments.Count > 0) { FragmentGroups groups; foreach (Fragment i in fragments) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else if (nodes.Count > 0) { NodeGroups groups; foreach (AttributedNode i in nodes) { groups[filter.assign(i, current_env)].Add(i); } result = meterGroups(filter, groups, state, metering, current_env); } else { result.set(FilterStateResult.Status.STATUS_NODATA, filter); } } if (result.isOK()) { result = next.signalCheckpoint(); } } // clean up the input: features.Clear(); fragments.Clear(); nodes.Clear(); current_env = null; return(result); #endif throw new NotImplementedException(); }
/** * Notifies this filter that a compilation checkpoint has been reached. * This supports batching/metering of data by CollectionFilters. * * @return * True if traversal succeeded, false upon error. */ public virtual FilterStateResult signalCheckpoint() { FilterState next = getNextState(); return(next != null?next.signalCheckpoint() : new FilterStateResult()); }