N1QL and SDK Support for Java, .NET, and Node.js – Couchbase Live New York 2015
Transcript of N1QL and SDK Support for Java, .NET, and Node.js – Couchbase Live New York 2015
N1QL and SDK Support for Java, .NET and Node.js
Nic | Developer Advocate, CouchbaseMichael | SDK Engineer, Couchbase
Martin | Developer Advocate, Couchbase
©2015 Couchbase Inc. 2
N1QL Primer
©2015 Couchbase Inc. 3
N1QL Primer
NoSQL...
©2015 Couchbase Inc. 4
N1QL Primer
NoSQLbut why not a
query language
?
©2015 Couchbase Inc. 5
N1QL Primer
querying on
relational data=
SQL
©2015 Couchbase Inc. 6
N1QL Primer
querying on
JSON=
N1QL
©2015 Couchbase Inc. 7
N1QL Primer
SELECT fname, children FROM tutorial
©2015 Couchbase Inc. 8
N1QL Primer
SELECT fname, children FROM tutorial
looks like SQL?
©2015 Couchbase Inc. 9
N1QL Primer
SELECT fname, children FROM tutorial
WHERE EVERY child IN tutorial.children
SATISFIES child.age > 10 END
©2015 Couchbase Inc. 10
N1QL Primer
cbq-enginethe N1QL service
©2015 Couchbase Inc. 11
N1QL Primer
cbq-enginethe N1QL service
integrated in Couchbase 4.0, port 8093
©2015 Couchbase Inc. 12
N1QL Primer
cbqcommand line client
©2015 Couchbase Inc. 13
N1QL Primer
responses are
JSON
©2015 Couchbase Inc. 14
N1QL Primer{ "results": [ { "children": [ { "age": 17, "fname": "Abama", "gender": "m" }, { "age": 21, "fname": "Bebama", "gender": "m" } ], "fname": "Ian" } ]}
responses are
JSON
©2015 Couchbase Inc. 15
N1QL Primer
responses have
MetaData
©2015 Couchbase Inc. 16
N1QL Primer "requestID": "19bb1a64-633a-417a-833c-97a8b4c48e7e", "signature": { "Greeting": "string" }, "results": [ {"Greeting": "Hello World" "status": "success", "metrics": { "elapsedTime": "7.48ms", "executionTime": "6.8ms", "resultCount": 1, "resultSize": 49 }}
responses have
MetaData
©2015 Couchbase Inc. 17
Usage in SDKs
©2015 Couchbase Inc. 18
Usage in SDKs
C / C++
©2015 Couchbase Inc. 19
Usage in SDKs
©2015 Couchbase Inc. 20
Usage in SDKs
API at the
Bucketlevel
©2015 Couchbase Inc. 21
Usage in SDKs
Statementin a
Querywith additional
Parameters
©2015 Couchbase Inc. 22
Usage in SDKs
Statements can have
Placeholders
©2015 Couchbase Inc. 23
Usage in SDKs
either
positional $1
©2015 Couchbase Inc. 24
Usage in SDKs
or
named$param
©2015 Couchbase Inc. 25
Usage in SDKs
Placeholder values
are passed in the query's parameters
©2015 Couchbase Inc. 26
Usage in SDKs
Statements can be
Prepared
©2015 Couchbase Inc. 27
Usage in SDKs
get a QueryPlanhold to it
then execute it
repeatedly
N1QL + .NET SDKMartin Esmann | Developer Advocate,
Couchbase
©2015 Couchbase Inc. 29
.NET
[1]SDKand [2]Extension
Support
©2015 Couchbase Inc. 30
.NET [1]
[1]QueryRequest
API in the .NET SDK
©2015 Couchbase Inc. 31
.NET [1]
AD HOC queriesVia IBucket
©2015 Couchbase Inc. 32
.NET [1]
Support for all N1QL Features
©2015 Couchbase Inc. 33
.NET [1]
A Wrapper around the
REST API
©2015 Couchbase Inc. 34
.NET [1]
But adds:Type safety Intellisense Support
Fluent interface Data Mapper
©2015 Couchbase Inc. 35
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 36
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 37
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 38
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 39
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 40
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 41
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 42
.NET [1]
var query = QueryRequest.Create(sql);var result = await ClusterHelper
.GetBucket(bucketName) .QueryAsync<dynamic>(query);if(result.Errors != null || !result.Success){ // error } else { var rows = result.Rows;}
©2015 Couchbase Inc. 43
.NET [2]
[2] LINQProvider
©2015 Couchbase Inc. 44
.NET [2]
Based off Re-Linq
[EF and NHibernate are too!]
©2015 Couchbase Inc. 45
.NET [2]
E x t e n ds
The .NET SDK
©2015 Couchbase Inc. 46
.NET [2]
Open Source[#please do contribute]
©2015 Couchbase Inc. 47
.NET [2]
Provides a
SubsetOf the N1QL Language…
©2015 Couchbase Inc. 48
.NET [2]
Also, Requires: Domain Model == JSON
structure
©2015 Couchbase Inc. 49
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 50
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 51
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 52
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 53
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 54
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 55
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 56
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 57
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 58
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 59
.NET [2]using Couchbase.Linq;using Couchbase.Linq.Extensions;var bucket = ClusterHelper .GetBucket(bucketName);
var airlines = from airline in
bucket.Queryable<Airline>() where airline.Iata != null && airline.Type == "airline"
select airline;
return airlines.Take(1).ToList();
©2015 Couchbase Inc. 60
DEMO
©2015 Couchbase Inc. 61
Linq2Couchbase GA: Breaking Changes• New public API: IBucketContext • Similar to DbContext and DataContext but with
a more “doc centric” vibe• Bucket.Queryable<T> is no longer public
• EntityFilter, EntityFilterManager and all related classes are now DocumentFilter, DocumentFilterManager, etc.• More “doc centric” feel, better aligns with
Couchbase’s non-RDBMS roots• Dependency on ClusterHelper has been
removed.• BucketContext now takes a Cluster as an
argument.• Cluster can still be managed by ClusterHelper
as always
©2015 Couchbase Inc. 62
Q & A