Let's talk about NoSQL Standard
OtĂĄvio Santana
@otaviojava
otaviojava@java.net
otaviojava@apache.org
NoSQL
● Database
● Doesn't use relationship
● BASE
● Five types
Key Value
● AmazonDynamo
● AmazonS3
● Redis
● Scalaris
● Voldemort
● Couchbase
valuekey
valuekey
valuekey
Document
● AmazonSimpleDb
● ApacheCouchdb
● MongoDb
● Riak
● Couchbase
Column
● Hbase
● Cassandra
● Scylla
● Clouddata
● SimpleDb
● DynamoDB
Row-key Columns...
Apollo
Aphrodi
te
Ares
Sun
Duty
{Love, happy}
Duty
War
Duty
Sword
weapon
Color
Krato
s
Dead Gods
13
Graph
● Neo4j
● InfoGrid
● Sones
● HyperGraphDB
Apollo Ares
Krat
os
was dead was dead
Is brother
killed killed
Multi-model
● OrientDB
● Couchbase
● Elasticsearch
● Cassandra
The Problem
The Problem
The Current solution
● Spring Data
● Hibernate OGM
● TopLink
The Perfect Solution
● Abstraction API
● Communication API
● No lock-in
● Split problems
Apache Diana was Born (incubator)
● API Communication layer
● Apache Project
● Document, key-value, Column, Graph
● Universal Adapter
● Standard
What Diana is not
● A new API to replace JPA
● A new API to abstraction layer
● Just one API communication to solve all kind of NoSQL
database
● Be responsible to do integrations with other technologies such
as CDI, EJB, Bean Validation, Spring, etc.
Diana Project
● Commons API
● Document API
● Graph API
● Key-value API
● Column API
● Four TCKs
Diana Project
Why Diana?
● Goddess of the hunt, nature
and moon
● Fought in Troy
● brave warrior and hunter
Road Map
● Draft and code Proposal
● Community Feedback
● Involve NoSQL Vendors
● Involve Solution Vendors
● Apache Project
● Development
● JSR
Nomenclature
● Configuration
● Factory
● Manager
● Entity
● Value
Value
Value value = Value.of("123");
Integer integerValue = value.get(Integer.class);
List<Integer> list = value.getList(Integer.class);
Set<Integer> set = value.getSet(Integer.class);
Stream<Integer> stream = value.getStream(Integer.class);
String cast = value.cast();//unsafe
Custom Value
public class MoneyWriter implements
WriterField<Money, String> {
@Override
public boolean isCompatible(Class clazz) {
return false;
}
@Override
public String write(Money object) {
return object.toString();
}
}
public class MoneyReader implements
ReaderField {
@Override
public boolean isCompatible(Class clazz) {
return Money.class.equals(clazz);
}
@Override
public <T> T read(Class<T> clazz, Object
value) {
return (T) Money.parse(value.toString());
}
}
Entities
Money money = new Money();
Value value = Value.of(money);
DocumentCollectionEntity entity = DocumentCollectionEntity.of("collection");
entity.add(Document.of("name", "Daniel Soro"));
entity.add(Document.of("age", 26));
entity.add(Document.of("salary", money));
String name = entity.getName();
List<Document> documents = entity.getDocuments();
Optional<Document> age = entity.find("age");
Entities
Money money = new Money();
Value value = Value.of(money);
DocumentCollectionEntity entity = DocumentCollectionEntity.of("collection");
entity.add(Document.of("name", "Daniel Soro"));
entity.add(Document.of("age", 26));
entity.add(Document.of("salary", money));
entity.add(Document.of("subdocument", Document.of("sub", Arrays.asList(1, 2, 3))));
String name = entity.getName();
List<Document> documents = entity.getDocuments();
Optional<Document> age = entity.find("age");
Entities
Money money = new Money();
Value value = Value.of(money);
ColumnFamilyEntity entity = ColumnFamilyEntity.of("family");
Column id = Column.of("id", 10L);
entity.add(id);
entity.add(Column.of("version", 0.001));
entity.add(Column.of("name", "Diana"));
entity.add(Column.of("options", Arrays.asList(1, 2, 3)));
entity.add(Column.of("pay", value));
String name = entity.getName();
List<Column> columns = entity.getColumns();
Optional<Column> notFound = entity.find("notFound");
Entities
Value value = Value.of(new Money());
KeyValue<String> keyValue = KeyValue.of("key", value);
String key = keyValue.getKey();
Value value1 = keyValue.getValue();
Entities
Value value = Value.of(new Money());
KeyValue<String> keyValue = KeyValue.of("key", value);
String key = keyValue.getKey();
Value value1 = keyValue.getValue();
Manager
DocumentCollectionEntity entitySaved = collectionManager.save(entity);
collectionManager.save(entity, TTL.ofHours(2));
collectionManager.saveAsync(entity);
collectionManager.saveAsync(entity, TTL.ofDays(3));
collectionManager.saveAsync(entity, System.out::print);
DocumentQuery query = DocumentQuery.of("collection");
Optional<Document> id = entitySaved.find("_id");
query.addCondition(DocumentCondition.eq(id.get()));
List<DocumentCollectionEntity> documentsFound = collectionManager.find(query);
DocumentCollectionEntity document = collectionManager.findOne(query);
collectionManager.delete(query);
collectionManager.deleteAsync(query);
collectionManager.deleteAsync(query, System.out::print);
Manager
columnEntityManager.save(entity);
columnEntityManager.saveAsync(entity);
columnEntityManager.saveAsync(entity, TTL.ofDays(3));
columnEntityManager.saveAsync(entity, System.out::print);
ColumnQuery query = ColumnQuery.of("family");
query.addCondition(ColumnCondition.eq(id));
List<ColumnFamilyEntity> entities = columnEntityManager.find(query);
ColumnFamilyEntity family = columnEntityManager.findOne(query);
columnEntityManager.delete(query);
columnEntityManager.deleteAsync(query);
columnEntityManager.deleteAsync(query, System.out::print);
Manager
KeyValue<String> keyValue = KeyValue.of("myKey", Value.of("value"));
bucket.put("key", "value");
bucket.put(keyValue);
bucket.put(keyValue, TTL.ofMicros(12));
Optional<Value> value = bucket.get("key");
Factory
BucketManager bucket = managerFactory.getBucketManager("bucket");
List<String> list = managerFactory.getList("bucketList", String.class);
Set<String> set = managerFactory.getSet("bucketSet", String.class);
Map<String, Integer> map = managerFactory.getMap("bucketList", String.class,
Integer.class);
Queue<String> queue = managerFactory.getQueue("queueList", String.class);
Factory
ColumnFamilyManager columnEntityManager =
columnManagerFactory.getColumnEntityManager("space");
DocumentCollectionManager collection =
documentManagerFactory.getDocumentEntityManager("collection");
Configuration
ColumnConfiguration columnConfiguration = new ColumnDriver();
DocumentConfiguration documentConfiguration = new DocumentDriver();
KeyValueConfiguration keyValueConfiguration = new KeyValueDriver();
ColumnFamilyManagerFactory columnFactory = columnConfiguration.getManagerFactory();
DocumentCollectionManagerFactory documentFactory =
documentConfiguration.getManagerFactory();
BucketManagerFactory keyFactory = keyValueConfiguration.getManagerFactory();
Native Query
columnEntityManager.nativeQueryAsync(query, System.out::println);
List<ColumnFamilyEntity> entities = columnEntityManager.nativeQuery(query);
PreparedStatement preparedStatement = columnEntityManager.nativeQueryPrepare(query);
preparedStatement.bind(1,2,3);
preparedStatement.executeQuery();
preparedStatement.executeQueryAsync(System.out::println);
Native Query
collectionManager.nativeQueryAsync(query, System.out::println);
List<DocumentCollectionEntity> entities = collectionManager.nativeQuery(query);
PreparedStatement preparedStatement = collectionManager.nativeQueryPrepare(query);
preparedStatement.bind(1,2,3);
preparedStatement.executeQuery();
preparedStatement.executeQueryAsync(System.out::println);
Diana Query Language
Select
select * from bucket;
select key1, key2 from bucket;
Insert
INSERT INTO bucket VALUES (key, value);
INSERT INTO bucket VALUES (key, value) ttl 20 (seconds, minutes, hours, days);
Delete
DELETE FROM bucket WHERE id =value;
Diana Query Language
Insert
INSERT INTO collection (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
INSERT INTO collection (column1,column2,column3,...)
VALUES (value1,value2,value3,...) (value1,value2,value3,...);
INSERT INTO collection (column1,column2,column3,...)
VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days);
INSERT INTO collection (column1,column2,column3,...)
VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days) async;
Diana Query Language
Select
select * from collection;
select field, field2 from collection;
select field, field2 from collection where id = 2;
select field, field2 from collection where id >= 2 or field >3;
Delete
DELETE FROM collection WHERE id =value;
DELETE field, field2 FROM collection WHERE id =value;
Diana Query Language
Insert
INSERT INTO family (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
INSERT INTO family (column1,column2,column3,...)
VALUES (value1,value2,value3,...) (value1,value2,value3,...);
INSERT INTO family (column1,column2,column3,...)
VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days);
INSERT INTO family (column1,column2,column3,...)
VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days) async;
Diana Query Language
Select
select * from family;
select field, field2 from family;
select field, field2 from family where id = 2;
select field, field2 from family where id >= 2 and index >3;
Delete
DELETE FROM family WHERE id =value;
DELETE field, field2 FROM family WHERE id =value;
Site
https://jnosql.github.io/diana-site/
Code
https://github.com/JNOSQL
Apache Proposal
https://wiki.apache.org/incubator/DianaProposal
Thank you
OtĂĄvio Santana
@otaviojava
otaviojava@java.net
otaviojava@apache.org

