Komunitas Cloud Indonesia

Datastore di Google App Engine (#2)

Penulis :   |   September 14, 2012

Pada tulisan terdahulu telah dibahas pengenalan dari Google Datastore, sebuah fitur penyimpanan data dari App Engine. Disana telah diperkenalkan mengenai konsep dasar Datastore, seperti object, entity dan cara untuk menggunakannya. Diharapkan anda sudah membaca tulisan tersebut untuk memperoleh pemahaman dasar yang baik.

Query

Di App Engine Datastore, query terhadap data menggunakan metode yang sedikit berbeda jika dibandingkan dengan konsep database pada umumnya. Biasanya, kita selalu menggunakan SQL (Structured Query Language) untuk melakukan processing data (insert, update, delete). Disini, kita menggunakan class-class  untuk melakukan query yang telah disediakan oleh App Engine SDK. Dengan class ini, para developer tinggal memberikan syarat-syarat pengambilan data sesuai kebutuhannya dan Engine akan memberikan data-data sesuai dengan permintaan tadi.

Sebuah query adalah sebuah filter terhadap data. Kalo untuk membuat Entity kita menggunakan class Entity, maka untuk melakukan query kita gunakan class Query. Class ini terdefinisi di com.google.appengine.api.datastore.Query. Dengan menggunakan class ini, anda bisa melakukan query berdasarkan ancestor, kind, ataupun keduanya. Ini sesuai dengan definisi konstruktornya:

Query(Key ancestor)
Query(String kind)
Query(String kind, Key ancestor)

Untuk mengambil data dengan kind “mhs”, kita bisa melakukannya dengan cara sebagai berikut:

Query q = new Query("mhs");

Object “q” akan berisi data-data “mhs” secara keseluruhan. Jika kita hendak mengambil data “mhs” berdasarkan kriteria tertentu, maka kita harus “menyaring”-nya terlebih dahulu dengan menggunakan method addFilter. Method ini membutuhkan tiga parameter: property_name, operator_constant, dan yang terakhir adalah value.

Query q = new Query("mhs").addFilter("angkatan", Query.FilterOperator.GREATER_THAN_OR_EQUAL, 1996);

Sesuai query diatas, object “q” akan berisi data-data “mhs”, tetapi sekarang isinya telah ter-filter, yaitu hanya berisi data mhs angkatan 1996 keatas. Operatornya berupa konstanta yang berupa pilihan-pilihan sebagai berikut:

  • FilterOperator.EQUAL (=)
  • FilterOperator.LESS_THAN (<)
  • FilterOperator.LESS_THAN_OR_EQUAL (<=)
  • FilterOperator.GREATER_THEN (>)
  • FilterOperator.GREATER_THEN_OR_EQUAL (>=)
  • FilterOperator.NOT_EQUAL (<>)
  • FilterOperator.IN (sesuai daftar yang diberikan)

Perlu diketahui, method addFilter ini dinyatakan sebagai fungsi yang deprecated pada App Engine SDK 1.7. Dengan demikian, untuk menjaga kompatibilitas app anda pada SDK versi yang akan datang, maka anda diharapkan untuk mengganti method tersebut dengan setFilter.

Deklarasi dari setFilter adalah sebagai berikut:

public Query setFilter(Query.Filter filter)

Untuk contoh pencarian data “mhs” diatas, maka coding anda menjadi:

Query q = new Query("mhs").setFilter(new FilterPredicate("angkatan", Query.FilterOperator.GREATER_THAN_OR_EQUAL, 1996));

Pada contoh diatas, anda bisa melihat penggunaan class baru yaitu “FilterPredicate”. Class Query.Filter ini merupakan sebuah abstract class dan memiliki dua subclass yang sangat penting, yaitu Query.CompositeFilter dan Query.FilterPredicate. Jika filter yang hendak anda terapkan cuma satu, maka gunakanlah class “FilterPredicate”. Sebaliknya, jika ada beberapa filter yang hendak diterapkan, gunakan class “CompositeFilter”, dimana class ini akan menerima class “FilterPredicate” sebagai parameternya. Misalkan, sekarang anda hendak menerapkan filter untuk angkatan dari 1996 keatas tetapi hingga angkatan 2000 saja, maka query anda adalah sebagai berikut:

Query q = new Query("mhs");
q.setFilter(new CompositeFilter(CompositeFilterOperator.and, 
                            Array.asList(
                                         new FilterPredicate("angkatan", Query.FilterOperator.GREATER_THAN_OR_EQUAL, 1996),
                                         new FilterPredicate("angkatan", Query.FilterOperator.LESS_THEN_OR_EQUAL, 2000)));

Selain cara penulisan diatas, anda bisa juga menggunakan code berikut:

Query q = new Query("mhs");
q.setFilter(CompositeFilterOperator.and(  
                                       new FilterPredicate("angkatan",Query.FilterOperator.GREATER_THAN_OR_EQUAL, 1996),   
                                       new FilterPredicate("angkatan",Query.FilterOperator.LESS_THAN_OR_EQUAL, 2000)));

Keduanya menghasilkan data yang sama, terserah cara mana yang anda suka.

Mengurutkan Data

Selain menyaring data-data, anda juga dapat melakukan sorting (pengurutan) data yang anda perlukan. Tidak seperti filtering data yang cukup rumit didalam pengaplikasiannya, untuk pengurutan data sangat mudah dilakukan. Anda hanya menentukan pengurutan data tadi berdasarkan property yang mana serta metodenya, urut dari atas ke bawah atau sebaliknya (ascending atau descending).

Misalnya anda hendak mengurutkan data “mhs” berdasarkan angkatannya dari atas ke bawah (dimulai dari angkatan yang paling tua), maka perintahnya adalah:

Query q = new Query("mhs").addSort("angkatan", SortDirection.ASCENDING);

Sebaliknya, jika anda hendak mengurutkannya dari angkatan yang paling muda, maka perintahnya adalah:

Query q = new Query("mhs").addSort("angkatan", SortDirection.DESCENDING;

Datastore juga dapat mengurutkan data berdasarkan dua atau lebih property, seperti halnya pada SQL biasa. Kalau biasanya anda melakukan perintah SQL seperti ini:

SELECT * FROM mhs ORDER by angkatan, nama ASC;

maka di App Engine  anda dapat melakukan hal yang sama dengan perintah berikut:

Query q = new Query("mhs").addSort("angkatan", SortDirection.ASCENDING) 
                          .addSort("nama", SortDirection.ASCENDING);

Datastore akan mengurutkan data sesuai dengan sequence parameter sorting yang diberikan, dalam hal ini “angkatan” terlebih dahulu baru “nama”.

Sekian, semoga bermanfaat 🙂

  1. Jakarta Cloud Computing Meetup 09.2016
  2. Big Data dengan Google Cloud
  3. Cloud Computing dan Big Data : Sebuah Kombinasi Ideal
  4. Keynote CEO Oracle mengenai Transformasi Cloud Computing
  5. Cloud Computing sebagai Skill yang Paling Dicari di Dunia Kerja

Penulis :

Seorang Technology Enthusiast. Bekerja sebagai Senior Software Developer di sebuah perusahaan Software House. Founder group facebook "GEEK FACTOR", sebuah komunitas bagi para pecinta teknologi (http://www.facebook.com/groups/nerd.factor).

Komentar

Leave a Reply

Your email address will not be published. Required fields are marked *