{"id":1866,"date":"2015-01-28T09:12:42","date_gmt":"2015-01-28T09:12:42","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1866"},"modified":"2025-06-13T23:49:52","modified_gmt":"2025-06-14T06:49:52","slug":"n1ql-dp4-java-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/","title":{"rendered":"Preview using N1QL DP4 from the Java SDK"},"content":{"rendered":"<p>As some of you may know, the Query Team over at Couchbase have been working hard on a new and exciting feature, <a href=\"https:\/\/query.couchbase.com\/\">N1QL<\/a>, which brings the power of query languages (like SQL) to Couchbase.<\/p>\n<p>They just release Developer Preview 4 of N1QL (see the <a href=\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-is-here\/\">blog post here<\/a>), with a bunch of improvements, REST APIs, etc&#8230;<\/p>\n<p>We are happy to announce that a Developer Preview of the Java SDK compatible with N1QL DP4 is now available. Query management underwent a host of changes in this version, which better reflects the state it will be in 2.1 (at which time N1QL should also gain General Availability stability).<\/p>\n<h2>How to Get the Code and Use the Feature<\/h2>\n<p>To get N1QL and activate it, <strong>please see the <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/index.html\">intro documentation<\/a><\/strong>! There are notably steps to activate N1QL indexing on your buckets.<\/p>\n<p><b>UPDATE:\u00a0<\/b>A second developer preview of the SDK is out, pom and links below have been updated accordingly. Scroll to the bottom to see changes&#8230;<\/p>\n<p>To grab the code for this Developer Preview, use the following snippet in your Maven <code>pom.xml<\/code> or download the <a href=\"https:\/\/files.couchbase.com\/maven2\/com\/couchbase\/client\/core-io\/1.1.0-dp2\/core-io-1.1.0-dp2.jar\">core-io<\/a> and <a href=\"https:\/\/files.couchbase.com\/maven2\/com\/couchbase\/client\/java-client\/2.1.0-dp2\/java-client-2.1.0-dp2.jar\">java-client<\/a> jars directly.<\/p>\n<hr \/>\n<pre><code>\r\n    \r\n        com.couchbase.client\r\n        java-client\r\n        2.1.0-dp2\r\n    \r\n\r\n\r\n\r\n    \r\n        couchbase\r\n        couchbase repo\r\n        https:\/\/files.couchbase.com\/maven2\r\n        false\r\n    \r\n\r\n<\/code><\/pre>\n<hr \/>\n<p>Since this is an experimental feature, you need to explicitly activate it in the SDK. This can be done in two ways: passing <code>-Dcom.couchbase.queryEnabled=true<\/code> as a JVM parameter or using <code>CoreEnvironment<\/code> when initializing the <code>Cluster<\/code> in code:<\/p>\n<p>To reproduce this blog&#8217;s examples (<em>which build one upon another, ie copy all the snippets in one Java class to get a full working example<\/em>), you can also use the code below to generate two documents that can be queried:<\/p>\n<h2>What Changed Since 2.0.3 \/ N1QL DP3?<\/h2>\n<p>Most notable changes are described below.<\/p>\n<h3><code>Query<\/code> interface renamed to <code>Statement<\/code><\/h3>\n<p>In N1QL, a complete query is composed at a minimum of a Statement (eg. <code>SELECT * FROM default<\/code>), but can also have positional\/named values and additional request parameters (like server-side timeouts, scan consistency, &#8230;).<\/p>\n<p>The <code>Query<\/code> interface in previous versions was just representing this statement component, and thus has been renamed to <code>Statement<\/code>.<\/p>\n<h3><code>Query<\/code> class hierarchy introduced<\/h3>\n<p><code>Query<\/code> has in fact been kept, but to represent the whole N1QL query. A hierarchy of class have been introduced, representing queries from the simplest (a single statement, <code>SimpleQuery<\/code>) to more advanced ones (<code>ParametrizedQuery<\/code>, <code>PreparedQuery<\/code>).<\/p>\n<p>Queries can be constructed via factory methods on the <code>Query<\/code> abstract class.<\/p>\n<p>One can issue queries with advanced statements not covered by the DSL using the methods that take a String as statement, for example to ensure there&#8217;s a N1QL index on our target bucket:<\/p>\n<h3>Parameters for statements and queries<\/h3>\n<p>DP4 introduces the concept of parametrized statements. These statements have placeholders that can be filled by the server by passing their values in the query. Placeholders are either named (with the <code>$name<\/code> format) or positional (with the <code>$1<\/code> format).<\/p>\n<p>Such queries are represented by a <code>ParametrizedQuery<\/code>, taking values in the form of a <code>JsonObject<\/code> of name-value pairs for named placeholders or <code>JsonArray<\/code> of values for positional placeholders. <strong>Note:<\/strong> <em>There&#8217;s currently a bug in N1QL DP4 that prevents named parameters to work, use positional parameters instead.<\/em><\/p>\n<p>Furthermore, <code>QueryParams<\/code> describes all remaining query parameters that are supported by the SDK: client context ID, server-side timeouts, scan consistencies. They can be added to any request using the ad-hoc <code>Query<\/code> factory method.<\/p>\n<h3>Prepared Statements<\/h3>\n<p>Another big new feature of N1QL DP4 is the introduction of prepared statements. Such statements are built in two steps: &#8211; analyze the statement and produce a query plan. &#8211; execute the query plan and return the results.<\/p>\n<p>The preparation step, returning a query plan, can be skipped after first occurence provided the plan has been cached somewhere by the user. This allows the server to skip a step which is a gain in time.<\/p>\n<p>A <code>QueryPlan<\/code> can be obtained from the server by calling <code>Bucket.prepare(s)<\/code>, <strong>s<\/strong> being any <code>Statement<\/code>. This object can be cached and reuse multiple times later.<\/p>\n<p>To execute a plan, use <code>Bucket.query(Query.prepared(plan))<\/code>. Note that the <code>prepared<\/code> factory method can also accept query parameters and placeholder values (as long as the original statement had the corresponding placeholders).<\/p>\n<h3>Changes to result format<\/h3>\n<p>DP4 introduced several changes in the format of the server response, which have been reflected in the SDK, in <code>AsyncQueryResult<\/code> (the synchronous version <code>QueryResult<\/code> has similar changes):<\/p>\n<ul>\n<li>Results can be streamed to the client before a definitive status has been determined (eg. when processing one of the results fails, or there are non-breaking warnings). As such, a new <code>finalSuccess()<\/code> boolean method has been introduced. <code>success()<\/code> becomes <code>parseSuccess()<\/code>, allowing the user to catch an early error upfront, but the real final status of the query can only be known at the very end by waiting for <code>finalSuccess()<\/code>.<\/li>\n<li>Errors can be multiple, and have different levels. As such <code>error()<\/code> is replaced by <code>errors()<\/code>, returning an <code>Observable<\/code> of errors and warnings.<\/li>\n<li><code>info()<\/code> no longer contains errors or warning in any capacity, but rather a one shot emission of metrics like timers, number of rows, size of the response values, etc&#8230;<\/li>\n<\/ul>\n<p>Note that obtaining the synchronous <code>QueryResult<\/code> now blocks until the whole response is available. Until now, it would block until the first chunk of the response was processed, potentially before rows were available, so this change may introduce a slightly bigger delay in obtaining the result (previous initial delay + the one incurred by a subsequent call to <code>allRows()<\/code>).<\/p>\n<h2>Changes in Developer Preview 2<\/h2>\n<p>This release fixes several bugs in querying:<\/p>\n<ul>\n<li>Fix a parsing error when the response is too large and a chunk is only made of result rows.<\/li>\n<li>Fix a blocking error leading to constant timeouts when querying for some users.<\/li>\n<\/ul>\n<p>Additionally, a few changes have also been made feature-wise:<\/p>\n<ul>\n<li>Added accessors for the request ID (generated by N1QL server) and the client context ID (provided by the user when querying, but truncated to 64 bytes of UTF8 chars by the server).<\/li>\n<li>Added a prepare override on Bucket that accepts a String statement in order to obtain a QueryPlan for it.<\/li>\n<\/ul>\n<p>Thanks to our users on the forums who provided feedback and signaled issues!<\/p>\n<p>The release also contains various bugfixes and new features unrelated to N1QL, that we won&#8217;t detail here (please refer to\u00a0the release notes of <a href=\"https:\/\/github.com\/couchbase\/couchbase-java-client\/releases\/tag\/2.1.0-dp2\">java-client<\/a> and <a href=\"https:\/\/github.com\/couchbase\/couchbase-jvm-core\/releases\/tag\/1.1.0-dp2\">core-io<\/a>).<\/p>\n<h2>Conclusion<\/h2>\n<p>We hope you enjoy N1QL and coding N1QL requests with the latest Java SDK. As always, we welcome <a href=\"https:\/\/www.couchbase.com\/forums\/c\/java-sdk\/\">feedback, suggestions<\/a>, bug <a href=\"https:\/\/issues.couchbase.com\/browse\/JCBC\">reports<\/a> (well, not that we enjoy them to the level of introducing bugs willingly) and even <a href=\"https:\/\/www.couchbase.com\/open-source\/\">contributions<\/a> :)<\/p>\n<p>Happy Coding!<\/p>\n<p>The Java SDK Team<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As some of you may know, the Query Team over at Couchbase have been working hard on a new and exciting feature, N1QL, which brings the power of query languages (like SQL) to Couchbase. They just release Developer Preview 4 [&hellip;]<\/p>\n","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1812,2201],"tags":[],"ppma_author":[9022],"class_list":["post-1866","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-n1ql-query","category-tools-sdks"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Preview using N1QL DP4 from the Java SDK - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Preview using N1QL DP4 from the Java SDK\" \/>\n<meta property=\"og:description\" content=\"As some of you may know, the Query Team over at Couchbase have been working hard on a new and exciting feature, N1QL, which brings the power of query languages (like SQL) to Couchbase. They just release Developer Preview 4 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-28T09:12:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:49:52+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Preview using N1QL DP4 from the Java SDK\",\"datePublished\":\"2015-01-28T09:12:42+00:00\",\"dateModified\":\"2025-06-14T06:49:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\"},\"wordCount\":1051,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\",\"name\":\"Preview using N1QL DP4 from the Java SDK - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-01-28T09:12:42+00:00\",\"dateModified\":\"2025-06-14T06:49:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preview using N1QL DP4 from the Java SDK\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Preview using N1QL DP4 from the Java SDK - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/","og_locale":"en_US","og_type":"article","og_title":"Preview using N1QL DP4 from the Java SDK","og_description":"As some of you may know, the Query Team over at Couchbase have been working hard on a new and exciting feature, N1QL, which brings the power of query languages (like SQL) to Couchbase. They just release Developer Preview 4 [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-01-28T09:12:42+00:00","article_modified_time":"2025-06-14T06:49:52+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Preview using N1QL DP4 from the Java SDK","datePublished":"2015-01-28T09:12:42+00:00","dateModified":"2025-06-14T06:49:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/"},"wordCount":1051,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/","name":"Preview using N1QL DP4 from the Java SDK - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-01-28T09:12:42+00:00","dateModified":"2025-06-14T06:49:52+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-dp4-java-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Preview using N1QL DP4 from the Java SDK"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, Software Engineer, Pivotal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1866"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1866\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1866"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}