001/* 002# Licensed Materials - Property of IBM 003# Copyright IBM Corp. 2015 004 */ 005package vwap; 006 007import java.util.List; 008 009import com.ibm.streamsx.topology.TStream; 010import com.ibm.streamsx.topology.TWindow; 011import com.ibm.streamsx.topology.function.BiFunction; 012import com.ibm.streamsx.topology.function.Function; 013 014public class VwapProcessing { 015 016 @SuppressWarnings("serial") 017 public static TStream<Bargain> bargains(TStream<Trade> trades, 018 TStream<Quote> quotes) { 019 020 final Function<Ticker,String> tickerKey = Ticker::getTicker; 021 022 TWindow<Trade,String> tradesWindow = trades.last(4).key(tickerKey); 023 024 TStream<VWapT> vwap = tradesWindow.aggregate( 025 new Function<List<Trade>, VWapT>() { 026 027 @Override 028 public VWapT apply(List<Trade> tuples) { 029 VWapT vwap = null; 030 for (Trade trade : tuples) { 031 if (vwap == null) 032 vwap = new VWapT(trade); 033 vwap.newTrade(trade); 034 } 035 return vwap == null ? null : vwap.complete(); 036 } 037 }); 038 039 TStream<Bargain> bargainIndex = quotes.joinLast( 040 tickerKey, 041 vwap, 042 tickerKey, 043 new BiFunction<Quote, VWapT, Bargain>() { 044 045 @Override 046 public Bargain apply(Quote v1, VWapT v2) { 047 if (v2 == null) // window is empty! 048 return null; 049 return new Bargain(v1, v2); 050 } 051 }); 052 053 return bargainIndex; 054 } 055}