PageRenderTime 26ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ferryc_backend/SIQ2Ferry.scala

http://scala-integrated-query.googlecode.com/
Scala | 86 lines | 80 code | 2 blank | 4 comment | 4 complexity | e67a405b5f4a6d6b9e2d1b160c7ac53c MD5 | raw file
  1. package siq
  2. trait ISIQ2Ferry extends IModules{
  3. def genFerry ( x: Rep[_] ):String
  4. def printFerry( x: Rep[_] )= println(genFerry(x))
  5. }
  6. trait SIQ2Ferry extends ISIQ2Ferry with Modules{
  7. object FerryHelpers{
  8. def render_projection( p:Exp[_], tables : List[Rep[Iterable[_]]], mapper: Exp[_] => String ) : String = p match {
  9. case Const(x) => mapper(p)
  10. case _:Sym[_] => rep2def(p) match {
  11. case t:LiftedTuple[_] => {
  12. "(" + (for( item_rep <- rep2def(p).asInstanceOf[LiftedTuple[_]].p.asInstanceOf[Product].productIterator ) yield {/*println(item_rep.toString);*/render_projection( item_rep.asInstanceOf[Rep[_]], tables, mapper )}).mkString(",") + ")"
  13. }
  14. case _ => mapper(p.asInstanceOf[Sym[_]])
  15. }
  16. }
  17. def tables2string( q:Comprehension[_], mapper: Exp[_] => String ) = {
  18. val tables = List(q.inner)
  19. tables.map( table_rep => { val table = rep2generator[Any](table_rep); table match {
  20. case _ => "q"+ (table.key) + " = " + mapper(table_rep)// + "("+table.toString+")"
  21. }}).mkString(", ") + " in for " + tables.map( table_rep => { val table = rep2generator[Any](table_rep); table match {
  22. case t:Table[_] => "i" + table.key + " in " + "q" + table.key
  23. case _ => "i"+ (table.key) + " in " + "q"+ (table.key)
  24. }}).mkString(", ") +
  25. (if(q.filter.isDefined)" where "+ mapper(q.filter.get) else "") +
  26. (if(q.groupBy.isDefined) " group by " + mapper(q.groupBy.get) else "") +
  27. //(if(q.orderBy.isDefined) " order by " + mapper(q.orderBy.get) + " " /*+ FIXME: (if( q.order == ascending ) "ascending" else "descending")*/ else "") +
  28. "\nreturn "+ render_projection( q.element_raw, tables, mapper )
  29. }
  30. def table2string( table: Table[_] )
  31. = "table " + table.name + " (" + table.columns.map(
  32. c => c.name + " " + c.type_.toLowerCase
  33. ).mkString(", ") + ")" +
  34. " with keys ((" + table.keys.map( c => c.name ).mkString(", ") + "))"
  35. }
  36. addTransformations( args => args.node match{
  37. //case n:Node[t] => Node[t]( n.operator, n.x, n.y )
  38. case c: Column[_] => c
  39. //case q: Comprehension[t] => Comprehension[t](q.tables,q.element,args.mapper(q.filter))//,args.mapper(q.orderBy)) // FIXME: q.projection is not pushed through optimizer
  40. case _ => no_mapping()
  41. })
  42. addDefStringMappings( "Ferry", args => args.node match{
  43. // ferry supported operators: "not" (unary), "*", "/", "+", "-" , "%", "contains", "==", "!=", "<=", "<", ">=", ">", "and", "or"
  44. case `+(Int,Int)`(l,r) => args.mapper(l) +"+"+ args.mapper(r)
  45. case Length(i) => "count("+args.mapper(i)+")"
  46. case _:Zip => "zip"+args.mapper(args.node.asInstanceOf[Zip].target)+""
  47. case One(i) => "the("+args.mapper(i)+")"
  48. case Sum(i) => "sum("+args.mapper(i)+")"
  49. case Flatten(i) => "concat("+args.mapper(i)+")"
  50. case Grouped(i) => {args.mapper(i)}
  51. case LiteralTable(i) => "[" + (i.map( x => x match{
  52. case _:Product => "("+x.asInstanceOf[Product].productIterator.map(Const(_)).map(args.mapper).mkString(",")+")"
  53. case _=> args.mapper(Const(x))
  54. }).mkString(",")) + "]"
  55. case t:Table[_] => FerryHelpers.table2string(args.node.asInstanceOf[Table[_]].asInstanceOf[Table[_]])
  56. case f:FieldReference => rep2def(args.node.asInstanceOf[FieldReference].referree) match{
  57. case _:LiftedTuple[_] => "("+(rep2def(args.node.asInstanceOf[FieldReference].referree).asInstanceOf[LiftedTuple[_]].p.productIterator.map(x => args.mapper(x.asInstanceOf[Rep[_]])).mkString(","))+")"
  58. case _ => "i"+{
  59. val it = args.node.asInstanceOf[FieldReference].iterable
  60. rep2def(it) match {
  61. case _:Generator[_] => rep2def(it).asInstanceOf[Generator[_]].key
  62. case _ => args.mapper(it)//"<"+rep2def(it).toString+">"
  63. }
  64. }+(if(args.node.asInstanceOf[FieldReference].position != 0) "."+args.node.asInstanceOf[FieldReference].position else "") //(if(args.node.asInstanceOf[FieldReference].position != 0) "."+args.node.asInstanceOf[FieldReference].position else "")// + " ("+rep2def(args.node.asInstanceOf[FieldReference].referree)+" "+args.node.asInstanceOf[FieldReference].generator+")"
  65. }
  66. case q: GeneratorReference => args.mapper(q.fieldref)
  67. case q: Comprehension[_] => "(let " + FerryHelpers.tables2string( q, args.mapper ) + ")" // format( args.mapper(q.projection), q.tables.map(t=>t.name+" "+t.alias).mkString(", "), args.mapper(q.filter), args.mapper(q.orderBy) )
  68. case n:Node[_] => '(' + args.mapper( n.x ) +' '+ (n.operator match{
  69. case "&&" => "and"
  70. case "||" => "or"
  71. case _ => n.operator
  72. }) +' '+ args.mapper( n.y ) + ')'
  73. case l: LiftedSchema[_,_] => "(" + (args.node.asInstanceOf[LiftedSchema[_,_]].schema.asInstanceOf[Product].productIterator.map(a => args.mapper(a.asInstanceOf[Rep[_]])).mkString(", ")) + ")"
  74. case _:LiftedTuple[_] => "(" + (args.node.asInstanceOf[LiftedTuple[_]].p.productIterator.map(x => args.mapper(x.asInstanceOf[Rep[_]])).mkString(","))+")"
  75. case _ => no_mapping()
  76. })
  77. def genFerry( r:Rep[_] ) = render( "Ferry", r, args => args.const match{
  78. case _:Int => args.const.toString
  79. case _:Char => '"' + (args.const.toString).replace("\\","\\\\").replace("\"","\\\"") + '"'
  80. case _:String => '"' + (args.const.toString).replace("\\","\\\\").replace("\"","\\\"") + '"'
  81. case _:Boolean => "true"
  82. case _ => throw new Exception("unexpected: "+args.const.toString)
  83. })
  84. }