/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.datastax.driver.examples.json;
import com.datastax.driver.core.*;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
/**
* Illustrates basic JSON support with plain JSON strings. For more advanced examples using complex objects and custom
* codecs, refer to the other examples in this package.
* <p/>
* Preconditions:
* - a Cassandra 2.2+ cluster is running and accessible through the contacts points identified by CONTACT_POINTS and
* PORT;
* <p/>
* Side effects:
* - creates a new keyspace "examples" in the cluster. If a keyspace with this name already exists, it will be reused;
* - creates a table "examples.querybuilder_json". If it already exists, it will be reused;
* - inserts data in the table.
*
* @see <a href="http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support">What’s New in Cassandra 2.2: JSON Support</a>
*/
public class PlainTextJson {
static String[] CONTACT_POINTS = {"127.0.0.1"};
static int PORT = 9042;
public static void main(String[] args) {
Cluster cluster = null;
try {
cluster = Cluster.builder()
.addContactPoints(CONTACT_POINTS).withPort(PORT)
.build();
Session session = cluster.connect();
createSchema(session);
insertWithCoreApi(session);
selectWithCoreApi(session);
insertWithQueryBuilder(session);
selectWithQueryBuilder(session);
} finally {
if (cluster != null) cluster.close();
}
}
private static void createSchema(Session session) {
session.execute("CREATE KEYSPACE IF NOT EXISTS examples " +
"WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}");
session.execute("CREATE TABLE IF NOT EXISTS examples.querybuilder_json(" +
"id int PRIMARY KEY, name text, specs map<text, text>)");
}
/**
* Demonstrates data insertion with the "core" API, i.e. providing the full query strings.
*/
private static void insertWithCoreApi(Session session) {
// Bind in a simple statement:
session.execute("INSERT INTO examples.querybuilder_json JSON ?",
"{ \"id\": 1, \"name\": \"Mouse\", \"specs\": { \"color\": \"silver\" } }");
// Bind in a prepared statement:
// (we use a local variable here for the sake of example, but in a real application you would cache and reuse
// the prepared statement)
PreparedStatement pst = session.prepare("INSERT INTO examples.querybuilder_json JSON :payload");
session.execute(pst.bind()
.setString("payload", "{ \"id\": 2, \"name\": \"Keyboard\", \"specs\": { \"layout\": \"qwerty\" } }"));
// fromJson lets you provide individual columns as JSON:
session.execute("INSERT INTO examples.querybuilder_json " +
"(id, name, specs) VALUES (?, ?, fromJson(?))",
3, "Screen", "{ \"size\": \"24-inch\" }");
}
/**
* Demonstrates data retrieval with the "core" API, i.e. providing the full query strings.
*/
private static void selectWithCoreApi(Session session) {
// Reading the whole row as a JSON object:
Row row = session.execute("SELECT JSON * FROM examples.querybuilder_json WHERE id = ?", 1).one();
System.out.printf("Entry #1 as JSON: %s%n", row.getString("[json]"));
// Extracting a particular column as JSON:
row = session.execute("SELECT id, toJson(specs) AS json_specs FROM examples.querybuilder_json WHERE id = ?", 2)
.one();
System.out.printf("Entry #%d's specs as JSON: %s%n",
row.getInt("id"), row.getString("json_specs"));
}
/**
* Same as {@link #insertWithCoreApi(Session)}, but using {@link com.datastax.driver.core.querybuilder.QueryBuilder}
* to construct the queries.
*/
private static void insertWithQueryBuilder(Session session) {
// Simple statement:
Statement stmt = insertInto("examples", "querybuilder_json")
.json("{ \"id\": 1, \"name\": \"Mouse\", \"specs\": { \"color\": \"silver\" } }");
session.execute(stmt);
// Prepare and bind:
// (again, cache the prepared statement in a real application)
PreparedStatement pst = session.prepare(
insertInto("examples", "querybuilder_json").json(bindMarker("payload")));
session.execute(pst.bind()
.setString("payload", "{ \"id\": 2, \"name\": \"Keyboard\", \"specs\": { \"layout\": \"qwerty\" } }"));
// fromJson on a single column:
stmt = insertInto("examples", "querybuilder_json")
.value("id", 3)
.value("name", "Screen")
.value("specs", fromJson("{ \"size\": \"24-inch\" }"));
session.execute(stmt);
}
/**
* Same as {@link #selectWithCoreApi(Session)}, but using {@link com.datastax.driver.core.querybuilder.QueryBuilder}
* to construct the queries.
*/
private static void selectWithQueryBuilder(Session session) {
// Reading the whole row as a JSON object:
Statement stmt = select().json()
.from("examples", "querybuilder_json")
.where(eq("id", 1));
Row row = session.execute(stmt).one();
System.out.printf("Entry #1 as JSON: %s%n", row.getString("[json]"));
// Extracting a particular column as JSON:
stmt = select()
.column("id")
.toJson("specs").as("json_specs")
.from("examples", "querybuilder_json")
.where(eq("id", 2));
row = session.execute(stmt).one();
System.out.printf("Entry #%d's specs as JSON: %s%n",
row.getInt("id"), row.getString("json_specs"));
}
}