google app engine developer - day2

23
GAE Developer - Day2 Simon @ MiCloud 2014Q1

Upload: simon-su

Post on 17-May-2015

274 views

Category:

Technology


4 download

DESCRIPTION

App Engine - Java Class Day2 About Datastore control and related concept

TRANSCRIPT

Page 1: Google App Engine Developer - Day2

GAE Developer - Day2Simon @ MiCloud2014Q1

Page 2: Google App Engine Developer - Day2

Preview

● Google developer toolkit installed● Google cloud project created● Billing enabled● Your first project

Page 3: Google App Engine Developer - Day2

Today’s tool (Windows) - GitBash

http://git-scm.com/downloads

or

http://git-scm.com/download/win

Page 4: Google App Engine Developer - Day2

Testing your code with curl...

curl http://localhost:8888/[servlet_path]ex: curl http://localhost:8888/gaedemo

Page 5: Google App Engine Developer - Day2

Today

● Datastore basic● Datastore operation● Restrictions● Transaction

Page 6: Google App Engine Developer - Day2

Compares - Googler’s develop way

Googler’s wayAppEngine

Traditional Web applications

Web application framework

AppEngine(Java, Python, Go, PHP)

Java, Perl/CGI, PHP, Ruby, Python...

Persistent storageNoSQL

● Datastore● Cloud SQL

RDBMS● MySQL● PostgreSQL● SQL Server● Oracle

Page 7: Google App Engine Developer - Day2

Compares - Datastore vs RDBMS

Datastore RDBMS

Query language flexibility

SQL-like query language● Limited to simple

filter and sort

Full support of SQL● Table JOIN● Flexible filtering● Subquery

Reliability and Scalability

Highly scalable and reliable

Hard to scale

Page 8: Google App Engine Developer - Day2

Consistency

● Strong Consistency○ Data is always consistent among all database

instances○ Just after write operation○ Even if crash in the middle of write operation

● Eventual Consistency○ Takes time until all data becomes consistent after

write ○ ex: DNS

Page 9: Google App Engine Developer - Day2

Datastore mapping to RDBMS

Datastore RDBMS

Category of object Kind Table

One entry/object Entity Row

Unique identifier of data entry Key Primary Key

Individual data Property Field

Page 10: Google App Engine Developer - Day2

Property

Property

Property

Datastore data model

PostEntry User

Kinds

Key: blog-1234user: [email protected]: xxxxxxdate: 3/1/2014

Key: [email protected]: [email protected]: [[email protected], [email protected]]followers:

Key: [email protected]: [email protected]:followers: [[email protected]]

Entities

Keys

Page 11: Google App Engine Developer - Day2

Low level API - Create Entity

DatastoreService datastore =

DatastoreServiceFactory.getDatastoreService();

Entity employee = new Entity("Employee");

employee.setProperty("name", "Simon Su");

employee.setProperty("hireDate", new Date());

Key empKey = datastore.put(employee);

Page 12: Google App Engine Developer - Day2

Low level API - Get Entity

// Use email as key when creating entity

Entity employee = new Entity("Employee", "work-id-D001");

datastore.put(employee);

// Later, use the key to retrieve the entity

Key userKey = KeyFactory.createKey("Employee", "work-id-D001");

Entity user = datastore.get(userKey);

Page 13: Google App Engine Developer - Day2

Query API

Query query = new Query("Person");

Query.Filter nameFilter = new FilterPredicate( "name", FilterOperator.EQUAL, "John");

query.setFilter(nameFilter);

PreparedQuery results = datastore.prepare(query);

Page 14: Google App Engine Developer - Day2

Query API - Filter & Sort

Query q = new Query("Person");

Query.Filter filter1 = new FilterPredicate(...);

Query.Filter filter2 = new FilterPredicate(...);

Query.Filter comboFilter =

CompositeFilterOperator.and(filter1, filter2);

q.setFilter(comboFilter);

q.addSort("name");

Page 15: Google App Engine Developer - Day2

Query query = new Query("Kind");query.setAncestor(parentKey);

Query API - Ancestor

Page 16: Google App Engine Developer - Day2

Config files - Index● Manual configure:

WEB-INF/datastore-indexes.xml● System generated:

WEB-INF/appengine-generated/datastore-indexes-auto.xml

Page 17: Google App Engine Developer - Day2

Index Example

<?xml version="1.0" encoding="utf-8"?><datastore-indexes> <datastore-index kind="Widget"> <property name="x" direction="asc" /> <property name="date" direction="asc" /> </datastore-index> <datastore-index kind="Widget"> <property name="y" direction="asc" /> <property name="date" direction="asc" /> </datastore-index></datastore-indexes>

<?xml version="1.0" encoding="utf-8"?><datastore-indexes autoGenerate="true"></datastore-indexes>

Page 18: Google App Engine Developer - Day2

Datastore statics

Page 19: Google App Engine Developer - Day2

Important difference to RDBMS

● Single kind(table) query only● Missing property is not equal to Null/None

Page 20: Google App Engine Developer - Day2

Restrictions - inequality

Query for: first_name = Cathy last_name > Able last_name < Mooney

Query for: first_name > Cathy last_name > Able

Page 21: Google App Engine Developer - Day2

Restrictions - sorting

Query for: first_name = Cathy last_name > Able sort by last_name Query for:

last_name > Able sort by first_name

Page 22: Google App Engine Developer - Day2

Using TransactionDatastoreService datastore = DatastoreServiceFactory.getDatastoreService()Transaction txn = datastore.beginTransaction();try { Key ekey = KeyFactory.createKey("Employee", "Joe"); Entity employee = datastore.get(eKey);

/*... reading and writing on employee ...*

datastore.put(employee); txn.commit();

} finally { if (txn.isActive()) { txn.rollback(); }}

Page 23: Google App Engine Developer - Day2

Q&AEND