2011年4月21日木曜日

NetBeans IDE 7.0 リリース

当初の予定よりも遅くなりましたが、 NetBeans IDE 7.0 がリリースされました
ダウンロードはコチラからできるようになっております

恒例のスプラッシュです


7.0 によって追加、または改善された主なポイントは以下のようになっています

・シンタックス、ヒントなどのエディタ拡張を含んだ、JDK 7 サポート
・WebLogic Application Server 、 GlassFish 3.1 サポートの改修
・Oracle Database サポートの改善
・HTML5 編集サポート
・Maven 3 サポートと IDE への同梱
・CDI、REST サービス、Java Persistence 、Bean Validation のサポート改善
・PHPリネームリファクタリング対応
・外部での変更検出の改善
・C/C++ サポートの更新

その他の機能については、 コチラを参照頂ければと思います

また、以前にも書いていますが、 7.0 より JUnit が同梱配布されなくなりましたので、 NetBeans 本体インストール後別途プラグインとしてのインストールが必要となります
手順は簡単ですので、詳細は以前のエントリを参考にして頂ければと思います

次回のリリースは、4月21日時点でのロードマップ上ではバージョン番号が7.0.1、リリース予定日が2011年の7月になっています
また、主要な実装機能もコチラにて掲載が始まっています
(バージョン番号からもわかる通り、メインはバグフィックスと JDK7 の対応強化となり、新機能追加の予定はないようです)

何かお気づきの点などありましたら、 ML 等へご連絡頂ければと思います

2011年4月12日火曜日

オープンソース NoSQL データベース OrientDB を使ってみる #3

前回の投稿から半年以上過ぎましたが、OrientDB の紹介3回目です
前の2回は以下の通りです

オープンソース NoSQL データベース OrientDB を使ってみる #1
オープンソース NoSQL データベース OrientDB を使ってみる #2

データ間の関連(リレーション)について紹介します
データ間の関連とは2つの異なるレコードを関連付けることで、データの透過的な参照や複雑なデータ構造の表現が可能となります

OrientDB では参照型( Referenced relationships )と組込型( Embedded relationships )という2種類の関連付けをサポートしています
参照型は、フィールドに対象レコードのレコードID(全レコードにてユニークとなるID)を持つことでデータ間の関連付けを行います
そのため、関連付ける各レコードは独立したレコードとして各々参照できる必要があります
対して組込型は、フィールドに直接レコードをそのものを設定するもので、組み込まれたレコードを独立して参照することはできません

また、参照、組込型として関連付けられるデータは 1:1 だけでなく、各々 List 、 Set 、 Map という 1:N 、または N:M の関係を作ることができます
(今回はこの部分の説明の詳細は省略させて頂きます)

それでは実際にデータの登録を行い、どのような構造のレコードが生成されるかを説明したいと思います
今回使用した環境は下記の通りです

・Mac OS X 10.6.7
・Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
・OrientDB 0.9.25
・NetBeans 7.0 RC2

以降は上記環境にて、サーバの起動、専用クライアント(コンソール)の接続まで完了している前提で進めます
サーバやクライアントの起動方法、クライアントを使用したレコード操作などについては、前々回のエントリを参照ください
また、文中で使われるレコードIDは環境により異なりますので、お使いの環境にあわせて読み替えてください

まず、テストデータを登録するため、下記クエリを実行して Person クラスと Group クラスを作成します
( ">" はプロンプトとなりますので、コピーして実行する際にはご注意ください)
> create class Person
> create class Group
次に Group クラス のデータを登録します
> insert into Group (name) values ('Rebel Alliance')
> insert into Group (name) values ('Galactic Empire')
下記コマンドで Group クラスに2レコード登録されたことが確認できます
> browse class Group
---+--------+--------------------
  #| REC ID |NAME                
---+--------+--------------------
  0|    25:0|Rebel Alliance      
  1|    25:1|Galactic Empire     
