2013年10月14日月曜日

groovyとApache MetaModelで集約関数を使用する

groovyとApache MetaModelで集約関数を使用するには、以下のコードのようにFunctionTypeとカラムを使用します。
@GrabConfig(systemClassLoader=true)
@Grab(group='postgresql', module='postgresql', version='9.1-901.jdbc4')
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*
import org.eobjects.metamodel.query.*
import groovy.sql.Sql

/*
以下のようなテスト結果テーブルscoresからテスト(test_id)毎の点数(score)の
平均・件数・最大・最小・合計を求める。

CREATE TABLE scores
(
  test_id character varying(100) NOT NULL,
  student_id character varying(6) NOT NULL,
  score integer,
  CONSTRAINT pk_scores PRIMARY KEY (test_id , student_id )
)
*/

def sql = Sql.newInstance(
  "jdbc:postgresql://localhost:5432/userdb",
  "postgres",
  "postgres",
  "org.postgresql.Driver")

dc = DataContextFactory.createJdbcDataContext(sql.getConnection())
// テーブル(=シート)を指定
table = dc.getDefaultSchema().getTableByName("scores")
colTestId = table.getColumnByName("test_id")
colScore = table.getColumnByName("score")

// テスト毎に集計結果を取得
query = dc.query().from(table)
  .select(colTestId)
    .and(FunctionType.AVG, colScore)
    .and(FunctionType.COUNT, colScore)
    .and(FunctionType.MAX, colScore)
    .and(FunctionType.MIN, colScore)
    .and(FunctionType.SUM, colScore)
  .groupBy(colTestId)
  .toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // 集約結果を表示
  println row.getValue(0) + 
    ":AVG=" + row.getValue(1) + 
    ":COUNT=" + row.getValue(2) + 
    ":MAX=" + row.getValue(3) + 
    ":MIN=" + row.getValue(4) + 
    ":SUM=" + row.getValue(5)
}


動作環境
groovy 2.1.7, JDK7 update40

0 件のコメント:

コメントを投稿