Skip to content

Commit e3a2f5d

Browse files
authored
finos#1702 change table visibility to enum (finos#1710)
* finos#1702 change visibility to enum * finos#1702 add visibility to join table def * finos#1702 add visibility to join table def * finos#1702 add visibility to join table def * finos#1702 revert * finos#1720 change visibility to trait * finos#1720 change visibility to trait
1 parent fe5c478 commit e3a2f5d

File tree

10 files changed

+98
-35
lines changed

10 files changed

+98
-35
lines changed

vuu/src/main/scala/org/finos/vuu/api/TableDef.scala

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ object Link {
2424
}
2525
}
2626

27+
// Used in table definition to indicate the visibility level of a table
28+
trait Visibility
29+
30+
// All users can create view port to see the table
31+
object Public extends Visibility
32+
33+
// No users can create view port to see the table. Only for vuu internal use, e.g. base tables for a join table.
34+
object Private extends Visibility
35+
2736
object SessionTableDef {
2837
def apply(name: String, keyField: String, columns: Array[Column], joinFields: String*): TableDef = {
2938
new SessionTableDef(name, keyField, columns, joinFields, indices = Indices())
@@ -32,7 +41,7 @@ object SessionTableDef {
3241

3342
object JoinSessionTableDef {
3443
def apply(name: String, keyField: String, columns: Array[Column], joinFields: String*): TableDef = {
35-
null//new JoinSessionTableDef(name, keyField, columns, joinFields, indices = Indices())
44+
null //new JoinSessionTableDef(name, keyField, columns, joinFields, indices = Indices())
3645
}
3746
}
3847

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

57-
def apply(name: String, keyField: String, columns: Array[Column], invisible: Boolean, joinFields: String*): TableDef = {
58-
new TableDef(name, keyField, columns, joinFields, indices = Indices(), invisible = invisible)
66+
def apply(name: String, keyField: String, columns: Array[Column], visibility: Visibility, joinFields: String*): TableDef = {
67+
new TableDef(name, keyField, columns, joinFields, indices = Indices(), visibility = visibility)
5968
}
6069
}
6170

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

112-
class JoinSessionTableDef(name: String, baseTable: TableDef, joinColumns: Array[Column], joinFields: Seq[String], joins: JoinTo*) extends JoinTableDef(name, baseTable, joinColumns, links = VisualLinks(), joinFields) with VuuInMemPluginLocator
121+
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
113122

114123
class SessionTableDef(name: String,
115124
keyField: String,
@@ -127,7 +136,7 @@ class TableDef(val name: String,
127136
val autosubscribe: Boolean = false,
128137
val links: VisualLinks = VisualLinks(),
129138
val indices: Indices,
130-
val invisible: Boolean = false) extends VuuInMemPluginLocator {
139+
val visibility: Visibility = Public) extends VuuInMemPluginLocator {
131140

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

144153
def permissionChecker(viewPort: ViewPort, tableContainer: TableContainer): Option[RowPermissionChecker] = {
145-
if(permissionFunc != null){
154+
if (permissionFunc != null) {
146155
Some(permissionFunc(viewPort, tableContainer))
147-
}else{
156+
} else {
148157
None
149158
}
150159
}
@@ -171,7 +180,7 @@ class TableDef(val name: String,
171180

172181
trait JoinType
173182

174-
object LeftOuterJoin extends JoinType{
183+
object LeftOuterJoin extends JoinType {
175184
override def toString: String = "LeftOuterJoin"
176185
}
177186

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

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

185-
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{
194+
case class JoinTableDef(
195+
override val name: String,
196+
override val visibility: Visibility,
197+
baseTable: TableDef,
198+
joinColumns: Array[Column],
199+
override val links: VisualLinks,
200+
override val joinFields: Seq[String],
201+
joins: JoinTo*)
202+
extends TableDef(name, baseTable.keyField, joinColumns, joinFields, indices = Indices(), autosubscribe = false, visibility = visibility)
203+
with VuuInMemPluginLocator {
186204

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

260+
object JoinTableDef {
261+
def apply(name: String, baseTable: TableDef, joinColumns: Array[Column], links: VisualLinks, joinFields: Seq[String], joins: JoinTo): JoinTableDef = {
262+
new JoinTableDef(name, Public, baseTable, joinColumns, links, joinFields, joins)
263+
}
264+
}
242265
//case class JoinTableDef(override val name: String, left: TableDef, right: TableDef, joinDef: JoinDefinition, joinColumns: Array[Column]) extends TableDef(name, joinDef.leftKeyField, joinColumns){
243266
// def getJoinDefinitionColumns():Array[Column] = {
244267
// Array(columnForName(left.keyField), columnForName(joinDef.rightKeyField))

vuu/src/main/scala/org/finos/vuu/core/CoreServerApiHandler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.finos.vuu.core
22

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

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

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

vuu/src/test/scala/org/finos/vuu/core/table/TableTestHelper.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,26 @@ object TableTestHelper {
3737
name = "orders",
3838
keyField = "orderId",
3939
columns = Columns.fromNames("orderId:String", "trader:String", "ric:String", "tradeTime:Long", "quantity:Double"),
40-
joinFields = "ric", "orderId")
40+
joinFields = "ric", "orderId")
4141

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

4444
val joinDef = JoinTableDef(
45-
name = "orderPrices",
46-
baseTable = ordersDef,
47-
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
48-
joins =
45+
name = "orderPrices",
46+
baseTable = ordersDef,
47+
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
48+
joins =
4949
JoinTo(
5050
table = pricesDef,
51-
joinSpec = JoinSpec( left = "ric", right = "ric", LeftOuterJoin)
51+
joinSpec = JoinSpec(left = "ric", right = "ric", LeftOuterJoin)
5252
),
5353
links = VisualLinks(),
5454
joinFields = Seq()
5555
)
5656

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

59-
val joinProvider = JoinTableProviderImpl()
59+
val joinProvider = JoinTableProviderImpl()
6060

6161
val tableContainer = new TableContainer(joinProvider)
6262

vuu/src/test/scala/org/finos/vuu/core/table/join/JoinManagerTest.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class JoinManagerTest extends AnyFeatureSpec with Matchers with StrictLogging wi
145145
def mkeOrderPricesFxDef(ordersDef: TableDef, pricesDef: TableDef, fxDef: TableDef): JoinTableDef = {
146146
JoinTableDef(
147147
name = "orderPricesFx",
148+
visibility = Public,
148149
baseTable = ordersDef,
149150
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFromExcept(fxDef, "ric"),
150151
links = VisualLinks(),
@@ -178,6 +179,7 @@ class JoinManagerTest extends AnyFeatureSpec with Matchers with StrictLogging wi
178179
def mkeOrder2PricesRatesDef(orders2Def: TableDef, pricesDef: TableDef, fxRates: TableDef): JoinTableDef = {
179180
JoinTableDef(
180181
name = "order2PricesAndFx",
182+
visibility = Public,
181183
baseTable = orders2Def,
182184
joinColumns = Columns.allFrom(orders2Def)
183185
++ Columns.allFromExcept(pricesDef, "ric")

vuu/src/test/scala/org/finos/vuu/core/table/join/JoinsOfJoinsTableTest.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ class JoinsOfJoinsTableTest extends AnyFeatureSpec with Matchers with ViewPortSe
6868
)
6969

7070
val joinDefFx = JoinTableDef(
71-
name = "orderPricesFx",
72-
baseTable = ordersDef,
73-
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
71+
name = "orderPricesFx",
72+
visibility = Public,
73+
baseTable = ordersDef,
74+
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
7475
links = VisualLinks(),
7576
joinFields = Seq("ccyCross", "orderId"),
7677
JoinTo(
@@ -162,9 +163,10 @@ class JoinsOfJoinsTableTest extends AnyFeatureSpec with Matchers with ViewPortSe
162163
)
163164

164165
val joinDefFx = JoinTableDef(
165-
name = "orderPricesFx",
166-
baseTable = ordersDef,
167-
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
166+
name = "orderPricesFx",
167+
visibility = Public,
168+
baseTable = ordersDef,
169+
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric") ++ Columns.allFrom(fxDef),
168170
links = VisualLinks(),
169171
joinFields = Seq("ccyCross", "orderId"),
170172
JoinTo(

vuu/src/test/scala/org/finos/vuu/core/table/join/MultiJoinTableTest.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class MultiJoinTableTest extends AnyFeatureSpec with Matchers with OneInstancePe
3737

3838
val joinDef = JoinTableDef(
3939
name = "orderPrices",
40+
visibility = Public,
4041
baseTable = ordersDef,
4142
joinColumns = Columns.allFrom(ordersDef) ++
4243
Columns.allFromExcept(pricesDef, "ric") ++
@@ -122,6 +123,7 @@ class MultiJoinTableTest extends AnyFeatureSpec with Matchers with OneInstancePe
122123

123124
val joinDef = JoinTableDef(
124125
name = "orderPrices",
126+
visibility = Public,
125127
baseTable = ordersDef,
126128
joinColumns = Columns.allFrom(ordersDef) ++
127129
Columns.allFromExcept(pricesDef, "ric") ++

vuu/src/test/scala/org/finos/vuu/viewport/AbstractViewPortTestCase.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,26 +83,27 @@ class AbstractViewPortTestCase extends AnyFeatureSpec {
8383
(viewPortContainer, orders, ordersProvider, session, outQueue)
8484
}
8585

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

8989
val ordersDef = TableDef(
9090
name = "orders",
9191
keyField = "orderId",
9292
columns = Columns.fromNames("orderId:String", "trader:String", "ric:String", "tradeTime:Long", "quantity:Int"),
93-
invisible = true,
93+
visibility = Private,
9494
joinFields = "ric", "orderId"
9595
)
9696

9797
val pricesDef = TableDef(
9898
"prices",
9999
"ric",
100100
Columns.fromNames("ric:String", "bid:Double", "ask:Double", "last:Double", "open:Double", "close:Double"),
101-
invisible = true,
101+
visibility = Private,
102102
"ric")
103103

104104
val joinDef = JoinTableDef(
105105
name = "orderPrices",
106+
visibility = Private,
106107
baseTable = ordersDef,
107108
joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"),
108109
joins =

vuu/src/test/scala/org/finos/vuu/viewport/CalculatedColumnsViewPortTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.finos.vuu.core.table.{Columns, TableContainer, ViewPortColumnCreator}
1010
import org.finos.vuu.net.ClientSessionId
1111
import org.finos.vuu.provider.{JoinTableProviderImpl, MockProvider, ProviderContainer}
1212
import org.finos.vuu.util.OutboundRowPublishQueue
13-
import org.finos.vuu.util.table.TableAsserts.{assertVpEq, assertVpEqWithMeta}
13+
import org.finos.vuu.util.table.TableAsserts.{assertVpEq}
1414
import org.scalatest.GivenWhenThen
1515
import org.scalatest.matchers.should.Matchers
1616
import org.scalatest.prop.Tables.Table

vuu/src/test/scala/org/finos/vuu/viewport/editable/EditableViewPortTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ abstract class EditableViewPortTest extends AbstractViewPortTestCase with Matche
108108

109109
val joinDef = JoinTableDef(
110110
name = "consInstrumentPrice",
111+
visibility = Public,
111112
baseTable = constituentDef,
112113
joinColumns = Columns.allFrom(constituentDef) ++ Columns.allFromExcept(instrumentDef, "ric") ++ Columns.allFromExcept(pricesDef, "ric"),
113114
links = VisualLinks(),

vuu/src/test/scala/org/finos/vuu/viewport/validation/CreateValidViewportTest.scala

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
3232
exception.getMessage should startWith("Invalid columns specified in viewport request")
3333
}
3434

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

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

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

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

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

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

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

7474
val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
7575
val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")
@@ -79,5 +79,37 @@ class CreateValidViewportTest extends AbstractViewPortTestCase with Matchers wit
7979
result.get.body.isInstanceOf[CreateViewPortReject] shouldBe true
8080
result.get.body.asInstanceOf[CreateViewPortReject].msg shouldBe "no table found for TEST:random_table"
8181
}
82+
83+
Scenario("create viewport for public join table, return success message") {
84+
implicit val clock: Clock = new TestFriendlyClock(1311544800)
85+
implicit val metrics: MetricsProvider = new MetricsProviderImpl
86+
87+
Given("tables with public visibility created")
88+
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfra()
89+
90+
val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
91+
val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")
92+
93+
val result: Option[ViewServerMessage] = api.process(CreateViewPortRequest(ViewPortTable("orderPrices", "TEST"), ViewPortRange(0, 100), Array("orderId")))(ctx)
94+
result.isDefined shouldBe true
95+
result.get.body.isInstanceOf[CreateViewPortSuccess] shouldBe true
96+
result.get.body.asInstanceOf[CreateViewPortSuccess].table shouldBe "orderPrices"
97+
}
98+
99+
Scenario("create viewport for private join table, return reject message") {
100+
implicit val clock: Clock = new TestFriendlyClock(1311544800)
101+
implicit val metrics: MetricsProvider = new MetricsProviderImpl
102+
103+
Given("tables with private visibility created")
104+
val (viewPortContainer, _, _, _, outQueue) = createDefaultViewPortInfraWithPrivateTable()
105+
val api = new CoreServerApiHandler(viewPortContainer, tableContainer = viewPortContainer.tableContainer, providers = viewPortContainer.providerContainer)
106+
107+
val ctx = RequestContext("req-101", ClientSessionId("A", "A"), outQueue, "token-0001")
108+
109+
val result: Option[ViewServerMessage] = api.process(CreateViewPortRequest(ViewPortTable("orderPrices", "TEST"), ViewPortRange(0, 100), Array("orderId")))(ctx)
110+
result.isDefined shouldBe true
111+
result.get.body.isInstanceOf[CreateViewPortReject] shouldBe true
112+
result.get.body.asInstanceOf[CreateViewPortReject].msg shouldBe "no table found for TEST:orderPrices"
113+
}
82114
}
83115
}

0 commit comments

Comments
 (0)