diff --git a/vuu/src/main/scala/org/finos/vuu/net/ClientConnectionCreator.scala b/vuu/src/main/scala/org/finos/vuu/net/ClientConnectionCreator.scala index 81cd8ef63..aa7f09fa8 100644 --- a/vuu/src/main/scala/org/finos/vuu/net/ClientConnectionCreator.scala +++ b/vuu/src/main/scala/org/finos/vuu/net/ClientConnectionCreator.scala @@ -38,17 +38,17 @@ class DefaultMessageHandler(val channel: Channel, sessionContainer: ClientSessionContainer, moduleContainer: ModuleContainer)(implicit timeProvider: Clock) extends MessageHandler with StrictLogging { - val closeFuture = channel.closeFuture() + val closeFuture: ChannelFuture = channel.closeFuture() - closeFuture.addListener(new ChannelFutureListener { - override def operationComplete(f: ChannelFuture): Unit = { - logger.info("Calling disconnect() from future callback") - disconnect() - } + closeFuture.addListener((f: ChannelFuture) => { + logger.info("Calling disconnect() from future callback") + disconnect() }) private def sendUpdatesInternal(updates: Seq[ViewPortUpdate], highPriority: Boolean = false) = { - if (!updates.isEmpty) { + if (updates.nonEmpty) { + + logger.info(s"ASYNC-SVR-OUT: Sending ${updates.size} updates") val formatted = formatDataOutbound(updates) @@ -81,7 +81,7 @@ class DefaultMessageHandler(val channel: Channel, } } - def disconnect() = { + def disconnect(): ChannelFuture = { serverApi.disconnect(session) sessionContainer.remove(session) channel.disconnect() @@ -91,19 +91,19 @@ class DefaultMessageHandler(val channel: Channel, protected def formatDataOutbound(outbound: Seq[ViewPortUpdate]): TableRowUpdates = { val updates = outbound.filter(vpu => vpu.vpRequestId == vpu.vp.getRequestId).flatMap(vp => formatOneRowUpdate(vp)).toArray + //val updates = outbound.flatMap(vp => formatOneRowUpdate(vp)).toArray val updateId = RequestId.oneNew() - TableRowUpdates(updateId, true, timeProvider.now, updates) + TableRowUpdates(updateId, isLast = true, timeProvider.now(), updates) } protected def formatOneRowUpdate(update: ViewPortUpdate): Option[RowUpdate] = { update.vpUpdate match { - case SizeUpdateType => { + case SizeUpdateType => //logger.debug(s"SVR[VP] Size: vpid=${update.vp.id} size=${update.vp.size}") Some(RowUpdate(update.vpRequestId, update.vp.id, update.size, update.index, update.key.key, UpdateType.SizeOnly, timeProvider.now(), 0, Array.empty)) - } case RowUpdateType => @@ -168,12 +168,12 @@ class DefaultMessageHandler(val channel: Channel, case None => logger.error(s"Could not find impl for service ${rpc.service}") Some(VsMsg(msg.requestId, msg.sessionId, msg.token, msg.user, - RpcResponse(rpc.method, null, Error(s"Handler not found for rpc call ${rpc} for service ${rpc.service} in module ${msg.module}", -1))) + RpcResponse(rpc.method, null, Error(s"Handler not found for rpc call $rpc for service ${rpc.service} in module ${msg.module}", -1))) ) } case None => Some(VsMsg(msg.requestId, msg.sessionId, msg.token, msg.user, - RpcResponse(rpc.method, null, Error(s"Handler not found for rpc call ${rpc} in module ${msg.module}", -1)))) + RpcResponse(rpc.method, null, Error(s"Handler not found for rpc call $rpc in module ${msg.module}", -1)))) } } @@ -196,7 +196,7 @@ case class ClientSessionId(sessionId: String, user: String) extends Ordered[Clie trait ClientSessionContainer { - def register(sessionId: ClientSessionId, messageHandler: MessageHandler) + def register(sessionId: ClientSessionId, messageHandler: MessageHandler): Unit //def addConnection(session: ClientSessionId, channel: Channel, handler: InboundMessageHandler): Unit def getHandler(sessionId: ClientSessionId): Option[MessageHandler] diff --git a/vuu/src/main/scala/org/finos/vuu/viewport/ViewPort.scala b/vuu/src/main/scala/org/finos/vuu/viewport/ViewPort.scala index ee4c74723..8573ba501 100644 --- a/vuu/src/main/scala/org/finos/vuu/viewport/ViewPort.scala +++ b/vuu/src/main/scala/org/finos/vuu/viewport/ViewPort.scala @@ -214,6 +214,8 @@ class ViewPortImpl(val id: String, val onlySortOrFilterChange = onlyFilterOrSortChanged(newStructuralFields, structuralFields.get()) + logger.info(s"changeStructure(..) onlySortOrFilterChange=$onlySortOrFilterChange") + structuralFields.set(newStructuralFields) if (!onlySortOrFilterChange) @@ -277,6 +279,8 @@ class ViewPortImpl(val id: String, val inrangeKeys = currentKeys.slice(from, to) + logger.info(s"Sending updates on ${inrangeKeys.length} inrangeKeys") + inrangeKeys.zip(from to to).foreach({ case (key, index) => publishHighPriorityUpdate(key, index) }) } @@ -474,8 +478,8 @@ class ViewPortImpl(val id: String, } private def publishHighPriorityUpdate(key: String, index: Int): Unit = { - logger.debug(s"publishing update @[$index] = $key ") if (this.enabled) { + logger.debug(s"publishing update @[$index] = $key ") outboundQ.pushHighPriority(ViewPortUpdate(this.requestId, this, table, RowKeyUpdate(key, table), index, RowUpdateType, this.keys.length, timeProvider.now())) } } diff --git a/vuu/src/main/scala/org/finos/vuu/viewport/ViewPortContainer.scala b/vuu/src/main/scala/org/finos/vuu/viewport/ViewPortContainer.scala index 4ecdc407c..621aada28 100644 --- a/vuu/src/main/scala/org/finos/vuu/viewport/ViewPortContainer.scala +++ b/vuu/src/main/scala/org/finos/vuu/viewport/ViewPortContainer.scala @@ -428,6 +428,9 @@ class ViewPortContainer(val tableContainer: TableContainer, val providerContaine UserDefinedFilterAndSort(aFilter, aSort) } + //update the viewport request id, to prevent any unwanted updates going out while we're changing the viewport + viewPort.setRequestId(requestId) + //we are not grouped by, but we want to change to a group by if (viewPort.getGroupBy == NoGroupBy && groupBy != NoGroupBy) { @@ -512,12 +515,16 @@ class ViewPortContainer(val tableContainer: TableContainer, val providerContaine } else { logger.info("[VP] default else condition in change() call") - val structure = viewport.ViewPortStructuralFields(table = viewPort.table, columns = columns, viewPortDef = viewPort.getStructure.viewPortDef, filtAndSort = filtAndSort, filterSpec = filterSpec, groupBy = groupBy, viewPort.getTreeNodeStateStore, permissionChecker) + val structure = viewport.ViewPortStructuralFields(table = viewPort.table, + columns = columns, viewPortDef = viewPort.getStructure.viewPortDef, + filtAndSort = filtAndSort, filterSpec = filterSpec, + groupBy = groupBy, viewPort.getTreeNodeStateStore, permissionChecker + ) + //viewPort.setRequestId(requestId) viewPort.changeStructure(structure) + //viewPort.setKeys(viewPort.getKeys) } - viewPort.setRequestId(requestId) - viewPort } diff --git a/vuu/src/test/scala/org/finos/vuu/viewport/CalculatedColumnsViewPortTest.scala b/vuu/src/test/scala/org/finos/vuu/viewport/CalculatedColumnsViewPortTest.scala index 7c6bbfd64..340db3a49 100644 --- a/vuu/src/test/scala/org/finos/vuu/viewport/CalculatedColumnsViewPortTest.scala +++ b/vuu/src/test/scala/org/finos/vuu/viewport/CalculatedColumnsViewPortTest.scala @@ -12,126 +12,190 @@ class CalculatedColumnsViewPortTest extends AbstractViewPortTestCase with Matche Feature("Create a Viewport with calc on a non-existant column") { - Given("we've created a viewport with orders in and a calc'd column 2") - val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() - - val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "logicTest:String:=if(fooBar = 109, \"Yay\", \"Boo\")")) - - createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) - - val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) - - viewPortContainer.runOnce() - - val combinedUpdates = combineQs(viewPort) - - //this result is not ideal, need to fix, logic operators currently 'eat' the error message from the missing column - //it should return a compound error - assertVpEq(combinedUpdates) { - Table( - ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","logicTest"), - ("NYC-0000","chris" ,"VOD.L" ,1311544800L,100 ,"Boo" ), - ("NYC-0001","chris" ,"VOD.L" ,1311544800L,101 ,"Boo" ), - ("NYC-0002","chris" ,"VOD.L" ,1311544800L,102 ,"Boo" ), - ("NYC-0003","chris" ,"VOD.L" ,1311544800L,103 ,"Boo" ), - ("NYC-0004","chris" ,"VOD.L" ,1311544800L,104 ,"Boo" ), - ("NYC-0005","chris" ,"VOD.L" ,1311544800L,105 ,"Boo" ), - ("NYC-0006","chris" ,"VOD.L" ,1311544800L,106 ,"Boo" ), - ("NYC-0007","chris" ,"VOD.L" ,1311544800L,107 ,"Boo" ), - ("NYC-0008","chris" ,"VOD.L" ,1311544800L,108 ,"Boo" ), - ("NYC-0009","chris" ,"VOD.L" ,1311544800L,109 ,"Boo" ) - ) + Scenario("Scenario 1") { + + Given("we've created a viewport with orders in and a calc'd column 2") + val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() + + val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "logicTest:String:=if(fooBar = 109, \"Yay\", \"Boo\")")) + + createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) + + val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) + + viewPortContainer.runOnce() + + val combinedUpdates = combineQs(viewPort) + + //this result is not ideal, need to fix, logic operators currently 'eat' the error message from the missing column + //it should return a compound error + assertVpEq(combinedUpdates) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity", "logicTest"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100, "Boo"), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101, "Boo"), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102, "Boo"), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103, "Boo"), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104, "Boo"), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105, "Boo"), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106, "Boo"), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107, "Boo"), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108, "Boo"), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109, "Boo") + ) + } } } - Feature("Create a Viewport with logical calculated columns in") { - Given("we've created a viewport with orders in and a calc'd column") - val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() + Feature("Create a Viewport with logical calculated columns in") { - val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "logicTest:String:=if(quantity = 109, \"Yay\", \"Boo\")")) + Scenario("Scenario 2") { - createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) + val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() - val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) + val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "logicTest:String:=if(quantity = 109, \"Yay\", \"Boo\")")) - viewPortContainer.runOnce() + createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) - val combinedUpdates = combineQs(viewPort) + val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) - assertVpEq(combinedUpdates) { - Table( - ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","logicTest"), - ("NYC-0000","chris" ,"VOD.L" ,1311544800L,100 ,"Boo" ), - ("NYC-0001","chris" ,"VOD.L" ,1311544800L,101 ,"Boo" ), - ("NYC-0002","chris" ,"VOD.L" ,1311544800L,102 ,"Boo" ), - ("NYC-0003","chris" ,"VOD.L" ,1311544800L,103 ,"Boo" ), - ("NYC-0004","chris" ,"VOD.L" ,1311544800L,104 ,"Boo" ), - ("NYC-0005","chris" ,"VOD.L" ,1311544800L,105 ,"Boo" ), - ("NYC-0006","chris" ,"VOD.L" ,1311544800L,106 ,"Boo" ), - ("NYC-0007","chris" ,"VOD.L" ,1311544800L,107 ,"Boo" ), - ("NYC-0008","chris" ,"VOD.L" ,1311544800L,108 ,"Boo" ), - ("NYC-0009","chris" ,"VOD.L" ,1311544800L,109 ,"Yay" ) - ) + viewPortContainer.runOnce() + + val combinedUpdates = combineQs(viewPort) + + assertVpEq(combinedUpdates) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity", "logicTest"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100, "Boo"), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101, "Boo"), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102, "Boo"), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103, "Boo"), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104, "Boo"), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105, "Boo"), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106, "Boo"), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107, "Boo"), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108, "Boo"), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109, "Yay") + ) + } } } - Feature("Create a Viewport with calculated columns in"){ + Feature("Create a Viewport with calculated columns in") { + + Scenario("Scenario 3") { - Given("we've created a viewport with orders in and a calc'd column") val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() - val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "quantityTimes100:Long:=quantity*100")) + val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "quantityTimes100:Long:=quantity*100")) - createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) + createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) - viewPortContainer.runOnce() - - val combinedUpdates = combineQs(viewPort) - - assertVpEq(combinedUpdates) { - Table( - ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","quantityTimes100"), - ("NYC-0000","chris" ,"VOD.L" ,1311544800L,100 ,10000 ), - ("NYC-0001","chris" ,"VOD.L" ,1311544800L,101 ,10100 ), - ("NYC-0002","chris" ,"VOD.L" ,1311544800L,102 ,10200 ), - ("NYC-0003","chris" ,"VOD.L" ,1311544800L,103 ,10300 ), - ("NYC-0004","chris" ,"VOD.L" ,1311544800L,104 ,10400 ), - ("NYC-0005","chris" ,"VOD.L" ,1311544800L,105 ,10500 ), - ("NYC-0006","chris" ,"VOD.L" ,1311544800L,106 ,10600 ), - ("NYC-0007","chris" ,"VOD.L" ,1311544800L,107 ,10700 ), - ("NYC-0008","chris" ,"VOD.L" ,1311544800L,108 ,10800 ), - ("NYC-0009","chris" ,"VOD.L" ,1311544800L,109 ,10900 ) - ) + viewPortContainer.runOnce() + + val combinedUpdates = combineQs(viewPort) + + assertVpEq(combinedUpdates) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity", "quantityTimes100"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100, 10000), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101, 10100), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102, 10200), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103, 10300), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104, 10400), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105, 10500), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106, 10600), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107, 10700), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108, 10800), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109, 10900) + ) + } + + + val viewPortColumns2 = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "textConcat:String:=concatenate(orderId, ric)")) + + val viewPort2 = viewPortContainer.change(RequestId.oneNew(), session, viewPort.id, ViewPortRange(0, 10), viewPortColumns2) + + viewPortContainer.runOnce() + + val combinedUpdates2 = combineQs(viewPort2) + + assertVpEq(combinedUpdates2) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity", "textConcat"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100, "NYC-0000VOD.L"), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101, "NYC-0001VOD.L"), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102, "NYC-0002VOD.L"), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103, "NYC-0003VOD.L"), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104, "NYC-0004VOD.L"), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105, "NYC-0005VOD.L"), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106, "NYC-0006VOD.L"), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107, "NYC-0007VOD.L"), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108, "NYC-0008VOD.L"), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109, "NYC-0009VOD.L") + ) + } } + } - val viewPortColumns2 = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "textConcat:String:=concatenate(orderId, ric)")) + Feature("Amend a Viewport to include a calculated columns in") { - val viewPort2 = viewPortContainer.change(RequestId.oneNew(), session, viewPort.id, ViewPortRange(0, 10), viewPortColumns2) + Scenario("Scenario 4") { - viewPortContainer.runOnce() + val (viewPortContainer, orders, ordersProvider, session, outQueue) = createDefaultViewPortInfra() - val combinedUpdates2 = combineQs(viewPort2) + val viewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric")) - assertVpEq(combinedUpdates2) { - Table( - ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","textConcat"), - ("NYC-0000","chris" ,"VOD.L" ,1311544800L,100 ,"NYC-0000VOD.L"), - ("NYC-0001","chris" ,"VOD.L" ,1311544800L,101 ,"NYC-0001VOD.L"), - ("NYC-0002","chris" ,"VOD.L" ,1311544800L,102 ,"NYC-0002VOD.L"), - ("NYC-0003","chris" ,"VOD.L" ,1311544800L,103 ,"NYC-0003VOD.L"), - ("NYC-0004","chris" ,"VOD.L" ,1311544800L,104 ,"NYC-0004VOD.L"), - ("NYC-0005","chris" ,"VOD.L" ,1311544800L,105 ,"NYC-0005VOD.L"), - ("NYC-0006","chris" ,"VOD.L" ,1311544800L,106 ,"NYC-0006VOD.L"), - ("NYC-0007","chris" ,"VOD.L" ,1311544800L,107 ,"NYC-0007VOD.L"), - ("NYC-0008","chris" ,"VOD.L" ,1311544800L,108 ,"NYC-0008VOD.L"), - ("NYC-0009","chris" ,"VOD.L" ,1311544800L,109 ,"NYC-0009VOD.L") - ) - } + createNOrderRowsNoSleep(ordersProvider, 10)(timeProvider) - } + val viewPort = viewPortContainer.create(RequestId.oneNew(), session, outQueue, orders, ViewPortRange(0, 10), viewPortColumns) + + viewPortContainer.runOnce() + + val combinedUpdates = combineQs(viewPort) + + assertVpEq(combinedUpdates) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109) + ) + } + + val amendViewPortColumns = ViewPortColumnCreator.create(orders, List("orderId", "trader", "tradeTime", "quantity", "ric", "textConcat:String:=concatenate(orderId, ric)")) + + val amendViewPort = viewPortContainer.change(RequestId.oneNew(), session, viewPort.id, ViewPortRange(0, 10), amendViewPortColumns) + + val combinedUpdates2 = combineQs(amendViewPort) + + assertVpEq(combinedUpdates2) { + Table( + ("orderId", "trader", "ric", "tradeTime", "quantity", "textConcat"), + ("NYC-0000", "chris", "VOD.L", 1311544800L, 100, "NYC-0000VOD.L"), + ("NYC-0001", "chris", "VOD.L", 1311544800L, 101, "NYC-0001VOD.L"), + ("NYC-0002", "chris", "VOD.L", 1311544800L, 102, "NYC-0002VOD.L"), + ("NYC-0003", "chris", "VOD.L", 1311544800L, 103, "NYC-0003VOD.L"), + ("NYC-0004", "chris", "VOD.L", 1311544800L, 104, "NYC-0004VOD.L"), + ("NYC-0005", "chris", "VOD.L", 1311544800L, 105, "NYC-0005VOD.L"), + ("NYC-0006", "chris", "VOD.L", 1311544800L, 106, "NYC-0006VOD.L"), + ("NYC-0007", "chris", "VOD.L", 1311544800L, 107, "NYC-0007VOD.L"), + ("NYC-0008", "chris", "VOD.L", 1311544800L, 108, "NYC-0008VOD.L"), + ("NYC-0009", "chris", "VOD.L", 1311544800L, 109, "NYC-0009VOD.L") + ) + } + } + } }