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

2013年10月13日日曜日

groovyとApache MetaModelでPOJOのリストに対してクエリーを実行する

groovyとApache MetaModelでPOJOのリストに対してクエリーを実行するには、以下のようにObjectTableDataProviderクラスとPojoDataContextクラスを使用します。
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*
import org.eobjects.metamodel.pojo.*

class ComputerLang
{
  // 言語ID
  int langID
  // 言語名称
  String name
}

languages = [
  new ComputerLang(langID:1, name:"C"),
  new ComputerLang(langID:2, name:"java"),
  new ComputerLang(langID:3, name:"groovy")
]

providerComputerLang = new ObjectTableDataProvider<ComputerLang>(
  "languages", ComputerLang.class, languages
)
dc = new PojoDataContext([providerComputerLang])
table = dc.getDefaultSchema().getTable(0)
// 言語IDが3の言語を抽出
query = dc.query().from(table)
  .select("langID", "name")
  .where(table.getColumnByName("langID")).equals(3).toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // LangIDと言語を表示
  println row.getValue(0) + ":" + row.getValue(1)
}


動作環境
groovy 2.1.7, JDK7 update40

2013年10月12日土曜日

groovyとApache MetaModelでXMLファイルに対してクエリーを実行する

groovyとApache MetaModelでXMLファイルに対してクエリーを実行するには、以下のようなコードを実行します。
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*
import org.eobjects.metamodel.xml.*

// XMLファイルに対するテーブル構造を定義
XmlSaxTableDef prjTableDef = new XmlSaxTableDef(
  "/projects/project",
  [
    "/projects/project@name",
    "/projects/project/owner"
  ] as String[]
)

dc = new XmlSaxDataContext(new File("projects.xml"), prjTableDef)
// テーブルを指定
table = dc.getDefaultSchema().getTableByName("/project")

// 所有者がuser2のプロジェクトを抽出
query = dc.query().from(table)
  .select("row_id", "@name", "/owner")
  .where(table.getColumnByName("/owner")).eq("user2").toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // row_idとプロジェクト名、所有者を表示
  println row.getValue(0) + ":" + row.getValue(1) + ":" + row.getValue(2)
}

サンプルXMLファイル
<?xml version="1.0" encoding="UTF-8"?>
<projects>
  <project name="テストプロジェクト1">
    <owner>user1</owner>
  </project>
  <project name="テストプロジェクト2">
    <owner>user2</owner>
  </project>
  <project name="テストプロジェクト3">
    <owner>user3</owner>
  </project>
</projects>

動作環境
groovy 2.1.7, JDK7 update40

2013年10月11日金曜日

groovyとApache MetaModelでMongoDBのコレクションに対してクエリーを実行する

groovyとApache MetaModelでMongoDBのコレクションに対してクエリーを実行するには、以下のようなコードを実行します。
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*

dc = DataContextFactory.createMongoDbDataContext("mongodb-srv", 27017, "local", "user", [] as char[])
// テーブル(=コレクション)を指定
table = dc.getDefaultSchema().getTableByName("sales")

// SKUが003の売上データを抽出
query = dc.query().from(table)
  .select("total_sales")
  .where(table.getColumnByName("sku")).eq("003").toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // 売上データを表示
  println row.getValue(0)
}


動作環境
groovy 2.1.7, JDK7 update40

2013年10月10日木曜日

groovyとApache MetaModelでRDBのテーブルに対してクエリーを実行する

groovyとApache MetaModelでRDBのテーブルに対してクエリーを実行するには、以下のようなコードを実行します。
@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 groovy.sql.Sql

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

dc = DataContextFactory.createJdbcDataContext(sql.getConnection())
// テーブル(=シート)を指定
table = dc.getDefaultSchema().getTableByName("customer")

// 顧客IDが1011のデータを抽出
query = dc.query().from(table)
  .select("customer_id", "customer_name")
  .where(table.getColumnByName("customer_id")).eq(1011).toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // 顧客IDと顧客名を表示
  println row.getValue(0) + ":" + row.getValue(1)
}


動作環境
groovy 2.1.7, JDK7 update40

2013年10月9日水曜日

groovyとApache MetaModelでExcelのシートに対してクエリーを実行する

groovyとApache MetaModelでExcelのシートに対してクエリーを実行するには、以下のようなコードを実行します。
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*

dc = DataContextFactory.createExcelDataContext(new File("products.xlsx"))
// テーブル(=シート)を指定
table = dc.getDefaultSchema().getTableByName("products")

// 製品IDが1002のデータを抽出
query = dc.query().from(table)
  .select("product_name", "price")
  .where(table.getColumnByName("product_id")).eq(1002).toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // 製品名と価格を表示
  println row.getValue(0) + ":" + row.getValue(1)
}

データ元のExcel

動作環境
groovy 2.1.7, JDK7 update40

2013年10月8日火曜日

groovyとApache MetaModelでAccessテーブルに対してクエリーを実行する

groovyとApache MetaModelでAccessテーブルに対してクエリーを実行するには、以下のコードを実行します。
@Grab(group='org.eobjects.metamodel', module='MetaModel-full', version='3.4.5')
import org.eobjects.metamodel.*

dc = DataContextFactory.createAccessDataContext(new File("sales.mdb"))
// テーブルを指定
table = dc.getDefaultSchema().getTableByName("sales")
// 売上年月が2013年02月のデータを抽出
query = dc.query().from(table)
  .select("store_id", "sales")
  .where(table.getColumnByName("sales_month")).equals("201302").toQuery()
// Queryの表示
println query.toString()
// Queryの実行
ds = dc.executeQuery(query)
for(row in ds){
  // 店舗IDと売上を表示
  println row.getValue(0) + ":" + row.getValue(1)
}

クエリー対象のAccessテーブル

動作環境
groovy 2.1.7, JDK7 update40