---+--------+--------------------
"REC ID" は先の説明のレコードIDを指し、 "Rebel Alliance" は "25:0" 、 "Galactic Empire" は "25:1" のレコードIDを持つこととなります

次に参照型の関連フィールドを持つレコードを作成します
関連付けるレコードは先ほど登録した Group クラスのレコードです
下記クエリを実行して、 レコードを登録します
> insert into Person (name, surname, group) values ('Luke', 'Skywalker', 25:0)
> insert into Person (name, surname, group) values ('Han', 'Solo', 25:0)
> insert into Person (name, group) values ('Chewbacca', 25:0)
> insert into Person (name, surname, group) values ('Leia', 'Organa', 25:0)

> insert into Person (name, group) values ('Darth Sidious', 25:1)
> insert into Person (name, group) values ('Darth Vader', 25:1)
レコードに関連付けを設定する場合は、フィールドに対象のレコードIDを直接記述します
(そのため、事前に関連づけるレコードIDを知っておく必要があります)
上記の場合、 "group" というフィールドにレコードIDを設定しており、これで Person クラスと Group クラスの各レコードが関連付けられることとなります

下記コマンドで Person クラスに6レコード登録されたことが確認できます
> browse class Person
---+--------+--------------------+--------------------+--------------------
  #| REC ID |NAME                |SURNAME             |GROUP               
---+--------+--------------------+--------------------+--------------------
  0|    24:0|Luke                |Skywalker           |25:0                
  1|    24:1|Han                 |Solo                |25:0                
  2|    24:2|Chewbacca           |null                |25:0                
  3|    24:3|Leia                |Organa              |25:0                
  4|    24:4|Darth Sidious       |null                |25:1                
  5|    24:5|Darth Vader         |null                |25:1                
---+--------+--------------------+--------------------+--------------------
関連付けられたレコードに対しては、「フィールド名.対象レコードのフィールド名」の形式で指定することで値を参照することができます
以下は select 文にて group フィールドに関連付けられた、 Group クラスの name フィールドを参照しています
(where 句にある "@rid" はレコードIDを意味するレコード属性になります)
> select name, surname, group.name from Person where @rid = 24:0
---+--------+--------------------+--------------------+--------------------
  #| REC ID |NAME                |SURNAME             |GROUP               
---+--------+--------------------+--------------------+--------------------
  0|   -1:-1|Luke                |Skywalker           |Rebel Alliance      
---+--------+--------------------+--------------------+--------------------
また、他のフィールドと同様に where 句の検索条件としても使用できます
> select from Person where group.name = 'Rebel Alliance'
---+--------+--------------------+--------------------+--------------------
  #| REC ID |NAME                |SURNAME             |GROUP               
---+--------+--------------------+--------------------+--------------------
  0|    24:0|Luke                |Skywalker           |25:0                
  1|    24:1|Han                 |Solo                |25:0                
  2|    24:2|Chewbacca           |null                |25:0                
  3|    24:3|Leia                |Organa              |25:0                
