From: <tho...@us...> - 2010-09-27 23:38:55
|
Revision: 3644 http://bigdata.svn.sourceforge.net/bigdata/?rev=3644&view=rev Author: thompsonbry Date: 2010-09-27 23:38:47 +0000 (Mon, 27 Sep 2010) Log Message: ----------- Hand off to Martyn on the striterators. This commit DOES NOT include the class path changes. DO NOT commit them until we have this all worked out or we will break the build. Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appender.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractor.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expander.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filter.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IFilter.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapper.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapperator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Merger.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolver.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorter.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/UniquenessFilter.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitor.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitorator.java Added Paths: ----------- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/FilterBase.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IPropertySet.java Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appender.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appender.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appender.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -33,7 +33,7 @@ * Used with Appenderator by Striterator to filter returned objects. */ -public class Appender implements IFilter { +public class Appender extends FilterBase { protected Iterator m_xtra = null; public Appender() {} @@ -44,8 +44,9 @@ //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Appenderator(src, (Iterator) m_xtra); + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Appenderator(src, context, (Iterator) m_xtra); } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -33,13 +33,15 @@ public class Appenderator implements Iterator { - Iterator m_src; - Iterator m_xtra; + private final Iterator m_src; + protected final Object m_ctx; + private final Iterator m_xtra; - Iterator m_current; + private Iterator m_current; - public Appenderator(Iterator src, Iterator xtra) { + public Appenderator(Iterator src, Object ctx, Iterator xtra) { m_src = src; + m_ctx = ctx; m_xtra = xtra; m_current = m_src; Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractor.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractor.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractor.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -31,9 +31,17 @@ * Used with a Contractorator to contract an Expanded iterator * * The Contractorator will call contract on this object + * * @author Martyn Cutcher + * + * @todo CONTRACTOR annotation and allow it to be set as an argument, moving + * contract() onto the contractorator. + * + * @todo CONTRACTOR should be able to break an iterator into many chunks, not + * just one. Maybe the API should return an Iterator from an Iterator + * in which the chunkiness is changed? */ -public abstract class Contractor implements IFilter { +public abstract class Contractor extends FilterBase { protected Object m_state = null; @@ -45,8 +53,9 @@ //------------------------------------------------------------- - public Iterator filter(Iterator src) { - return new Contractorator(src, this); + @Override + public Iterator filterOnce(Iterator src, Object context) { + return new Contractorator(src, context, this); } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -43,12 +43,14 @@ * @author Martyn Cutcher */ public class Contractorator implements Iterator { - Iterator m_src; - Contractor m_contractor; - Object m_next; + private final Iterator m_src; + protected final Object m_ctx; + private final Contractor m_contractor; + private Object m_next; - public Contractorator(Iterator src, Contractor contractor) { + public Contractorator(Iterator src, final Object ctx, Contractor contractor) { m_src = src; + m_ctx = ctx; m_contractor = contractor; m_next = m_contractor.contract(m_src); Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expander.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expander.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expander.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -35,22 +35,22 @@ * Derivations must implement expand method. */ -public abstract class Expander implements IFilter { - protected Object m_state = null; +public abstract class Expander extends FilterBase { public Expander() { } public Expander(Object state) { - m_state = state; + super(state); } //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Expanderator(src, this); - } + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Expanderator(src, context, this); + } - //------------------------------------------------------------- + // ------------------------------------------------------------- - protected abstract Iterator expand(Object obj); + protected abstract Iterator expand(Object obj); } \ No newline at end of file Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -39,13 +39,14 @@ public class Expanderator implements Iterator { - Iterator m_src; - Iterator m_child = null; + private final Iterator m_src; + private Iterator m_child = null; + protected final Object m_context; + private final Expander m_expander; - Expander m_expander; - - public Expanderator(Iterator src, Expander expander) { + public Expanderator(Iterator src, Object context, Expander expander) { m_src = src; + m_context = context; m_expander = expander; } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filter.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filter.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filter.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -28,25 +28,30 @@ import java.util.Iterator; /** - * Used with Filterator by Striterator to filter returned objects. + * Used with Filterator by Striterator to filter returned objects. This can + * represent either a single {@link IFilter} or a chain of {@link IFilter}s. */ -public abstract class Filter implements IFilter { +public abstract class Filter extends FilterBase { - protected Object m_state = null; - + /** + * + */ + private static final long serialVersionUID = 7584586850408369853L; + public Filter() {} public Filter(Object state) { - m_state = state; + super(state); } //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Filterator(src, this); - } + @Override + protected Iterator filterOnce(Iterator src, final Object context) { + return new Filterator(src, context, this); + } - //------------------------------------------------------------- + // ------------------------------------------------------------- - protected abstract boolean isValid(Object obj); + protected abstract boolean isValid(Object obj); } Added: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/FilterBase.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/FilterBase.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/FilterBase.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -0,0 +1,222 @@ +/* +Striterator - transformation and mapping patterns over java Iterators + +Copyright (C) SYSTAP, LLC 2010. All rights reserved. + +Contact: + SYSTAP, LLC + 4501 Tower Road + Greensboro, NC 27410 + lic...@bi... + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package cutthecrap.utils.striterators; + +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Used with Filterator by Striterator to filter returned objects. This can + * represent either a single {@link IFilter} or a chain of {@link IFilter}s. + */ +public abstract class FilterBase implements IFilter, Cloneable { + + private static final long serialVersionUID = 1L; + + /** + * An optional filter chain. When non-<code>null</code> this contains the + * {@link IFilter} in the same order in which they were added to this + * {@link IFilter}, but <i>this</i> is NOT included in the filter chain. + * <p> + * Note: package private for unit tests. + */ + /*private*/ volatile List<IFilter> filterChain = null; + + /** + * Annotations may be used to decorate the {@link IFilter} with required or + * optional metadata. + * <p> + * Note: package private for unit tests. + */ + /*private*/ volatile Map<String, Object> annotations; + + /** + * State from the constructor (optional). + * <p> + * Note: Striterators should not have a side-effect on state object since + * that can have unexpected consequences if the {@link IFilter} is reused. + */ + final protected Object m_state; + + public FilterBase() { + m_state = null; + } + + /** + * + * @param state + * State (optional). + */ + public FilterBase(final Object state) { + m_state = state; + } + +// public FilterBase clone() { +// +// final FilterBase inst = new FilterBase(m_state); +// +// for(IFilter filter : filterChain) { +// +// inst.addFilter(filter); +// +// } +// +// return inst; +// +// } + + /** + * Add a filter to the end of this filter chain. + * + * @param filter + * The filter. + * + * @return This filter. + */ + final public FilterBase addFilter(final IFilter filter) { + if (filter == null) + throw new IllegalArgumentException(); + if (filterChain == null) { + synchronized (this) { + /* + * Note: double-checked locking pattern and volatile field are + * used to ensure visibility in combination with lazy create of + * the backing list. + */ + if (filterChain == null) { + filterChain = Collections + .synchronizedList(new LinkedList<IFilter>()); + } + } + } + filterChain.add(filter); + + return this; + } + + final public Iterator filter(Iterator src, final Object context) { + // wrap src with _this_ filter. + src = filterOnce(src, context); + if (filterChain != null) { + // wrap source with each additional filter from the filter chain. + for (IFilter filter : filterChain) { + src = filter.filter(src, context); + } + } + return src; + } + + /** + * Wrap the source iterator with <i>this</i> filter. + * + * @param src + * The source iterator. + * @param context + * The iterator evaluation context. + * + * @return The wrapped iterator. + */ + abstract protected Iterator filterOnce(Iterator src, final Object context); + + final public Object getProperty(String name) { + + if (annotations == null) + return null; + + return annotations.get(name); + + } + + /** + * Return the value of a named property. + * + * @param name + * The property name. + * + * @return The property value. + * + * @throws IllegalStateException + * unless the named property is bound. + */ + final protected Object getRequiredProperty(final String name) { + + final Object value = getProperty(name); + + if (value == null) + throw new IllegalStateException(name); + + return value; + + } + + /** + * Set an annotation. + * + * @param name + * The name. + * @param value + * The value. + * + * @return The old value. + */ + final public Object setProperty(final String name, final Object value) { + + if (name == null) + throw new IllegalArgumentException(); + + if (annotations == null) { + /* + * Note: double-checked locking pattern and volatile field are used + * to ensure visibility in combination with lazy create of the + * annotations map. + */ + synchronized (this) { + if (annotations == null) { + annotations = Collections + .synchronizedMap(new LinkedHashMap<String, Object>()); + } + } + } + return annotations.put(name, value); + } + + /** + * Human readable representation of the filter chain. + */ + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append(super.toString()); + sb.append("{annotations=" + annotations); + sb.append(",filterChain=" + filterChain); + sb.append("}"); + return sb.toString(); + } + +} Property changes on: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/FilterBase.java ___________________________________________________________________ Added: svn:keywords + Id Date Revision Author HeadURL Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -42,13 +42,15 @@ public class Filterator implements Iterator { - Iterator m_src; - Object m_value = null; + private Iterator m_src; + private Object m_value = null; - protected Filter m_filter = null; + final protected Object m_context; + final protected Filter m_filter; - public Filterator(Iterator src, Filter filter) { + public Filterator(final Iterator src, final Object context, final Filter filter) { m_src = src; + m_context = context; m_filter = filter; m_value = getNext(); Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IFilter.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IFilter.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IFilter.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -32,16 +32,20 @@ /** * Provides the hook interface that allows use by Striterators */ -public interface IFilter extends Serializable { +public interface IFilter extends Serializable, IPropertySet { /** * <p>The filter method is provided to allow the creation of the filtering iterator.</p> * * <p>Any implementation should follow the following pattern:</p> * <pre> - * public Iterator filter(Iterator src) { - * return new Filterator(src, this); + * public Iterator filter(Iterator src, Object context) { + * return new Filterator(src, context, this); * } * </pre> + * This pattern makes the source iterator, the evaluation context, and the + * {@link IPropertySet} annotations visible to the runtime striterator + * implementation. **/ - public abstract Iterator filter(Iterator src); + public abstract Iterator filter(Iterator src, Object context); + } \ No newline at end of file Added: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IPropertySet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IPropertySet.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IPropertySet.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -0,0 +1,47 @@ +/** + +Copyright (C) SYSTAP, LLC 2006-2010. All rights reserved. + +Contact: + SYSTAP, LLC + 4501 Tower Road + Greensboro, NC 27410 + lic...@bi... + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +/* + * Created on Sep 27, 2010 + */ + +package cutthecrap.utils.striterators; + +/** + * Interface for access to named property values. + * + * @author <a href="mailto:tho...@us...">Bryan Thompson</a> + */ +public interface IPropertySet { + + /** + * Return the value of a named property. + * + * @param name + * The property name. + * + * @return The property value. + */ + Object getProperty(String name); + +} Property changes on: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IPropertySet.java ___________________________________________________________________ Added: svn:keywords + Id Date Revision Author HeadURL Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapper.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapper.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapper.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -25,8 +25,8 @@ package cutthecrap.utils.striterators; +import java.lang.reflect.Method; import java.util.Iterator; -import java.lang.reflect.Method; /** * Mapper @@ -34,9 +34,9 @@ * Used with Mapperator by Striterator to map instance methods against member objects. */ -public class Mapper implements IFilter { +public class Mapper extends FilterBase { protected Object m_client = null; - protected Method m_method = null; + protected Method m_method = null; // @todo Not serializable. Defer reflection? protected Object[] m_args = {null}; public Mapper(Object client, Method method) { @@ -46,9 +46,10 @@ //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Mapperator(src, this); - } + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Mapperator(src, context, this); + } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapperator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapperator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mapperator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -35,11 +35,13 @@ public class Mapperator implements Iterator { - Iterator m_iter; - Mapper m_mapper; + final private Iterator m_iter; + final protected Object m_context; + final private Mapper m_mapper; - public Mapperator(Iterator iter, Mapper mapper) { + public Mapperator(Iterator iter, Object context, Mapper mapper) { m_iter = iter; + m_context = context; m_mapper = mapper; } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Merger.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Merger.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Merger.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -32,8 +32,9 @@ * Used with Mergerator by Striterator to merge returned objects. */ -public class Merger implements IFilter { - protected Iterator m_xtra = null; +public class Merger extends FilterBase { + + protected Iterator m_xtra = null; // @todo Non-Serializable. protected Comparator m_comparator = null; public Merger() {} @@ -45,8 +46,9 @@ //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Mergerator(src, m_xtra, m_comparator); + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Mergerator(src, m_xtra, context, m_comparator); } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -33,14 +33,16 @@ **/ public class Mergerator implements Iterator { - Iterator m_setA; - Iterator m_setB; - Comparator m_comparator; + final private Iterator m_setA; + final private Iterator m_setB; + final protected Object m_context; + final private Comparator m_comparator; - Object m_valA = null; - Object m_valB = null; + private Object m_valA = null; + private Object m_valB = null; - public Mergerator(Iterator setA, Iterator setB, Comparator comparator) { + public Mergerator(Iterator setA, Iterator setB, Object context, Comparator comparator) { + m_context = context; m_setA = setA; m_setB = setB; Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolver.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolver.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolver.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -35,19 +35,19 @@ * Cannot be instantiated directly since an implementation of the resolve method is required. */ -public abstract class Resolver implements IFilter { - protected Object m_state = null; +public abstract class Resolver extends FilterBase { public Resolver() {} public Resolver(Object state) { - m_state = state; + super(state); } //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Resolverator(src, this); + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Resolverator(src, context, this); } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -35,11 +35,13 @@ public class Resolverator implements Iterator { - Iterator m_iter; - Resolver m_resolver; + private final Iterator m_iter; + protected final Object m_context; + private final Resolver m_resolver; - public Resolverator(Iterator iter, Resolver resolver) { + public Resolverator(Iterator iter, Object context, Resolver resolver) { m_iter = iter; + m_context = context; m_resolver = resolver; } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorter.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorter.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorter.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -25,7 +25,8 @@ package cutthecrap.utils.striterators; -import java.util.*; +import java.util.Comparator; +import java.util.Iterator; /** * <p>Used with Sorterator by Striterator to sort iterations.</p> @@ -37,17 +38,40 @@ * for sets that may be very large.</p> */ -public abstract class Sorter implements IFilter, Comparator { - public Sorter() { - } - - //------------------------------------------------------------- +abstract public class Sorter extends FilterBase implements Comparator { + +// /** +// * Annotation giving the {@link Comparator} to be applied. +// */ +// static final public String COMPARATOR = Sorter.class.getName() +// + ".comparator"; - final public Iterator filter(Iterator src) { - return new Sorterator(src, this); - } + public Sorter() { + } - //------------------------------------------------------------- +// public Sorter(Comparator c) { +// +// setProperty(COMPARATOR, c); +// +// } - public abstract int compare(Object o1, Object o2); -} \ No newline at end of file + // ------------------------------------------------------------- + + @Override + final public Iterator filterOnce(Iterator src, Object context) { + + return new Sorterator(src, context, this); + + } + + // ------------------------------------------------------------- + +// public Comparator getComparator() { +// +// return (Comparator) getRequiredProperty(COMPARATOR); +// +// } + + public abstract int compare(Object o1, Object o2); + +} Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -33,18 +33,36 @@ public class Sorterator implements Iterator { - Iterator m_iter; + private final Iterator m_iter; + protected final Object m_context; - public Sorterator(Iterator iter, Sorter sorter) { - TreeSet set = new TreeSet(sorter); - - while (iter.hasNext()) { - set.add(iter.next()); - } - - m_iter = set.iterator(); - } + public Sorterator(Iterator iter, Object context, Sorter sorter) { + this.m_context = context; + + // materialize the objects to be sorted. + LinkedList tmp = new LinkedList(); + + while(iter.hasNext()) { + tmp.add(iter.next()); + } + + Object[] a = tmp.toArray(); + + Arrays.sort(a, sorter/*.getComparator()*/); + + m_iter = Arrays.asList(a).iterator(); + +// TreeSet set = new TreeSet(sorter); +// +// while (iter.hasNext()) { +// set.add(iter.next()); +// } +// +// m_iter = set.iterator(); + + } + public boolean hasNext() { return m_iter.hasNext(); } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -25,9 +25,10 @@ package cutthecrap.utils.striterators; +import java.lang.reflect.Method; +import java.util.Enumeration; import java.util.Iterator; -import java.util.Enumeration; -import java.lang.reflect.Method; +import java.util.List; /** * Striterator @@ -38,25 +39,47 @@ * The <code>addTypeFilter</code> method allows easy specification of a class type restriction. */ public class Striterator implements IStriterator { - Iterator m_src = null; + private List<IFilter> filters = null; // Note: NOT serializable. + private transient Iterator realSource; + private transient Iterator m_src = null; - /** Constructor takes source iterator **/ - public Striterator(Iterator src) { - m_src = src; - } + /** + * Deserialization constructor. + */ + public Striterator() { + this.realSource = null; + } - public Striterator(Enumeration src) { - this(new EnumIterator(src)); - } + /** Constructor takes source iterator **/ + public Striterator(final Iterator src) { + this.realSource = src; + } - /** delegates hasNext request to source iterator **/ - public boolean hasNext() { - return m_src.hasNext(); - } + public Striterator(final Enumeration src) { + this(new EnumIterator(src)); + } - /** delegates next request to source iterator **/ - public Object next() { - return m_src.next(); + /** + * + * @param src + * @param filter + */ + public Striterator(final Iterator src, final List<IFilter> filters) { + this.realSource = src; + } + + /** delegates hasNext request to source iterator **/ + public boolean hasNext() { + if (m_src == null) + compile(realSource); + return m_src.hasNext(); + } + + /** delegates next request to source iterator **/ + public Object next() { + if (m_src == null) + compile(realSource); + return m_src.next(); } /** Enumeration version of hasNext() **/ @@ -75,12 +98,27 @@ } /** creates a Filterator to apply the filter **/ - public IStriterator addFilter(IFilter filter) { - m_src = filter.filter(m_src); - - return this; + public IStriterator addFilter(final IFilter filter) { + if (filters != null) + filters.add(filter); + + return this; } + public void compile(final Iterator src) { + compile(src, null/* context */); + } + + public void compile(final Iterator src, final Object context) { + if (m_src != null) + throw new IllegalStateException(); + m_src = realSource = src; + if (filters != null) + for (IFilter filter : filters) { + m_src = filter.filter(m_src, context); + } + } + /** check each object against cls.isInstance(object) **/ public IStriterator addTypeFilter(Class cls) { addFilter(new Filter(cls) { Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/UniquenessFilter.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/UniquenessFilter.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/UniquenessFilter.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -25,7 +25,7 @@ package cutthecrap.utils.striterators; -import java.util.*; +import java.util.LinkedHashSet; /****************************************************************************** * UniquenessFilter @@ -33,7 +33,10 @@ * Derived from Filter, and ensures no duplication, not to be used with large sets! */ public class UniquenessFilter extends Filter { - ArrayList m_members = new ArrayList(); + + private static final long serialVersionUID = 424197241022124358L; +// ArrayList m_members = new ArrayList(); + private final LinkedHashSet<Object> m_members = new LinkedHashSet<Object>(); public UniquenessFilter() { super(null); @@ -43,11 +46,12 @@ * Just make sure that the current object has not already been returned **/ protected boolean isValid(Object obj) { - if (m_members.contains(obj)) { - return false; - } - m_members.add(obj); - - return true; + return m_members.add(obj); +// if (m_members.contains(obj)) { +// return false; +// } +// m_members.add(obj); +// +// return true; } } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitor.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitor.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitor.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -25,17 +25,18 @@ package cutthecrap.utils.striterators; -import java.util.*; +import java.util.Iterator; /** * @author Martyn Cutcher */ -public abstract class Visitor implements IFilter { +public abstract class Visitor extends FilterBase { //------------------------------------------------------------- - final public Iterator filter(Iterator src) { - return new Visitorator(src, this); + @Override + final public Iterator filterOnce(Iterator src, Object context) { + return new Visitorator(src, context, this); } protected abstract void visit(Object obj); Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitorator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitorator.java 2010-09-27 23:33:28 UTC (rev 3643) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Visitorator.java 2010-09-27 23:38:47 UTC (rev 3644) @@ -32,11 +32,13 @@ */ public class Visitorator implements Iterator { - Iterator m_iter; - Visitor m_visitor; + private final Iterator m_iter; + protected final Object m_context; + private final Visitor m_visitor; - public Visitorator(Iterator iter, Visitor visitor) { + public Visitorator(Iterator iter, Object context, Visitor visitor) { m_iter = iter; + m_context = context; m_visitor = visitor; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2010-09-30 19:03:48
|
Revision: 3703 http://bigdata.svn.sourceforge.net/bigdata/?rev=3703&view=rev Author: martyncutcher Date: 2010-09-30 19:03:42 +0000 (Thu, 30 Sep 2010) Log Message: ----------- Remove prefetches in constructors and ensure NoSuchElementExceltions are thrown Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/ArrayIterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -66,7 +66,7 @@ return m_current.next(); } - throw new NoSuchElementException("FilterIterator"); + throw new NoSuchElementException("Appenderator"); } //------------------------------------------------------------- Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/ArrayIterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/ArrayIterator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/ArrayIterator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -26,6 +26,7 @@ package cutthecrap.utils.striterators; import java.util.Iterator; +import java.util.NoSuchElementException; /** * Supports standard iteration over an object Array, allowing this to @@ -47,7 +48,10 @@ /** @return current index from array **/ public Object next() { - return m_src[m_index++]; + if (m_index < m_src.length) + return m_src[m_index++]; + else + throw new NoSuchElementException("ArrayIterator"); } /** void .. does nothing **/ Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -47,21 +47,29 @@ protected final Object m_ctx; private final Contractor m_contractor; private Object m_next; + private boolean m_init = false; public Contractorator(Iterator src, final Object ctx, Contractor contractor) { m_src = src; m_ctx = ctx; m_contractor = contractor; - - m_next = m_contractor.contract(m_src); } + + private void init() { + if (!m_init) { + m_next = m_contractor.contract(m_src); + m_init = true; + } + } public boolean hasNext() { + init(); + return m_next != null; } public Object next() { - if (m_next == null) { + if (!hasNext()) { throw new NoSuchElementException(); } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Mergerator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -40,26 +40,35 @@ private Object m_valA = null; private Object m_valB = null; + private boolean m_init = false; public Mergerator(Iterator setA, Iterator setB, Object context, Comparator comparator) { m_context = context; m_setA = setA; m_setB = setB; - m_comparator = comparator; - - if (m_setA.hasNext()) { - m_valA = m_setA.next(); - } - - if (m_setB.hasNext()) { - m_valB = m_setB.next(); - } + m_comparator = comparator; } + + private void init() { + if (!m_init) { + if (m_setA.hasNext()) { + m_valA = m_setA.next(); + } + + if (m_setB.hasNext()) { + m_valB = m_setB.next(); + } + + m_init = true; + } + } //------------------------------------------------------------- public boolean hasNext() { + init(); + return m_valA != null || m_valB != null; } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Resolverator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -50,7 +50,10 @@ } public Object next() { - return m_resolver.resolve(m_iter.next()); + if (hasNext()) + return m_resolver.resolve(m_iter.next()); + else + throw new NoSuchElementException("Resolverator"); } public void remove() { Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java 2010-09-30 18:18:03 UTC (rev 3702) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Sorterator.java 2010-09-30 19:03:42 UTC (rev 3703) @@ -21,57 +21,63 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ + */ package cutthecrap.utils.striterators; import java.util.*; /** - * Initialized with a Sorter object, wraps a standard iterator and resolves each returned object + * Initialized with a Sorter object, wraps a standard iterator and resolves each + * returned object */ public class Sorterator implements Iterator { - private final Iterator m_iter; + private final Iterator m_src; + private Iterator m_iter; + private final Sorter m_sorter; protected final Object m_context; - - public Sorterator(Iterator iter, Object context, Sorter sorter) { + private boolean m_doneSort = false; - this.m_context = context; + public Sorterator(Iterator iter, Object context, Sorter sorter) { - // materialize the objects to be sorted. - LinkedList tmp = new LinkedList(); - - while(iter.hasNext()) { - tmp.add(iter.next()); - } - - Object[] a = tmp.toArray(); - - Arrays.sort(a, sorter/*.getComparator()*/); - - m_iter = Arrays.asList(a).iterator(); - -// TreeSet set = new TreeSet(sorter); -// -// while (iter.hasNext()) { -// set.add(iter.next()); -// } -// -// m_iter = set.iterator(); + m_context = context; + m_src = iter; + m_sorter = sorter; - } + } - public boolean hasNext() { - return m_iter.hasNext(); - } - - public Object next() { - return m_iter.next(); - } - - public void remove() { - m_iter.remove(); - } + private void sort() { + if (!m_doneSort) { + // materialize the objects to be sorted. + LinkedList tmp = new LinkedList(); + + while (m_src.hasNext()) { + tmp.add(m_src.next()); + } + + Object[] a = tmp.toArray(); + + Arrays.sort(a, m_sorter/* .getComparator() */); + + m_iter = Arrays.asList(a).iterator(); + m_doneSort = true; + } + } + + public boolean hasNext() { + return m_iter.hasNext(); + } + + public Object next() { + if (hasNext()) + return m_iter.next(); + else + throw new NoSuchElementException(); + } + + public void remove() { + m_iter.remove(); + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2011-02-24 09:11:03
|
Revision: 4237 http://bigdata.svn.sourceforge.net/bigdata/?rev=4237&view=rev Author: martyncutcher Date: 2011-02-24 09:10:56 +0000 (Thu, 24 Feb 2011) Log Message: ----------- Related to ticket 243 and 244 after analysis of performance of deep striterations and implementing a generic prefetch pattern that allows efficient processing of hasNext for such structures. Associated is a tail optimisation that enables the collapse of the stack-based invocations analagous to tail recursion optimisation in functional programming. Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IStriterator.java branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java Added Paths: ----------- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Prefetch.java Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Appenderator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -21,59 +21,70 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ + */ package cutthecrap.utils.striterators; import java.util.*; +import cutthecrap.utils.striterators.IStriterator.ITailOp; + /** * Appenderator **/ -public class Appenderator implements Iterator { +public class Appenderator extends Prefetch implements ITailOp { private final Iterator m_src; - protected final Object m_ctx; + protected final Object m_ctx; private final Iterator m_xtra; - + private Iterator m_current; + private boolean m_isxtra = false; - public Appenderator(Iterator src, Object ctx, Iterator xtra) { - m_src = src; - m_ctx = ctx; - m_xtra = xtra; + public Appenderator(Iterator src, Object ctx, Iterator xtra) { + m_src = src; + m_ctx = ctx; + m_xtra = xtra; - m_current = m_src; - } + m_current = m_src; + } - //------------------------------------------------------------- + // ------------------------------------------------------------- - public boolean hasNext() { - if (m_current.hasNext()) { - return true; - } else if (m_current == m_xtra) { // don't call twice - return false; - } - - m_current = m_xtra; - - return m_current.hasNext(); - } + protected Object getNext() { + Object ret = null; + if (m_current.hasNext()) { + ret = m_current.next(); + } else if (m_isxtra) { // no need to call twice + return null; + } else { + m_current = m_xtra; + m_isxtra = true; + + if (m_current.hasNext()) { + ret = m_current.next(); + } + } + // experimental tail optimisation + if (m_current instanceof ITailOp) { + m_current = ((ITailOp) m_current).availableTailOp(); + } + + return ret; + } - //------------------------------------------------------------- - // must call hasNext() to ensure m_current is correct - public Object next() { - if (hasNext()) { - return m_current.next(); - } + public Iterator availableTailOp() { + if (m_isxtra) { + return m_current; + } else { + return this; + } + } - throw new NoSuchElementException("Appenderator"); - } + // ------------------------------------------------------------- - //------------------------------------------------------------- - - public void remove() { - m_current.remove(); - } + public void remove() { + m_current.remove(); + } } \ No newline at end of file Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Contractorator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -42,12 +42,10 @@ * * @author Martyn Cutcher */ -public class Contractorator implements Iterator { +public class Contractorator extends Prefetch { private final Iterator m_src; protected final Object m_ctx; private final Contractor m_contractor; - private Object m_next; - private boolean m_init = false; public Contractorator(Iterator src, final Object ctx, Contractor contractor) { m_src = src; @@ -55,30 +53,14 @@ m_contractor = contractor; } - private void init() { - if (!m_init) { - m_next = m_contractor.contract(m_src); - m_init = true; + protected Object getNext() { + if (m_src.hasNext()) { + return m_contractor.contract(m_src); + } else { + return null; } } - public boolean hasNext() { - init(); - - return m_next != null; - } - - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - - Object ret = m_next; - m_next = m_contractor.contract(m_src); - - return ret; - } - public void remove() { throw new UnsupportedOperationException(); } Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Expanderator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -1,82 +1,55 @@ -/* -Striterator - transformation and mapping patterns over java Iterators +package cutthecrap.utils.striterators; -Copyright (C) SYSTAP, LLC 2010. All rights reserved. +import java.util.Iterator; +import java.util.NoSuchElementException; -Contact: - SYSTAP, LLC - 4501 Tower Road - Greensboro, NC 27410 - lic...@bi... +import cutthecrap.utils.striterators.IStriterator.ITailOp; -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; version 2 of the License. +public class Expanderator extends Prefetch implements ITailOp { -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + private final Iterator m_src; + private Iterator m_child = null; + protected final Object m_context; + private final Expander m_expander; -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ + public Expanderator(Iterator src, Object context, Expander expander) { + m_src = src; + m_context = context; + m_expander = expander; + } -package cutthecrap.utils.striterators; + // ------------------------------------------------------------- -import java.util.*; + protected Object getNext() { + if (m_child != null && m_child.hasNext()) { + final Object ret = m_child.next(); + + // experimental tail optimisation + if (m_child instanceof ITailOp) { + m_child = ((ITailOp) m_child).availableTailOp(); + } -/** - * Expanderator - * - * Flattens out a two-level iteration. By combining Expanderators recursively a general tree - * iteration is provided. - * - * Provides resolution for both the child object and also the nested iterator. - * The actual expansion is via an Expander object that is passed in at construction. - */ + return ret; + } else if (m_src.hasNext()) { + m_child = m_expander.expand(m_src.next()); -public class Expanderator implements Iterator { + return getNext(); + } else { + return null; + } + } - private final Iterator m_src; - private Iterator m_child = null; - protected final Object m_context; - private final Expander m_expander; - - public Expanderator(Iterator src, Object context, Expander expander) { - m_src = src; - m_context = context; - m_expander = expander; - } + // ------------------------------------------------------------- - //------------------------------------------------------------- - - public boolean hasNext() { - if (m_child != null && m_child.hasNext()) { - return true; - } else if (m_src.hasNext()) { - m_child = m_expander.expand(m_src.next()); - - return hasNext(); - } else { - return false; - } - } - - //------------------------------------------------------------- - // must call hasNext() to ensure m_child is setup - public Object next() { - if (hasNext()) { - return m_child.next(); - } - - throw new NoSuchElementException("Expanderator"); - } - - //------------------------------------------------------------- - - public void remove() { - m_child.remove(); - } -} \ No newline at end of file + public void remove() { + m_child.remove(); + } + + public Iterator availableTailOp() { + if ((!ready()) && !m_src.hasNext()) { + return m_child; + } else { + return this; + } + } +} Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Filterator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -41,20 +41,10 @@ * <p>The Filterator provide the protocol support to utilize Filter objects.</p> */ -public class Filterator implements Iterator { +public class Filterator extends Prefetch { final private Iterator m_src; - /** - * Flag set once {@link #getNext()} is invoked at least once. - */ - private boolean didInit = false; - - /** - * Pre-fetched, but initial prefetch must not be done in the constructor. - */ - private Object m_value = null; - final protected Object m_context; final protected Filter m_filter; @@ -62,38 +52,11 @@ m_src = src; m_context = context; m_filter = filter; - - /* - * Note: eager initialization causes problems when we are stacking - * filters. - */ -// m_value = getNext(); } - //------------------------------------------------------------- - public boolean hasNext() { - if (!didInit) { - m_value = getNext(); - } - return m_value != null; - } - //------------------------------------------------------------- - // must call hasNext() to ensure m_child is setup - public Object next() { - if (hasNext()) { - Object val = m_value; - m_value = getNext(); - return val; - } - - throw new NoSuchElementException("FilterIterator"); - } - - //------------------------------------------------------------- - public void remove() { m_src.remove(); } @@ -101,7 +64,6 @@ //------------------------------------------------------------- protected Object getNext() { - didInit = true; while (m_src.hasNext()) { final Object next = m_src.next(); Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IStriterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IStriterator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/IStriterator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -59,4 +59,16 @@ * iter.map(this, MyClass.aMethod); **/ public IStriterator map(Object client, Method method); + + public interface ITailOp { + /** + * Opportunity for a Striterator to provide a "tail iterator" to + * shorten the call stack. For example, an Appenderator would return + * the second iterator if current. Or an Expanderator the child iterator + * if there were no more source objects. + * + * @return a tail optimizing iterator if possible + */ + public Iterator availableTailOp(); + } } Added: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Prefetch.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Prefetch.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Prefetch.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -0,0 +1,46 @@ +package cutthecrap.utils.striterators; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +public abstract class Prefetch implements Iterator { + private Object m_next; + private boolean m_ready = false; + + final private void checkInit() { + if (!m_ready) { + m_next = getNext(); + m_ready = true; + } + } + + abstract protected Object getNext(); + + public boolean hasNext() { + checkInit(); + + return m_next != null; + } + + public Object next() { + checkInit(); // check prefetch is ready + + if (m_next == null) { + throw new NoSuchElementException(); + } + + Object ret = m_next; + + // do not prefetch on next() since this may cause problems with + // side-effecting + // overides + m_next = null; + m_ready = false; + + return ret; + } + + protected boolean ready() { + return m_ready; + } +} Property changes on: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Prefetch.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Id Date Revision Author HeadURL Modified: branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java =================================================================== --- branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java 2011-02-24 01:04:12 UTC (rev 4236) +++ branches/QUADS_QUERY_BRANCH/ctc-striterators/src/java/cutthecrap/utils/striterators/Striterator.java 2011-02-24 09:10:56 UTC (rev 4237) @@ -32,6 +32,8 @@ import java.util.LinkedList; import java.util.List; +import cutthecrap.utils.striterators.IStriterator.ITailOp; + /** * Striterator * @@ -40,7 +42,7 @@ * The IFilter objects passed to addFilter allow selection criteria for the iterated objects. * The <code>addTypeFilter</code> method allows easy specification of a class type restriction. */ -public class Striterator implements IStriterator { +public class Striterator implements IStriterator, ITailOp { volatile List<IFilter> filters = null; // Note: NOT serializable. private volatile Iterator realSource; private volatile Iterator m_src = null; @@ -82,7 +84,13 @@ public Object next() { if (m_src == null) compile(realSource); - return m_src.next(); + final Object ret = m_src.next(); + // experimental tail optimisation + if (m_src instanceof ITailOp) { + Object old = m_src; + m_src = ((ITailOp) m_src).availableTailOp(); + } + return ret; } /** Enumeration version of hasNext() **/ @@ -120,7 +128,7 @@ return this; } - + public void compile(final Iterator src) { compile(src, null/* context */); } @@ -190,4 +198,27 @@ return sb.toString(); } + /** + * If this Striterator has not been overriden then return the + * source iterator, or even better, try and recurse to the nested tailOp + * if available. + * + * This has been disabled since it appears to have a negative effect. + * + * To reactivate, uncomment the ITailOp implementation declaration. + * + * TODO: Investigate apparent performance degradation with activation + * + * @return + */ + boolean doneone = false; + public Iterator availableTailOp() { + final boolean avail = Striterator.class == this.getClass(); + + if (avail) { + return (m_src instanceof ITailOp) ? ((ITailOp) m_src).availableTailOp() : m_src; + } else { + return this; + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |