@@ -2,7 +2,7 @@ package org.finos.vuu.core.table
22
33import com .typesafe .scalalogging .StrictLogging
44import org .finos .vuu .api .TableDef
5- import org .finos .vuu .core .table .DefaultColumnNames .{ CreatedTimeColumnName , LastUpdatedTimeColumnName , allDefaultColumns }
5+ import org .finos .vuu .core .table .DefaultColumnNames .allDefaultColumns
66import org .finos .vuu .core .table .column .CalculatedColumnClause
77import org .finos .vuu .util .schema .ExternalEntitySchema
88import org .finos .vuu .util .types .{DefaultTypeConverters , TypeConverterContainerBuilder }
@@ -76,7 +76,7 @@ object Columns {
7676 }).toArray
7777
7878 def from (table : TableDef , names : Seq [String ]): Array [Column ] = {
79- table.columns.filter(c => names.contains(c.name)).map(c => new JoinColumn (c.name, c.index, c.dataType, table, c))
79+ table.columns.filter(c => names.contains(c.name)).map(c => JoinColumn (c.name, c.index, c.dataType, table, c, isAlias = false ))
8080 }
8181
8282 /**
@@ -89,7 +89,7 @@ object Columns {
8989
9090 def aliased (table : TableDef , aliases : (String , String )* ): Array [Column ] = {
9191 val aliased = aliases.map(tuple => tuple._1 -> tuple._2).toMap
92- table.columns.filter(c => aliased.contains(c.name)) map (c => new AliasedJoinColumn (aliased(c.name), c.index, c.dataType, table, c).asInstanceOf [Column ])
92+ table.columns.filter(c => aliased.contains(c.name)) map (c => JoinColumn (aliased(c.name), c.index, c.dataType, table, c, isAlias = true ).asInstanceOf [Column ])
9393 }
9494
9595 /**
@@ -100,7 +100,7 @@ object Columns {
100100
101101 val excluded = columnsToExclude.map(s => s -> 1 ).toMap
102102
103- table.columns.filterNot(c => excluded.contains(c.name)).map(c => new JoinColumn (c.name, c.index, c.dataType, table, c))
103+ table.columns.filterNot(c => excluded.contains(c.name)).map(c => JoinColumn (c.name, c.index, c.dataType, table, c, isAlias = false ))
104104 }
105105
106106 /**
@@ -124,10 +124,26 @@ trait Column {
124124
125125 def getDataFullyQualified (data : RowData ): Any
126126
127- override def hashCode (): Int = name.hashCode()
128127}
129128
130- object NoColumn extends Column {
129+ trait JoinColumn extends Column {
130+ def sourceTable : TableDef
131+ def sourceColumn : Column
132+ }
133+
134+ object JoinColumn {
135+
136+ def apply (name : String , index : Int , dataType : Class [_], sourceTable : TableDef , sourceColumn : Column , isAlias : Boolean ): JoinColumn = {
137+ if (isAlias) {
138+ AliasedJoinColumn (name, index, dataType, sourceTable, sourceColumn)
139+ } else {
140+ SimpleJoinColumn (name, index, dataType, sourceTable, sourceColumn)
141+ }
142+ }
143+
144+ }
145+
146+ case class NoColumn () extends Column {
131147 override def name : String = " NoColumn"
132148
133149 override def index : Int = - 1
@@ -137,6 +153,16 @@ object NoColumn extends Column {
137153 override def getData (data : RowData ): Any = None
138154
139155 override def getDataFullyQualified (data : RowData ): Any = None
156+
157+ override def hashCode (): Int = - 1
158+
159+ override def equals (obj : scala.Any ): Boolean = {
160+ obj match {
161+ case _ : NoColumn => true
162+ case _ => false
163+ }
164+ }
165+
140166}
141167
142168case class SimpleColumn (name : String , index : Int , dataType : Class [_]) extends Column {
@@ -145,35 +171,69 @@ case class SimpleColumn(name: String, index: Int, dataType: Class[_]) extends Co
145171 }
146172
147173 override def getDataFullyQualified (data : RowData ): Any = getData(data)
174+
175+ private lazy val hash : Int = name.hashCode * dataType.hashCode()
176+
177+ override def hashCode (): Int = hash
178+
179+ override def equals (obj : scala.Any ): Boolean = {
180+ obj match {
181+ case other : SimpleColumn =>
182+ this .name == other.name &&
183+ this .dataType == other.dataType
184+ case _ => false
185+ }
186+ }
187+
148188}
149189
150- class AliasedJoinColumn (name : String , index : Int , dataType : Class [_], sourceTable : TableDef , sourceColumn : Column ) extends JoinColumn (name, index, dataType, sourceTable, sourceColumn) {
190+ private case class SimpleJoinColumn (name : String , index : Int , dataType : Class [_], sourceTable : TableDef , sourceColumn : Column ) extends JoinColumn {
151191
152- override def getData ( data : RowData ) : Any = data.get(sourceColumn. name)
192+ override def toString : String = s " ${sourceTable.name} . $sourceColumn @ $ name"
153193
154- override def getDataFullyQualified (data : RowData ): Any = data.get(sourceTable.fullyQuallifiedColumnName(sourceColumn.name))
194+ override def getData (data : RowData ): Any = data.get(name)
195+
196+ override def getDataFullyQualified (data : RowData ): Any = data.get(sourceTable.fullyQuallifiedColumnName(name))
197+
198+ private lazy val hash : Int = name.hashCode * dataType.hashCode() * sourceTable.name.hashCode * sourceColumn.name.hashCode
199+
200+ override def hashCode (): Int = hash
201+
202+ override def equals (obj : scala.Any ): Boolean = {
203+ obj match {
204+ case other : SimpleJoinColumn =>
205+ this .sourceTable.name == other.sourceTable.name &&
206+ this .sourceColumn.name == other.sourceColumn.name &&
207+ this .name == other.name &&
208+ this .dataType == other.dataType
209+ case _ => false
210+ }
211+ }
155212}
156213
157- class JoinColumn (name : String , index : Int , dataType : Class [_], val sourceTable : TableDef , val sourceColumn : Column ) extends SimpleColumn (name, index, dataType) {
214+ private case class AliasedJoinColumn (name : String , index : Int , dataType : Class [_], sourceTable : TableDef , sourceColumn : Column ) extends JoinColumn {
158215
159- private lazy val lazyToString = s " ${sourceTable.name}. $sourceColumn@ $name"
160- private lazy val lazyHash = lazyToString.hashCode
216+ override def toString : String = s " ${sourceTable.name}. $sourceColumn@alias( $name) "
161217
162- override def toString : String = lazyToString
218+ override def getData ( data : RowData ) : Any = data.get(sourceColumn.name)
163219
164- override def hashCode ( ): Int = lazyHash
220+ override def getDataFullyQualified ( data : RowData ): Any = data.get(sourceTable.fullyQuallifiedColumnName(sourceColumn.name))
165221
166- override def getDataFullyQualified ( data : RowData ) : Any = data.get( sourceTable.fullyQuallifiedColumnName( name))
222+ private lazy val hash : Int = name.hashCode * dataType.hashCode() * sourceTable.name.hashCode * sourceColumn.name.hashCode
167223
168- override def getData ( data : RowData ): Any = data.get(name)
224+ override def hashCode ( ): Int = hash
169225
170226 override def equals (obj : scala.Any ): Boolean = {
171227 obj match {
172- case other : JoinColumn =>
173- other.sourceColumn.name == this .sourceColumn.name && other.sourceTable.name == this .sourceTable.name
228+ case other : AliasedJoinColumn =>
229+ this .sourceTable.name == other.sourceTable.name &&
230+ this .sourceColumn.name == other.sourceColumn.name &&
231+ this .name == other.name &&
232+ this .dataType == other.dataType
174233 case _ => false
175234 }
176235 }
236+
177237}
178238
179239case class CalculatedColumn (name : String , clause : CalculatedColumnClause , index : Int , dataType : Class [_]) extends Column with StrictLogging {
@@ -184,4 +244,12 @@ case class CalculatedColumn(name: String, clause: CalculatedColumnClause, index:
184244 )
185245
186246 override def getDataFullyQualified (data : RowData ): Any = getData(data)
247+
248+ override def hashCode (): Int = name.hashCode * dataType.hashCode()
249+
250+ override def equals (obj : Any ): Boolean = obj match {
251+ case that : CalculatedColumn => that.name == name && that.dataType == this .dataType
252+ case _ => false
253+ }
254+
187255}
0 commit comments