From c17dcb8930a82f961b490e877bc339faeb81c33b Mon Sep 17 00:00:00 2001 From: Alexis Hernandez Date: Sun, 15 Apr 2018 00:27:08 -0500 Subject: [PATCH] server: Add FieldOrderingSQLInterpreter --- .../interpreters/ColumnNameResolver.scala | 11 +++++++++++ .../FieldOrderingSQLInterpreter.scala | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 server/app/com/xsn/explorer/data/anorm/interpreters/ColumnNameResolver.scala create mode 100644 server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala diff --git a/server/app/com/xsn/explorer/data/anorm/interpreters/ColumnNameResolver.scala b/server/app/com/xsn/explorer/data/anorm/interpreters/ColumnNameResolver.scala new file mode 100644 index 0000000..7723d09 --- /dev/null +++ b/server/app/com/xsn/explorer/data/anorm/interpreters/ColumnNameResolver.scala @@ -0,0 +1,11 @@ +package com.xsn.explorer.data.anorm.interpreters + +import scala.annotation.implicitNotFound + +@implicitNotFound( + "No column name resolver found for type ${A}. Try to implement an implicit ColumnNameResolver for this type." +) +trait ColumnNameResolver[A] { + + def getColumnName(field: A): String +} diff --git a/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala b/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala new file mode 100644 index 0000000..a5df63a --- /dev/null +++ b/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala @@ -0,0 +1,18 @@ +package com.xsn.explorer.data.anorm.interpreters + +import com.xsn.explorer.models.base.{FieldOrdering, OrderingCondition} + +class FieldOrderingSQLInterpreter { + + def toOrderByClause[A](fieldOrdering: FieldOrdering[A])(implicit columnNameResolver: ColumnNameResolver[A]) = { + val field = columnNameResolver.getColumnName(fieldOrdering.field) + val condition = getCondition(fieldOrdering.orderingCondition) + + s"ORDER BY $field $condition" + } + + private def getCondition(ordering: OrderingCondition) = ordering match { + case OrderingCondition.AscendingOrder => "ASC" + case OrderingCondition.DescendingOrder => "DESC" + } +}