Let's talk about NoSQL Standard

  • 1.
    Let's talk aboutNoSQL Standard OtĂĄvio Santana @otaviojava otaviojava@java.net otaviojava@apache.org
  • 2.
    NoSQL ● Database ● Doesn'tuse relationship ● BASE ● Five types
  • 3.
    Key Value ● AmazonDynamo ●AmazonS3 ● Redis ● Scalaris ● Voldemort ● Couchbase valuekey valuekey valuekey
  • 4.
  • 5.
    Column ● Hbase ● Cassandra ●Scylla ● Clouddata ● SimpleDb ● DynamoDB Row-key Columns... Apollo Aphrodi te Ares Sun Duty {Love, happy} Duty War Duty Sword weapon Color Krato s Dead Gods 13
  • 6.
    Graph ● Neo4j ● InfoGrid ●Sones ● HyperGraphDB Apollo Ares Krat os was dead was dead Is brother killed killed
  • 7.
  • 8.
  • 9.
  • 10.
    The Current solution ●Spring Data ● Hibernate OGM ● TopLink
  • 11.
    The Perfect Solution ●Abstraction API ● Communication API ● No lock-in ● Split problems
  • 12.
    Apache Diana wasBorn (incubator) ● API Communication layer ● Apache Project ● Document, key-value, Column, Graph ● Universal Adapter ● Standard
  • 13.
    What Diana isnot ● A new API to replace JPA ● A new API to abstraction layer ● Just one API communication to solve all kind of NoSQL database ● Be responsible to do integrations with other technologies such as CDI, EJB, Bean Validation, Spring, etc.
  • 14.
    Diana Project ● CommonsAPI ● Document API ● Graph API ● Key-value API ● Column API ● Four TCKs
  • 15.
  • 16.
    Why Diana? ● Goddessof the hunt, nature and moon ● Fought in Troy ● brave warrior and hunter
  • 17.
    Road Map ● Draftand code Proposal ● Community Feedback ● Involve NoSQL Vendors ● Involve Solution Vendors ● Apache Project ● Development ● JSR
  • 18.
  • 19.
    Value Value value =Value.of("123"); Integer integerValue = value.get(Integer.class); List<Integer> list = value.getList(Integer.class); Set<Integer> set = value.getSet(Integer.class); Stream<Integer> stream = value.getStream(Integer.class); String cast = value.cast();//unsafe
  • 20.
    Custom Value public classMoneyWriter implements WriterField<Money, String> { @Override public boolean isCompatible(Class clazz) { return false; } @Override public String write(Money object) { return object.toString(); } } public class MoneyReader implements ReaderField { @Override public boolean isCompatible(Class clazz) { return Money.class.equals(clazz); } @Override public <T> T read(Class<T> clazz, Object value) { return (T) Money.parse(value.toString()); } }
  • 21.
    Entities Money money =new Money(); Value value = Value.of(money); DocumentCollectionEntity entity = DocumentCollectionEntity.of("collection"); entity.add(Document.of("name", "Daniel Soro")); entity.add(Document.of("age", 26)); entity.add(Document.of("salary", money)); String name = entity.getName(); List<Document> documents = entity.getDocuments(); Optional<Document> age = entity.find("age");
  • 22.
    Entities Money money =new Money(); Value value = Value.of(money); DocumentCollectionEntity entity = DocumentCollectionEntity.of("collection"); entity.add(Document.of("name", "Daniel Soro")); entity.add(Document.of("age", 26)); entity.add(Document.of("salary", money)); entity.add(Document.of("subdocument", Document.of("sub", Arrays.asList(1, 2, 3)))); String name = entity.getName(); List<Document> documents = entity.getDocuments(); Optional<Document> age = entity.find("age");
  • 23.
    Entities Money money =new Money(); Value value = Value.of(money); ColumnFamilyEntity entity = ColumnFamilyEntity.of("family"); Column id = Column.of("id", 10L); entity.add(id); entity.add(Column.of("version", 0.001)); entity.add(Column.of("name", "Diana")); entity.add(Column.of("options", Arrays.asList(1, 2, 3))); entity.add(Column.of("pay", value)); String name = entity.getName(); List<Column> columns = entity.getColumns(); Optional<Column> notFound = entity.find("notFound");
  • 24.
    Entities Value value =Value.of(new Money()); KeyValue<String> keyValue = KeyValue.of("key", value); String key = keyValue.getKey(); Value value1 = keyValue.getValue();
  • 25.
    Entities Value value =Value.of(new Money()); KeyValue<String> keyValue = KeyValue.of("key", value); String key = keyValue.getKey(); Value value1 = keyValue.getValue();
  • 26.
    Manager DocumentCollectionEntity entitySaved =collectionManager.save(entity); collectionManager.save(entity, TTL.ofHours(2)); collectionManager.saveAsync(entity); collectionManager.saveAsync(entity, TTL.ofDays(3)); collectionManager.saveAsync(entity, System.out::print); DocumentQuery query = DocumentQuery.of("collection"); Optional<Document> id = entitySaved.find("_id"); query.addCondition(DocumentCondition.eq(id.get())); List<DocumentCollectionEntity> documentsFound = collectionManager.find(query); DocumentCollectionEntity document = collectionManager.findOne(query); collectionManager.delete(query); collectionManager.deleteAsync(query); collectionManager.deleteAsync(query, System.out::print);
  • 27.
    Manager columnEntityManager.save(entity); columnEntityManager.saveAsync(entity); columnEntityManager.saveAsync(entity, TTL.ofDays(3)); columnEntityManager.saveAsync(entity, System.out::print); ColumnQueryquery = ColumnQuery.of("family"); query.addCondition(ColumnCondition.eq(id)); List<ColumnFamilyEntity> entities = columnEntityManager.find(query); ColumnFamilyEntity family = columnEntityManager.findOne(query); columnEntityManager.delete(query); columnEntityManager.deleteAsync(query); columnEntityManager.deleteAsync(query, System.out::print);
  • 28.
    Manager KeyValue<String> keyValue =KeyValue.of("myKey", Value.of("value")); bucket.put("key", "value"); bucket.put(keyValue); bucket.put(keyValue, TTL.ofMicros(12)); Optional<Value> value = bucket.get("key");
  • 29.
    Factory BucketManager bucket =managerFactory.getBucketManager("bucket"); List<String> list = managerFactory.getList("bucketList", String.class); Set<String> set = managerFactory.getSet("bucketSet", String.class); Map<String, Integer> map = managerFactory.getMap("bucketList", String.class, Integer.class); Queue<String> queue = managerFactory.getQueue("queueList", String.class);
  • 30.
  • 31.
    Configuration ColumnConfiguration columnConfiguration =new ColumnDriver(); DocumentConfiguration documentConfiguration = new DocumentDriver(); KeyValueConfiguration keyValueConfiguration = new KeyValueDriver(); ColumnFamilyManagerFactory columnFactory = columnConfiguration.getManagerFactory(); DocumentCollectionManagerFactory documentFactory = documentConfiguration.getManagerFactory(); BucketManagerFactory keyFactory = keyValueConfiguration.getManagerFactory();
  • 32.
    Native Query columnEntityManager.nativeQueryAsync(query, System.out::println); List<ColumnFamilyEntity>entities = columnEntityManager.nativeQuery(query); PreparedStatement preparedStatement = columnEntityManager.nativeQueryPrepare(query); preparedStatement.bind(1,2,3); preparedStatement.executeQuery(); preparedStatement.executeQueryAsync(System.out::println);
  • 33.
    Native Query collectionManager.nativeQueryAsync(query, System.out::println); List<DocumentCollectionEntity>entities = collectionManager.nativeQuery(query); PreparedStatement preparedStatement = collectionManager.nativeQueryPrepare(query); preparedStatement.bind(1,2,3); preparedStatement.executeQuery(); preparedStatement.executeQueryAsync(System.out::println);
  • 34.
    Diana Query Language Select select* from bucket; select key1, key2 from bucket; Insert INSERT INTO bucket VALUES (key, value); INSERT INTO bucket VALUES (key, value) ttl 20 (seconds, minutes, hours, days); Delete DELETE FROM bucket WHERE id =value;
  • 35.
    Diana Query Language Insert INSERTINTO collection (column1,column2,column3,...) VALUES (value1,value2,value3,...); INSERT INTO collection (column1,column2,column3,...) VALUES (value1,value2,value3,...) (value1,value2,value3,...); INSERT INTO collection (column1,column2,column3,...) VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days); INSERT INTO collection (column1,column2,column3,...) VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days) async;
  • 36.
    Diana Query Language Select select* from collection; select field, field2 from collection; select field, field2 from collection where id = 2; select field, field2 from collection where id >= 2 or field >3; Delete DELETE FROM collection WHERE id =value; DELETE field, field2 FROM collection WHERE id =value;
  • 37.
    Diana Query Language Insert INSERTINTO family (column1,column2,column3,...) VALUES (value1,value2,value3,...); INSERT INTO family (column1,column2,column3,...) VALUES (value1,value2,value3,...) (value1,value2,value3,...); INSERT INTO family (column1,column2,column3,...) VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days); INSERT INTO family (column1,column2,column3,...) VALUES (value1,value2,value3,...) ttl 20 (seconds, minutes, hours, days) async;
  • 38.
    Diana Query Language Select select* from family; select field, field2 from family; select field, field2 from family where id = 2; select field, field2 from family where id >= 2 and index >3; Delete DELETE FROM family WHERE id =value; DELETE field, field2 FROM family WHERE id =value;
  • 39.
  • 40.
  • 41.
  • 42.