/* * StreamCruncher: Copyright (c) 2006-2008, Ashwin Jayaprakash. All Rights Reserved. * Contact: ashwin {dot} jayaprakash {at} gmail {dot} com * Web: http://www.StreamCruncher.com * * This file is part of StreamCruncher. * * StreamCruncher is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * StreamCruncher 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with StreamCruncher. If not, see <http://www.gnu.org/licenses/>. */ package streamcruncher.innards.core.partition.function; import java.io.ObjectStreamException; import streamcruncher.api.TimeWindowSizeProvider; import streamcruncher.api.WindowSizeProvider; import streamcruncher.api.artifact.RowSpec; import streamcruncher.boot.ProviderManager; import streamcruncher.boot.ProviderManagerException; import streamcruncher.boot.Registry; import streamcruncher.innards.util.SourceToTargetMapper; /* * Author: Ashwin Jayaprakash Date: Feb 19, 2006 Time: 3:15:40 PM */ public abstract class WindowFunctionBuilder extends FunctionBuilder { protected final int[] sourceLocationForTargetCols; protected final int defaultSize; protected final String providerName; protected transient WindowSizeProvider provider; /** * @param selectedRowSpec * @param newRowSpec * @param defaultSize * @param providerName * @throws ProviderManagerException */ public WindowFunctionBuilder(RowSpec selectedRowSpec, RowSpec newRowSpec, int defaultSize, String providerName) throws ProviderManagerException { super(selectedRowSpec, newRowSpec); this.sourceLocationForTargetCols = new SourceToTargetMapper(selectedRowSpec, newRowSpec) .map(); this.defaultSize = defaultSize; this.providerName = providerName; init(); } private void init() throws ProviderManagerException { ProviderManager manager = Registry.getImplFor(ProviderManager.class); this.provider = (WindowSizeProvider) manager.createProvider(providerName); this.provider.setSize(defaultSize); } protected abstract Object readResolve() throws ObjectStreamException; public long getDefaultSize() { return defaultSize; } public String getProviderName() { return providerName; } public WindowSizeProvider getProvider() { return provider; } /** * @return Returns the sourceLocationForTargetCols. */ public int[] getSourceLocationForTargetCols() { return sourceLocationForTargetCols; } // ----------------- public static class SlidingWindowFunctionBuilder extends WindowFunctionBuilder { private static final long serialVersionUID = 1L; public SlidingWindowFunctionBuilder(RowSpec selectedRowSpec, RowSpec newRowSpec, int defaultSize, String providerName) throws ProviderManagerException { super(selectedRowSpec, newRowSpec, defaultSize, providerName); } @Override protected Object readResolve() throws ObjectStreamException { Object object = null; try { object = new SlidingWindowFunctionBuilder(this.realTableRowSpec, this.finalTableRowSpec, this.defaultSize, this.providerName); } catch (ProviderManagerException e) { ObjectStreamException e1 = new ObjectStreamException(e.getMessage()) { }; e1.setStackTrace(e.getStackTrace()); throw e1; } return object; } // ----------------- @Override public Function build(Object[] levelValues) { int size = getProvider().provideSize(levelValues); return new SlidingWindowFunction(realTableRowSpec, finalTableRowSpec, rowIdGenerator, sourceLocationForTargetCols, size); } } public static class TimeWindowFunctionBuilder extends WindowFunctionBuilder { private static final long serialVersionUID = 1L; protected final long defaultTime; private transient TimeWindowSizeProvider timeWindowSizeProvider; public TimeWindowFunctionBuilder(RowSpec selectedRowSpec, RowSpec newRowSpec, int defaultSize, long defaultTime, String providerName) throws ProviderManagerException { super(selectedRowSpec, newRowSpec, defaultSize, providerName); this.defaultTime = defaultTime; this.timeWindowSizeProvider = (TimeWindowSizeProvider) this.provider; this.timeWindowSizeProvider.setSizeMillis(this.defaultTime); } @Override protected Object readResolve() throws ObjectStreamException { Object object = null; try { object = new TimeWindowFunctionBuilder(this.realTableRowSpec, this.finalTableRowSpec, this.defaultSize, this.defaultTime, this.providerName); } catch (ProviderManagerException e) { ObjectStreamException e1 = new ObjectStreamException(e.getMessage()) { }; e1.setStackTrace(e.getStackTrace()); throw e1; } return object; } @Override public TimeWindowSizeProvider getProvider() { return timeWindowSizeProvider; } public long getDefaultTime() { return defaultTime; } // ----------------- @Override public Function build(Object[] levelValues) { long windowSizeMillis = timeWindowSizeProvider.provideSizeMillis(levelValues); int size = timeWindowSizeProvider.provideSize(levelValues); return new TimeWindowFunction(realTableRowSpec, finalTableRowSpec, rowIdGenerator, sourceLocationForTargetCols, windowSizeMillis, size); } } public static class TumblingWindowFunctionBuilder extends WindowFunctionBuilder { private static final long serialVersionUID = 1L; public TumblingWindowFunctionBuilder(RowSpec selectedRowSpec, RowSpec newRowSpec, int defaultSize, String providerName) throws ProviderManagerException { super(selectedRowSpec, newRowSpec, defaultSize, providerName); } @Override protected Object readResolve() throws ObjectStreamException { Object object = null; try { object = new TumblingWindowFunctionBuilder(this.realTableRowSpec, this.finalTableRowSpec, this.defaultSize, this.providerName); } catch (ProviderManagerException e) { ObjectStreamException e1 = new ObjectStreamException(e.getMessage()) { }; e1.setStackTrace(e.getStackTrace()); throw e1; } return object; } // ----------------- @Override public Function build(Object[] levelValues) { int size = getProvider().provideSize(levelValues); return new TumblingWindowFunction(realTableRowSpec, finalTableRowSpec, rowIdGenerator, sourceLocationForTargetCols, size); } } }