/* __ *\ ** ________ ___ / / ___ Scala API ** ** / __/ __// _ | / / / _ | (c) 2003-2006, LAMP/EPFL ** ** __\ \/ /__/ __ |/ /__/ __ | ** ** /____/\___/_/ |_/____/_/ | | ** ** |/ ** \* */ // $Id:Syntax.scala 6853 2006-03-20 16:58:47 +0100 (Mon, 20 Mar 2006) dubochet $ package scala.dbc2 import java.lang.String import statement.AnyValueDef._ import syntax.DBC2Tokens._ import syntax.ExpressionSyntax import syntax.ExpressionSyntax._ import syntax.TokenVal._ /** This module defines useful methods, views and classes that allow writing * queries in DBC's short syntax. To use short syntax in a Scala statement, * the content of this module must be imported beforehand, by calling * import scala.dbc2.ShortSyntax._. */ object ShortSyntax { implicit def stringToExpressionBeyond(str: String): ExpressionBeyond[statement.Relation] = ExpressionBeyond[statement.Relation](fromStringToAnyValue(str)) implicit def anyValToExpressionBeyond(anyVal: AnyVal): ExpressionBeyond[statement.Relation] = ExpressionBeyond[statement.Relation](fromAnyValToAnyValue(anyVal)) implicit def symbolToExpressionBeyond(sym: Symbol): ExpressionBeyond[statement.Relation] = ExpressionBeyond[statement.Relation](token(sym)) implicit def booleanToExpressionBeyond(b: Boolean): ExpressionBeyond[statement.Relation] = ExpressionBeyond[statement.Relation](b match { case true => TRUE case false => FALSE }) implicit def productToExpressionBeyond(p: Product): ExpressionBeyond[statement.Relation] = { import statement.Relation //Transform product into a List val anyList: List[Any] = for (val e <- List.range(0, p.productArity)) yield p.productElement(e) //Transform content into a list of Object. val exprList: List[ExpressionBeyond[statement.Relation]] = anyList map (e => e match { case ex: ExpressionBeyond[Relation] => ex case s: Symbol => symbolToExpressionBeyond(s) case s: String => stringToExpressionBeyond(s) case b: Boolean => booleanToExpressionBeyond(b) case a: AnyVal => anyValToExpressionBeyond(a) case p: Product => productToExpressionBeyond(p) case a: AnyValue => ExpressionBeyond[statement.Relation](token(a)) }) val objList = exprList.reverse match { case Nil => Nil case x :: Nil => getTokens(x) case x :: xs => xs.foldLeft[List[Token]](getTokens[statement.Relation](x): List[Token])((accu, elem) => accu ::: List(token(COMMA)) ::: getTokens(elem)) } ExpressionBeyond[statement.Relation](RPAREN :: objList ::: List(LPAREN)) } //Beginnig of each request. val delete = ExpressionBeyond[statement.Status](DELETE) def from(table_name: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(table_name) ::: List(FROM)) val create = ExpressionBeyond[statement.Status](CREATE) /*val local = ExpressionBeyond[statement.Relation](TEMPORARY, LOCAL)//new ExpressionBeyond[statement.Relation] { val global = ExpressionBeyond[statement.Relation](TEMPORARY, GLOBAL)//new ExpressionBeyond[statement.Relation] { */ def drop = ExpressionBeyond[statement.Status](DROP) def insert = ExpressionBeyond[statement.Status](INSERT) def update(tableName: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Status](getTokens(tableName) ::: List(UPDATE)) val select = ExpressionBeyond[statement.Relation](SELECT) def select(columns: ExpressionBeyond[statement.Relation]*) = ExpressionBeyond[statement.Relation](toLTWC(columns.toList.reverse.map(getTokens(_))) ::: List(SELECT)) val filter = ExpressionBeyond[statement.Relation](FILTER) def by(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(BY)) def where(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(WHERE)) //Others entry points into ExpressionBeyond //def cast(operand: ExpressionBeyond[statement.Relation], target: ExpressionBeyond[statement.Relation]) = //ExpressionBeyond[statement.Relation](RPAREN :: getTokens(target) ::: List(AS) ::: getTokens(operand) ::: List(LPAREN, CAST)) def cast(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, CAST)) //Special insert values def table(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(TABLE)) val default = ExpressionBeyond[statement.Relation](DEFAULT) def default(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(DEFAULT)) val values = ExpressionBeyond[statement.Relation](VALUES) val nullVal = ExpressionBeyond[statement.Relation](NULLVAL) def vals(expr: ExpressionBeyond[statement.Relation]*) = listWithPar(expr.toList) //Constraint definitions def constraint(constraintName: Symbol) = ExpressionBeyond[statement.Relation](constraintName, CONSTRAINT) val not = ExpressionBeyond[statement.Relation](NOT) def unique(cols: Symbol*) = ExpressionBeyond[statement.Relation](RPAREN :: toLOWC(cols.toList.reverse) ::: List(LPAREN, UNIQUE)) val unique = ExpressionBeyond[statement.Relation](UNIQUE) val primary = ExpressionBeyond[statement.Relation](PRIMARY) def primary(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(PRIMARY)) val foreign = ExpressionBeyond[statement.Relation](FOREIGN) def foreign(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(FOREIGN)) def references(tableName: Symbol) = ExpressionBeyond[statement.Relation](tableName, REFERENCES) def references(tableName: Symbol, cols: Symbol*) = ExpressionBeyond[statement.Relation](RPAREN :: toLOWC(cols.toList.reverse) ::: List(LPAREN, tableName, REFERENCES)) def check(search: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(search) ::: List(LPAREN, CHECK)) val key = ExpressionBeyond[statement.Relation](KEY) def key(cols: Symbol*) = ExpressionBeyond[statement.Relation](RPAREN :: toLOWC(cols.toList.reverse) ::: List(LPAREN, KEY)) val inner = ExpressionBeyond[statement.Relation](INNER) val outer = ExpressionBeyond[statement.Relation](OUTER) def join(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, JOIN)) val * = ExpressionBeyond[statement.Relation](ASTERISK) val data = ExpressionBeyond[statement.Relation](DATA) val noData = ExpressionBeyond[statement.Relation](List(DATA, NO)) /** Count SQL function. */ val count = ExpressionBeyond[statement.Relation](RPAREN, ASTERISK, LPAREN, COUNT) //General set functions def avg(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, AVG)) def min(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, MIN)) def max(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, MAX)) def sum(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, SUM)) def every(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, EVERY)) def any(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, ANY)) def some(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, SOME)) def count(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](RPAREN :: getTokens(expr) ::: List(LPAREN, COUNT)) def all(exprs: ExpressionBeyond[statement.Relation]*) = ExpressionBeyond[statement.Relation](toLTWC(exprs.toList.reverse.map(getTokens(_))) ::: List(ALL)) def distinct(exprs: ExpressionBeyond[statement.Relation]*) = ExpressionBeyond[statement.Relation](toLTWC(exprs.toList.reverse.map(getTokens(_))) ::: List(DISTINCT)) //Datatypes val smallint = ExpressionBeyond[statement.Relation](SMALLINT) val integer = ExpressionBeyond[statement.Relation](INTEGER) val bigint = ExpressionBeyond[statement.Relation](BIGINT) def numeric(precision: Int) = ExpressionBeyond[statement.Relation](RPAREN, token(precision), LPAREN, NUMERIC) def numeric(precision: Int, scale: Int) = ExpressionBeyond[statement.Relation](RPAREN, token(precision), COMMA, token(scale), LPAREN, NUMERIC) val real = ExpressionBeyond[statement.Relation](REAL) val double = ExpressionBeyond[statement.Relation](DOUBLE) val precision = ExpressionBeyond[statement.Relation](PRECISION) val boolean = ExpressionBeyond[statement.Relation](BOOLEAN) val character = ExpressionBeyond[statement.Relation](CHARACTER) def character(length: Int) = ExpressionBeyond[statement.Relation](RPAREN, token(length), LPAREN, CHARACTER) def character(expr: ExpressionBeyond[statement.Relation]) = ExpressionBeyond[statement.Relation](getTokens(expr) ::: List(CHARACTER)) def varying(length: Int) = ExpressionBeyond[statement.Relation](RPAREN, token(length), LPAREN, VARYING) val large = ExpressionBeyond[statement.Relation](LARGE) val Object = ExpressionBeyond[statement.Relation](OBJECT) }