---+--------+--------------------+--------------------+--------------------
Java API を利用する場合、参照型レコードの登録は以下のようになります
(import 文、パッケージ名は省略しますのでご注意下さい)
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // admin ユーザでサーバーの demo データベースに接続します  
  5.         ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin""admin");  
  6.   
  7.         // 新規レコード(Group)の作成  
  8.         ODocument jediOrder = new ODocument(database, "Group");  
  9.         jediOrder.field("name""Jedi Order");  
  10.         jediOrder.save();  
  11.   
  12.         // ユニークIDを取得  
  13.         ORID jediOrderORID = jediOrder.getIdentity();  
  14.           
  15.         // 新規レコード(Rank)の作成  
  16.         ODocument master = new ODocument(database, "Rank");  
  17.         master.field("name""Jedi Master");  
  18.         master.save();  
  19.   
  20.         // ユニークIDを取得  
  21.         ORID masterOrderORID = master.getIdentity();  
  22.   
  23.         ODocument knight = new ODocument(database, "Rank");  
  24.         knight.field("name""Jedi Knight");  
  25.         knight.save();  
  26.   
  27.         // ユニークIDを取得  
  28.         ORID knightOrderORID = knight.getIdentity();  
  29.   
  30.         ODocument padawan = new ODocument(database, "Rank");  
  31.         padawan.field("name""Padawan");  
  32.         padawan.save();  
  33.   
  34.         // ユニークIDを取得  
  35.         ORID padawanOrderORID = padawan.getIdentity();  
  36.   
  37.         // 新規レコード(Person)の作成  
  38.         ODocument yoda = new ODocument(database, "Person");  
  39.         yoda.field("name""Yoda");  
  40.         yoda.field("group", jediOrderORID);  
  41.         yoda.field("rank", masterOrderORID);  
  42.         yoda.save();  
  43.           
  44.         ODocument obiwan = new ODocument(database, "Person");  
  45.         obiwan.field("name""Obi-Wan");  
  46.         obiwan.field("surname""Kenobi");  
  47.         obiwan.field("group", jediOrderORID);  
  48.         obiwan.field("rank", knightOrderORID);  
  49.         obiwan.save();  
  50.   
  51.         ODocument ahsoka = new ODocument(database, "Person");  
  52.         ahsoka.field("name""Ahsoka");  
  53.         ahsoka.field("surname""Tano");  
  54.         ahsoka.field("group", jediOrderORID);  
  55.         ahsoka.field("rank", padawanOrderORID);  
  56.         ahsoka.save();  
  57.           
  58.         // 接続の解除  
  59.         database.close();  
  60.     }  
  61. }  
上記では Group クラスに1レコード登録、Rank クラスの新規作成と3レコード登録、 Person クラスに3レコード登録しています
参照型の関連付けを行う方法はクエリを使用したケースと同様にフィールドにレコードIDを設定します
Java API にてレコードID( Java API では ORID クラスにて表現されています)を取得するには、ODocument クラスの getIdentity() メソッドを使用します
なお、新規レコードの場合、事前に save() メソッドを呼び出してデータベースに登録が完了していないとレコードIDは取得できませんので、ご注意ください

レコードを取得する場合は下記のようになります
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // admin ユーザでサーバーの demo データベースに接続します  
  5.         ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin""admin");  
  6.   
  7.         System.out.println("-----レコードIDを指定してレコードを取得-----");  
  8.           
  9.         // RID=24:6(Yoda) を取得  
  10.         ODocument yoda = new ODocument(database, new ORecordId(246));  
  11.           
  12.         // group フィールドを取得  
  13.         ODocument yodaGroup = yoda.field("group");  
  14.         Object yodaGroupName = yodaGroup == null ? "" : yodaGroup.field("name");  
  15.         // rank 1フィールドを取得  
  16.         ODocument yodaRank = yoda.field("rank");  
  17.         Object yodaRankName = yodaRank == null ? "" : yodaRank.field("name");  
  18.           
  19.         // 取得レコードの出力  
  20.         System.out.println("name   : " + yoda.field("name"));  
  21.         System.out.println("surname: " + yoda.field("surname"));  
  22.         System.out.println("group  : " + yodaGroupName);  
  23.         System.out.println("rank   : " + yodaRankName);  
  24.         System.out.println();  
  25.   
  26.         System.out.println("-----クエリを実行してレコードを取得-----");  
  27.           
  28.         // SELECT 文を作成する  
  29.         String selectQuery = "select from Person where group.name = 'Jedi Order' ";  
  30.   
  31.         // クエリを実行する  
  32.         List<ODocument> people = database.query(new OSQLSynchQuery<ODocument>(selectQuery));  
  33.   
  34.         for (ODocument person : people) {  
  35.             // group フィールドを取得  
  36.             ODocument group = person.field("group");  
  37.             Object groupName = group == null ? "" : group.field("name");  
  38.             // rank 1フィールドを取得  
  39.             ODocument rank = person.field("rank");  
  40.             Object rankName = rank == null ? "" : rank.field("name");  
  41.   
  42.             // 取得レコードの出力  
  43.             System.out.println("name   : " + person.field("name"));  
  44.             System.out.println("surname: " + person.field("surname"));  
  45.             System.out.println("group  : " + groupName);  
  46.             System.out.println("rank   : " + rankName);  
  47.             System.out.println();  
  48.         }  
  49.   
  50.         // 接続の解除  
  51.         database.close();  
  52.     }  
  53. }  
