We are really excited with this release, which is the first feature-
complete release of SimpleDS. Lots of things have been included in so
little time.

Getting up-to-date with AppEngine
============================

It's hard to keep up the pace with these guys. This release includes:

* Unindexed attributes.
* Cursors support.
* IN and != clauses.

Cache
=====

We have included a great Level 1 and Level 2 cache [1]. If you come
from JDO/JPA, you may already know how it works:

* Level 1 cache: This is basically a Map bound to the current thread.
Until the end of the current request, any get() invocation will check
this cache first. If a match is found, no invocation will be
propagated to GAE.
* Level 2 cache: Datastore entities are also stored in memcache, which
is a second chance to get a positive match.

Cacheable entities must be marked with @Cacheable, with an optional
expiration time. This feature will work with single and batch get(),
and the cache entries are updated with put() and delete()
invocations.

// Invoke memcache or the datastore
List<MyData> data = entityManager.get(key1, key2, key3);

// this does not invoke anything (resolved by the Level 1 cache)
MyData d2 = entityManager.get(key1);

Functions
========

We are going extremely functional these days [2]. This release
includes a package with functions to transform collections and
PagedList instances, which can be combined with batch get() to get
even better performance results. This is a simple example, equivalent
to a common situation with relationships:

// n + 1 requests to the datastore
List<MyData> data = entityManager.find(query);
Collection<Parent> parents =
Lists.newArrayListwithCapacity(data.size());
for (MyData d : data) {
  parents.add(entityManager.get(d.getKey().getParent());
}

// Transformations: 2 requests
List<MyData> data = entityManager.find(query);
Collection<Key> parentKeys = Collections2.transform(data, new
EntityToParentKeyFunction(MyData.class));
Collection<Parent> parents = entityManager.get(parentKeys);

That's all it takes to get all entities and their parents, and store
them in the Level 1 cache so any request by PK will not hit memcache
or the datastore. This release includes functions to retrieve parent
and foreign keys, and also works with PagedList. We have taken two
real-world snapshots with just this optimization (transformation +
cacheable), applied to a single loop:

Before: http://www.flickr.com/photos/koliseocom/4575062969/sizes/l/
After: http://www.flickr.com/photos/koliseocom/4575696456/sizes/o

Notice that requests "before" are targeted to the datastore, while
most of the "after" are memcache requests.

Background tasks
==============

I know that background tasks [3] are in the roadmap for AppEngine, but
we needed these today. This started as an exercise to upgrade the
datastore schema (add properties, delete entities, etc) and ended up
as a full reusable implementation of tasks that I expect to deprecate
once that AppEngine includes its own, probably better, implementation.

Background tasks require adding a servlet to web.xml (and optionally
appengine-web.xml as an admin-console entry) and configuring the tasks
on application start using plain Java. Tasks can be invoked directly
by cron triggers, queues or by POST requests.

public class WriteBehindCacheTask extends IterableTask<MyClass> {

        protected WriteBehindCacheTask() {
                super("my-task-id");
        }

        @Override
        protected SimpleQuery createQuery(TaskRequest request) {
                return entityManager.createQuery(MyClass.class);
        }

        @Override
        protected void process(MyClass entity, TaskRequest request) {
                // ...modify entity...
                entityManager.put(entity);
        }

}

Query cursors and execution deferral will be done transparently (no
need to limit or handle cursors). There are some implementation
superclasses depending on what you need to do, and some of them just
use the raw AppEngine datastore and don't even require SimpleDS to
work.

This is the first feature-complete release of SimpleDS. Next on the
roadmap: cached queries and we may be revisiting relations.

As always, all kind of feedback is welcome.

Nacho.

[1] http://code.google.com/p/simpleds/wiki/Cache
[2] http://code.google.com/p/simpleds/wiki/Functions
[3] http://code.google.com/p/simpleds/wiki/BackgroundTasks

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to