Skip to content

Commit

Permalink
Refactoring FilterClause to prevent accidental use of the slow row-wi…
Browse files Browse the repository at this point in the history
…se filtering
  • Loading branch information
ddimtirov committed Mar 16, 2023
1 parent 15c24f1 commit 7e4afc6
Showing 1 changed file with 6 additions and 43 deletions.
49 changes: 6 additions & 43 deletions vuu/src/main/scala/org/finos/vuu/core/filter/FilterClause.scala
Expand Up @@ -6,6 +6,10 @@ import org.finos.vuu.core.table.RowData
import org.finos.vuu.viewport.{RowSource, ViewPortColumns}

trait FilterClause {
def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], vpColumns: ViewPortColumns): ImmutableArray[String]
}

trait RowFilterClause extends FilterClause {
def filter(row: RowData): Boolean
def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], vpColumns: ViewPortColumns): ImmutableArray[String] = ImmutableArray.from(
rowKeys
Expand All @@ -20,39 +24,30 @@ case class NotClause(decorated: FilterClause) extends FilterClause {
val notMatching = rowKeys.filter(!matching.contains(_))
ImmutableArray.from(notMatching.toArray)
}

override def filter(row: RowData): Boolean =
!decorated.filter(row)
}

case class OrClause(subclauses: List[FilterClause]) extends FilterClause {
override def filterAll(rows: RowSource, primaryKeys: ImmutableArray[String], vpColumns: ViewPortColumns): ImmutableArray[String] = ImmutableArray.from(
subclauses.flatMap(_.filterAll(rows, primaryKeys, vpColumns)).distinct.toArray
)

override def filter(row: RowData): Boolean =
subclauses.exists(_.filter(row))
}

case class AndClause(subclauses: List[FilterClause]) extends FilterClause {
override def filterAll(source: RowSource, primaryKeys: ImmutableArray[String], viewPortColumns: ViewPortColumns): ImmutableArray[String] =
subclauses.foldLeft(primaryKeys) {
(remainingKeys, subclause) => subclause.filterAll(source, remainingKeys, viewPortColumns)
}

override def filter(row: RowData): Boolean =
subclauses.forall(_.filter(row))
}

case class StartsClause(columnName: String, prefix: String) extends FilterClause {
case class StartsClause(columnName: String, prefix: String) extends RowFilterClause {
override def filter(row: RowData): Boolean = {
val datum = row.get(columnName)
if (datum == null) return false
datum.toString.startsWith(prefix)
}
}

case class EndsClause(columnName: String, suffix: String) extends FilterClause {
case class EndsClause(columnName: String, suffix: String) extends RowFilterClause {
override def filter(row: RowData): Boolean = {
val datum = row.get(columnName)
if (datum == null) return false
Expand All @@ -61,13 +56,6 @@ case class EndsClause(columnName: String, suffix: String) extends FilterClause {
}

case class InClause(columnName: String, values: List[String]) extends FilterClause {
override def filter(row: RowData): Boolean = {
val datum = row.get(columnName)
if (datum == null) return false

values.contains(datum.toString)
}

override def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], viewPortColumns: ViewPortColumns): ImmutableArray[String] = {
val column = rows.asTable.columnForName(columnName)
rows.asTable.indexForColumn(column) match {
Expand All @@ -82,13 +70,6 @@ case class InClause(columnName: String, values: List[String]) extends FilterClau
}

case class GreaterThanClause(columnName: String, value: Double) extends FilterClause {
override def filter(row: RowData): Boolean = {
val datum = row.get(columnName)
if (datum == null) return false

value < datum.toString.toDouble
}

override def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], viewPortColumns: ViewPortColumns): ImmutableArray[String] = {
val column = rows.asTable.columnForName(columnName)
rows.asTable.indexForColumn(column) match {
Expand All @@ -100,13 +81,6 @@ case class GreaterThanClause(columnName: String, value: Double) extends FilterCl
}

case class LessThanClause(columnName: String, value: Double) extends FilterClause {
override def filter(row: RowData): Boolean = {
val datum = row.get(columnName)
if (datum == null) return false

value > datum.toString.toDouble
}

override def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], viewPortColumns: ViewPortColumns): ImmutableArray[String] = {
val column = rows.asTable.columnForName(columnName)
rows.asTable.indexForColumn(column) match {
Expand All @@ -120,17 +94,6 @@ case class LessThanClause(columnName: String, value: Double) extends FilterClaus


case class EqualsClause(columnName: String, value: String) extends FilterClause {
override def filter(row: RowData): Boolean = {
row.get(columnName) match {
case null => false
case s: String => s==value
case i: Int => i==value.toInt
case f: Float => f==value.toFloat
case d: Double => d==value.toDouble
case b: Boolean => b==value.equalsIgnoreCase("true")
}
}

override def filterAll(rows: RowSource, rowKeys: ImmutableArray[String], viewPortColumns: ViewPortColumns): ImmutableArray[String] = {
val column = rows.asTable.columnForName(columnName)
rows.asTable.indexForColumn(column) match {
Expand Down

0 comments on commit 7e4afc6

Please sign in to comment.