28 mai 2013
Tags : couchbase
Tweeter Pour ceux qui ne connaissent pas, CouchBase est une base NoSQL orientée document (type MongoDB). Le but ici n'est pas de vous faire un cours sur les bases NoSQL, mais plutôt de vous faire un retour très concret sur mes premiers pas opérationnels avec celle-ci.
<dependencies>
<dependency>
<groupId>couchbase</groupId>
<artifactId>couchbase-client</artifactId>
<version>1.1.4</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>couchbase</id>
<name>Couchbase Maven Repository</name>
<layout>default</layout>
<url>http://files.couchbase.com/maven2/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
/**
* Insertion du programme télé.
* @param tv programme télé contenant la liste
* des chaînes et la liste des programmes.
*/
private static void insertIntoCouchbase(TvForCouchBase tv)
throws URISyntaxException, IOException,
ExecutionException, InterruptedException {
// Création de l'instance jackson pour la serialisation json
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
// Création du client CouchBase.
CouchbaseClient client = new CouchbaseClient(
newArrayList(new URI("http://127.0.0.1:8091/pools")), "default", "");
logger.info("Insert channels");
// Transformation des chaines en json.
String channelIntoJson = mapper.writeValueAsString(tv.getChannel());
// Insertion des chaines
client.set(
"channels", // Clé unique pour la liste des chaines.
(int) TimeUnit.DAYS.toSeconds(3), // Purger au bout de trois jours.
channelIntoJson, // liste des chaînes
PersistTo.ZERO // On attend pas que se soit persister sur disque.
).get();
logger.info("Insert programs");
for (ProgrammeForCouchBase programme : tv.getProgramme()) {
// Transformation d'un programme en json.
String programmeIntoJson = mapper.writeValueAsString(programme);
// Insertion du programme.
client.set(
"prg_" + programme.getId(), // Clé unique du programme
(int) TimeUnit.DAYS.toSeconds(3), // Purger au bout de trois jours.
programmeIntoJson, // Le programme
PersistTo.ZERO // On attend pas que se soit persister sur disque.
).get();
}
// On arrête le client.
client.shutdown(30, TimeUnit.SECONDS);
}
Il faut ensuite récupérer les données côté client :
function (doc, meta) {
if (doc.channel) {
emit(doc.channel, null);
}
}
Comme on le voit, l'intégration se fait tout en douceur, rien de bien compliqué.
// Récupération du client CouchBase(singleton maison)
CouchbaseClient client = CouchBaseService.INSTANCE.getClient();
// Mapper permettant de transformer le json en objet.
ObjectMapper mapper = CouchBaseService.INSTANCE.getMapper();
// Récupération de la vue.
View view = client.getView("programme", "by_channel");
// Création de la query
Query query = new Query();
query.setKey(ComplexKey.of(channel));
// On inclut les documents dans la réponse pour ne pas avoir à ré-appeler CouchBase.
query.setIncludeDocs(true);
List<Programme> programmes = new ArrayList<Programme>();
for (ViewRow row : client.query(view, query)) {
// Pour chaque ligne de la réponse de CouchBase,
// on transforme le document en objet.
programmes.add(mapper.readValue(
(String) row.getDocument(),
Programme.class));
}