上記を実行すると、以下のように値が取得できます
-----レコードIDを指定してレコードを取得-----
name   : Yoda
surname: null
group  : Jedi Order
rank   : Jedi Master

-----クエリを実行してレコードを取得-----
name   : Yoda
surname: null
group  : Jedi Order
rank   : Jedi Master

name   : Obi-Wan
surname: Kenobi
group  : Jedi Order
rank   : Jedi Knight

name   : Ahsoka
surname: Tano
group  : Jedi Order
rank   : Padawan

次に組込型の関連付けですが、現在(2011年4月12日時点)のバージョンではクエリによる組込型のレコードの登録、更新(参照は可能です)は対応しておらず、 Java API でのみとなります

Java API を利用する場合の登録は以下のようになります
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // admin ユーザでサーバーの demo データベースに接続します  
  5.         ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin""admin");  
  6.           
  7.         // 新規レコードを作成  
  8.         ODocument lightsaber = new ODocument(database, "Weapon");  
  9.         lightsaber.field("name""Lightsaber");  
  10.         lightsaber.field("type""sword");   
  11.           
  12.         // RID=24:0(Luke) を取得  
  13.         ODocument luke = new ODocument(database, new ORecordId(240));  
  14.         luke.field("weapon", lightsaber, OType.EMBEDDED);  
  15.         luke.save();  
  16.           
  17.         database.close();  
  18.     }  
  19. }  
上記では Weapon クラスのレコードを1件作成し、 Person クラスのレコードの "weapon" フィールドに設定しています
参照型と大きく異なる点は作成した Weapon クラスの save()メソッドを呼び出していない点、取得した Person クラスの "weapon" フィールドに設定する際、第3引数に "OType.EMBEDDED" を設定している点です

レコードの参照方法に関しては、組込型も参照型も差異はありません
>  select from Person where @rid = 24:0                          

---+--------+--------------------+--------------------+--------------------+--------------------
  #| REC ID |NAME                |WEAPON              |SURNAME             |GROUP               
---+--------+--------------------+--------------------+--------------------+--------------------
  0|    24:0|Luke                |-1:-1               |Skywalker           |25:0                
---+--------+--------------------+--------------------+--------------------+--------------------
参照型のフィールド "group" にはレコードIDの値("25:0")が設定されているのに対し、組込型は直接レコードが設定されているため、レコードIDは設定されていません
組込まれたレコードのフィールドも同様の形式で参照可能です
> select name, surname, weapon.name, weapon.type from Person where @rid = 24:0

---+--------+--------------------+--------------------+--------------------+--------------------
  #| REC ID |NAME                |WEAPON              |SURNAME             |WEAPON2             
---+--------+--------------------+--------------------+--------------------+--------------------
  0|   -1:-1|Luke                |Lightsaber          |Skywalker           |sword               
---+--------+--------------------+--------------------+--------------------+--------------------
以上が OrientDB の関連付けの機能の紹介と利用方法になります

次回は、 OrientDB のグラフデータベースとしての機能を紹介したいと思います
(次はあまり期間をあけないようしたいと思います…)

2011年4月9日土曜日

NetBeans IDE 7.0 RC 2 リリース

NetBeans IDE 7.0 RC2 がリリースされました
ダウンロードはコチラからできるようになっております

恒例のスプラッシュです


リリース予定が延びて、(4月9日現時点では)4月中予定というざっくりとした感じになったみたいです
何かお気づきの点などありましたら、 ML 等へご連絡頂ければと思います