Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 32 additions & 9 deletions vuu/src/main/scala/org/finos/vuu/api/TableDef.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ object Link {
}
}

// Used in table definition to indicate the visibility level of a table
trait Visibility

// All users can create view port to see the table
object Public extends Visibility

// No users can create view port to see the table. Only for vuu internal use, e.g. base tables for a join table.
object Private extends Visibility

object SessionTableDef {
def apply(name: String, keyField: String, columns: Array[Column], joinFields: String*): TableDef = {
new SessionTableDef(name, keyField, columns, joinFields, indices = Indices())
Expand All @@ -32,7 +41,7 @@ object SessionTableDef {

object JoinSessionTableDef {
def apply(name: String, keyField: String, columns: Array[Column], joinFields: String*): TableDef = {
null//new JoinSessionTableDef(name, keyField, columns, joinFields, indices = Indices())
null //new JoinSessionTableDef(name, keyField, columns, joinFields, indices = Indices())
}
}

Expand All @@ -54,8 +63,8 @@ object TableDef {
new TableDef(name, keyField, columns, joinFields, indices = Indices())
}

def apply(name: String, keyField: String, columns: Array[Column], invisible: Boolean, joinFields: String*): TableDef = {
new TableDef(name, keyField, columns, joinFields, indices = Indices(), invisible = invisible)
def apply(name: String, keyField: String, columns: Array[Column], visibility: Visibility, joinFields: String*): TableDef = {
new TableDef(name, keyField, columns, joinFields, indices = Indices(), visibility = visibility)
}
}

Expand Down Expand Up @@ -109,7 +118,7 @@ case class AvailableViewPortVisualLink(parentVpId: String, link: Link) {
override def toString: String = "(" + parentVpId.split("-").last + ")" + link.fromColumn + " to " + link.toTable + "." + link.toColumn
}

class JoinSessionTableDef(name: String, baseTable: TableDef, joinColumns: Array[Column], joinFields: Seq[String], joins: JoinTo*) extends JoinTableDef(name, baseTable, joinColumns, links = VisualLinks(), joinFields) with VuuInMemPluginLocator
class JoinSessionTableDef(name: String, visibility: Visibility, baseTable: TableDef, joinColumns: Array[Column], joinFields: Seq[String], joins: JoinTo*) extends JoinTableDef(name, visibility, baseTable, joinColumns, links = VisualLinks(), joinFields) with VuuInMemPluginLocator

class SessionTableDef(name: String,
keyField: String,
Expand All @@ -127,7 +136,7 @@ class TableDef(val name: String,
val autosubscribe: Boolean = false,
val links: VisualLinks = VisualLinks(),
val indices: Indices,
val invisible: Boolean = false) extends VuuInMemPluginLocator {
val visibility: Visibility = Public) extends VuuInMemPluginLocator {

private val createdTimeColumn: SimpleColumn = SimpleColumn(CreatedTimeColumnName, customColumns.length, DataType.fromString("long"))
private val updatedTimeColumn: SimpleColumn = SimpleColumn(LastUpdatedTimeColumnName, customColumns.length + 1, DataType.fromString("long"))
Expand All @@ -142,9 +151,9 @@ class TableDef(val name: String,
}

def permissionChecker(viewPort: ViewPort, tableContainer: TableContainer): Option[RowPermissionChecker] = {
if(permissionFunc != null){
if (permissionFunc != null) {
Some(permissionFunc(viewPort, tableContainer))
}else{
} else {
None
}
}
Expand All @@ -171,7 +180,7 @@ class TableDef(val name: String,

trait JoinType

object LeftOuterJoin extends JoinType{
object LeftOuterJoin extends JoinType {
override def toString: String = "LeftOuterJoin"
}

Expand All @@ -182,7 +191,16 @@ case class JoinSpec(left: String, right: String, joinType: JoinType = InnerJoin)

case class JoinTo(table: TableDef, joinSpec: JoinSpec)

case class JoinTableDef(override val name: String, baseTable: TableDef, joinColumns: Array[Column], override val links: VisualLinks, override val joinFields: Seq[String], joins: JoinTo*) extends TableDef(name, baseTable.keyField, joinColumns, joinFields, indices = Indices(), autosubscribe = false) with VuuInMemPluginLocator{
case class JoinTableDef(
override val name: String,
override val visibility: Visibility,
baseTable: TableDef,
joinColumns: Array[Column],
override val links: VisualLinks,
override val joinFields: Seq[String],
joins: JoinTo*)
extends TableDef(name, baseTable.keyField, joinColumns, joinFields, indices = Indices(), autosubscribe = false, visibility = visibility)
with VuuInMemPluginLocator {

lazy val joinTableColumns = getJoinDefinitionColumnsInternal()
lazy val rightTables = joins.map(join => join.table.name).toArray
Expand Down Expand Up @@ -239,6 +257,11 @@ case class JoinTableDef(override val name: String, baseTable: TableDef, joinColu
}
}

object JoinTableDef {
def apply(name: String, baseTable: TableDef, joinColumns: Array[Column], links: VisualLinks, joinFields: Seq[String], joins: JoinTo): JoinTableDef = {
new JoinTableDef(name, Public, baseTable, joinColumns, links, joinFields, joins)
}
}
//case class JoinTableDef(override val name: String, left: TableDef, right: TableDef, joinDef: JoinDefinition, joinColumns: Array[Column]) extends TableDef(name, joinDef.leftKeyField, joinColumns){
// def getJoinDefinitionColumns():Array[Column] = {
// Array(columnForName(left.keyField), columnForName(joinDef.rightKeyField))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package org.finos.vuu.core

import com.typesafe.scalalogging.StrictLogging
import org.finos.toolbox.time.Clock
import org.finos.vuu.api.AvailableViewPortVisualLink
import org.finos.vuu.api.{AvailableViewPortVisualLink, Public}
import org.finos.vuu.core.table.{DataType, TableContainer, ViewPortColumnCreator}
import org.finos.vuu.net._
import org.finos.vuu.net.rpc.{RpcFunctionFailure, RpcFunctionSuccess}
Expand Down Expand Up @@ -315,7 +315,7 @@ class CoreServerApiHandler(val viewPortContainer: ViewPortContainer,

val table = tableContainer.getTable(msg.table.table)

if (table == null || table.getTableDef.invisible) {
if (table == null || table.getTableDef.visibility != Public) {
vsMsg(CreateViewPortReject(msg.table, s"no table found for ${msg.table}"))(ctx)
} else {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,26 +37,26 @@ object TableTestHelper {
name = "orders",
keyField = "orderId",
columns = Columns.fromNames("orderId:String", "trader:String", "ric:String", "tradeTime:Long", "quantity:Double"),
joinFields = "ric", "orderId")
joinFields = "ric", "orderId")

val pricesDef = TableDef("prices", "ric", Columns.fromNames("ric:String", "bid:Double", "ask:Double", "last:Double", "open:Double", "close:Double"), "ric")

val joinDef = JoinTableDef(
name = "orderPrices",
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
joins =
name = "orderPrices",
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
joins =
JoinTo(
table = pricesDef,
joinSpec = JoinSpec( left = "ric", right = "ric", LeftOuterJoin)
joinSpec = JoinSpec(left = "ric", right = "ric", LeftOuterJoin)
),
links = VisualLinks(),
joinFields = Seq()
)

//val joinDef = JoinTableDef("ordersPrices", ordersDef, pricesDef, JoinSpec("ric", "ric"), Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") )

val joinProvider = JoinTableProviderImpl()
val joinProvider = JoinTableProviderImpl()

val tableContainer = new TableContainer(joinProvider)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ class JoinManagerTest extends AnyFeatureSpec with Matchers with StrictLogging wi
def mkeOrderPricesFxDef(ordersDef: TableDef, pricesDef: TableDef, fxDef: TableDef): JoinTableDef = {
JoinTableDef(
name = "orderPricesFx",
visibility = Public,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFromExcept(fxDef, "ric"),
links = VisualLinks(),
Expand Down Expand Up @@ -178,6 +179,7 @@ class JoinManagerTest extends AnyFeatureSpec with Matchers with StrictLogging wi
def mkeOrder2PricesRatesDef(orders2Def: TableDef, pricesDef: TableDef, fxRates: TableDef): JoinTableDef = {
JoinTableDef(
name = "order2PricesAndFx",
visibility = Public,
baseTable = orders2Def,
joinColumns = Columns.allFrom(orders2Def)
++ Columns.allFromExcept(pricesDef, "ric")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,10 @@ class JoinsOfJoinsTableTest extends AnyFeatureSpec with Matchers with ViewPortSe
)

val joinDefFx = JoinTableDef(
name = "orderPricesFx",
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
name = "orderPricesFx",
visibility = Public,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
links = VisualLinks(),
joinFields = Seq("ccyCross", "orderId"),
JoinTo(
Expand Down Expand Up @@ -162,9 +163,10 @@ class JoinsOfJoinsTableTest extends AnyFeatureSpec with Matchers with ViewPortSe
)

val joinDefFx = JoinTableDef(
name = "orderPricesFx",
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
name = "orderPricesFx",
visibility = Public,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
links = VisualLinks(),
joinFields = Seq("ccyCross", "orderId"),
JoinTo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class MultiJoinTableTest extends AnyFeatureSpec with Matchers with OneInstancePe

val joinDef = JoinTableDef(
name = "orderPrices",
visibility = Public,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++
Columns.allFromExcept(pricesDef, "ric") ++
Expand Down Expand Up @@ -122,6 +123,7 @@ class MultiJoinTableTest extends AnyFeatureSpec with Matchers with OneInstancePe

val joinDef = JoinTableDef(
name = "orderPrices",
visibility = Public,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++
Columns.allFromExcept(pricesDef, "ric") ++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,26 +83,27 @@ class AbstractViewPortTestCase extends AnyFeatureSpec {
(viewPortContainer, orders, ordersProvider, session, outQueue)
}

def createDefaultViewPortInfraWithInvisibleTable()(implicit clock: Clock, metrics: MetricsProvider): (ViewPortContainer, DataTable, MockProvider, ClientSessionId, OutboundRowPublishQueue) = {
def createDefaultViewPortInfraWithPrivateTable()(implicit clock: Clock, metrics: MetricsProvider): (ViewPortContainer, DataTable, MockProvider, ClientSessionId, OutboundRowPublishQueue) = {
implicit val lifecycle: LifecycleContainer = new LifecycleContainer

val ordersDef = TableDef(
name = "orders",
keyField = "orderId",
columns = Columns.fromNames("orderId:String", "trader:String", "ric:String", "tradeTime:Long", "quantity:Int"),
invisible = true,
visibility = Private,
joinFields = "ric", "orderId"
)

val pricesDef = TableDef(
"prices",
"ric",
Columns.fromNames("ric:String", "bid:Double", "ask:Double", "last:Double", "open:Double", "close:Double"),
invisible = true,
visibility = Private,
"ric")

val joinDef = JoinTableDef(
name = "orderPrices",
visibility = Private,
baseTable = ordersDef,
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
joins =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.finos.vuu.core.table.{Columns, TableContainer, ViewPortColumnCreator}
import org.finos.vuu.net.ClientSessionId
import org.finos.vuu.provider.{JoinTableProviderImpl, MockProvider, ProviderContainer}
import org.finos.vuu.util.OutboundRowPublishQueue
import org.finos.vuu.util.table.TableAsserts.{assertVpEq, assertVpEqWithMeta}
import org.finos.vuu.util.table.TableAsserts.{assertVpEq}
import org.scalatest.GivenWhenThen
import org.scalatest.matchers.should.Matchers
import org.scalatest.prop.Tables.Table
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ abstract class EditableViewPortTest extends AbstractViewPortTestCase with Matche

val joinDef = JoinTableDef(
name = "consInstrumentPrice",
visibility = Public,
baseTable = constituentDef,
joinColumns = Columns.allFrom(constituentDef) ++ Columns.allFromExcept(instrumentDef, "ric") ++ Columns.allFromExcept(pricesDef, "ric"),
links = VisualLinks(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
exception.getMessage should startWith("Invalid columns specified in viewport request")
}

Scenario("create viewport for visible table, return success message") {
Scenario("create viewport for public table, return success message") {
implicit val clock: Clock = new TestFriendlyClock(1311544800)
implicit val metrics: MetricsProvider = new MetricsProviderImpl

Given("we've created a viewport with orders in")
Given("tables with public visibility created")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfra()

val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
Expand All @@ -48,12 +48,12 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
result.get.body.asInstanceOf[CreateViewPortSuccess].table shouldBe "orders"
}

Scenario("create viewport for invisible table, return reject message") {
Scenario("create viewport for private table, return reject message") {
implicit val clock: Clock = new TestFriendlyClock(1311544800)
implicit val metrics: MetricsProvider = new MetricsProviderImpl

Given("we've created a viewport with orders in")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithInvisibleTable()
Given("tables with private visibility created")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithPrivateTable()
val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)

val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")
Expand All @@ -68,8 +68,8 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
implicit val clock: Clock = new TestFriendlyClock(1311544800)
implicit val metrics: MetricsProvider = new MetricsProviderImpl

Given("we've created a viewport with orders in")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithInvisibleTable()
Given("tables with public visibility created")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithPrivateTable()

val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")
Expand All @@ -79,5 +79,37 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
result.get.body.isInstanceOf[CreateViewPortReject] shouldBe true
result.get.body.asInstanceOf[CreateViewPortReject].msg shouldBe "no table found for TEST:random_table"
}

Scenario("create viewport for public join table, return success message") {
implicit val clock: Clock = new TestFriendlyClock(1311544800)
implicit val metrics: MetricsProvider = new MetricsProviderImpl

Given("tables with public visibility created")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfra()

val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")

val result: Option[ViewServerMessage] = api.process(CreateViewPortRequest(ViewPortTable("orderPrices", "TEST"), ViewPortRange(0, 100), Array("orderId")))(ctx)
result.isDefined shouldBe true
result.get.body.isInstanceOf[CreateViewPortSuccess] shouldBe true
result.get.body.asInstanceOf[CreateViewPortSuccess].table shouldBe "orderPrices"
}

Scenario("create viewport for private join table, return reject message") {
implicit val clock: Clock = new TestFriendlyClock(1311544800)
implicit val metrics: MetricsProvider = new MetricsProviderImpl

Given("tables with private visibility created")
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithPrivateTable()
val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)

val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")

val result: Option[ViewServerMessage] = api.process(CreateViewPortRequest(ViewPortTable("orderPrices", "TEST"), ViewPortRange(0, 100), Array("orderId")))(ctx)
result.isDefined shouldBe true
result.get.body.isInstanceOf[CreateViewPortReject] shouldBe true
result.get.body.asInstanceOf[CreateViewPortReject].msg shouldBe "no table found for TEST:orderPrices"
}
}
}
Loading