datastoreはlow level apiでやるのがいいらしい
ということなので、
前に作ったやつを再度公開。(gaephp-1.1.0.jarにはソースも入ってたのよん)
すでに仕様が変わってたらごめんなさい。
まぁ、slim3が出てるので、そっちのほうが参考になると思うけど。
とりあえず、出せるもんは出しとこうかと。。
クラスは3つ。
AutoQuery.java
DataStore.java
Record.java
AutoQueryはS2JDBCから名前もパクってやってることもほぼ一緒という。。
DataStoreはDatastoreServiceのインスタンスを管理するだけ。シングルトンにしとかないとダメみたいなので。
RecordはAutoQueryで問い合わせた結果をぶち込むクラスです。ActiveRecordをちょいパクリ。
AutoQuery.java
package net.pluswing.gae.php.ds; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Query.FilterOperator; public class AutoQuery { private Query query; private FetchOptions fetchOptions = null; public AutoQuery(String kind) { query = new Query(kind); } public Record key(long key) throws EntityNotFoundException { return new Record(DataStore.get().get(KeyFactory.createKey(query.getKind(), key))); } public AutoQuery eq(String key, Object value) { query.addFilter(key, FilterOperator.EQUAL, value); return this; } public AutoQuery lt(String key, Object value) { query.addFilter(key, FilterOperator.LESS_THAN, value); return this; } public AutoQuery le(String key, Object value) { query.addFilter(key, FilterOperator.LESS_THAN_OR_EQUAL, value); return this; } public AutoQuery gt(String key, Object value) { query.addFilter(key, FilterOperator.GREATER_THAN, value); return this; } public AutoQuery ge(String key, Object value) { query.addFilter(key, FilterOperator.GREATER_THAN_OR_EQUAL, value); return this; } public AutoQuery limit(int limit) { if (fetchOptions == null) { fetchOptions = FetchOptions.Builder.withLimit(limit); } else { fetchOptions.limit(limit); } return this; } public AutoQuery offset(int offset) { if (fetchOptions == null) { fetchOptions = FetchOptions.Builder.withOffset(offset); } else { fetchOptions.offset(offset); } return this; } public AutoQuery asc(String key) { query = query.addSort(key, Query.SortDirection.ASCENDING); return this; } public AutoQuery desc(String key) { query = query.addSort(key, Query.SortDirection.DESCENDING); return this; } public ListgetResultList() { Iterator iterator = createIterator(); List results = new ArrayList (); while (iterator.hasNext()) { results.add(new Record(iterator.next())); } return results; } public Record getSingleResult() { Iterator iterator = createIterator(); if (iterator.hasNext()) { return new Record(iterator.next()); } return null; } private Iterator createIterator() { PreparedQuery q = DataStore.get().prepare(query); if (fetchOptions == null) { return q.asIterator(); } else { return q.asIterator(fetchOptions); } } }
DataStore.java
package net.pluswing.gae.php.ds; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; public class DataStore { private static DatastoreService service = DatastoreServiceFactory.getDatastoreService(); public static DatastoreService get() { return service; } }
Record.java
package net.pluswing.gae.php.ds; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.Text; public class Record { private static final int STRING_MAX_LENGTH = 499; private Entity entity; public Record(String kind) { entity = new Entity(kind); } Record(Entity e) { entity = e; } public long getKey() { return entity.getKey().getId(); } public void setProperty(String name, Object value) { if (value instanceof String && *1; return; } entity.setProperty(name, value); } public Object getProperty(String name) { if (!entity.hasProperty(name)) { return null; } Object value = entity.getProperty(name); if (value instanceof Text) { return *2; } public void deleteByKey(long key) { DataStore.get().delete(KeyFactory.createKey(entity.getKind(), key)); } public AutoQuery find() { return new AutoQuery(entity.getKind()); } }