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 List getResultList() {
		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());
	}
}

*1:String)value).length() > STRING_MAX_LENGTH) { entity.setProperty(name, new Text( (String) value

*2:Text) value).getValue(); } return value; } public Key save() { return DataStore.get().put(entity); } public void delete() { DataStore.get().delete(entity.getKey(