# DSL Java Vitam

Cette partie va essayer de montrer quelques exemples d’usages du DSL à l’aide de la librairie DSL Java Vitam dans différentes conditions.

## Génération de requêtes DSL en Java

Les clients externes java Vitam offrent la possibilité de créer les requêtes DSL à partir des librairies DSL. Il existent 4 types de requêtes DSL au format Json :

- requêtes DSL de recherche (SELECT SINGLE)
- requêtes DSL de recherche de type graphe (SELECT MULTIPLE) EXPERIMENTAL
- requête DSL d’accès unitaire (GET BY ID) qui peut se générer de deux manières différentes
- requête DSL de modification unitaire (UPDATE BY ID) qui peut se générer de deux manières différentes

Pour le choix de la requête nécessaire, se référer à la document de l’API rest Vitam. Exemples de code de génération :

- requête DSL graphe pour recherche sur métadonnées : Select Multi Query (collections multi-query : Unit et Objects)

    include fr.gouv.vitam.common.database.builder.request.multiple.SelectMultiQuery;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;

    Query query1 = match("Title", "titre").setDepthLimit(4);
    Query query2 = exists("FilePlanPosition").setDepthLimit(3);
    SelectMultiQuery select = new SelectMultiQuery().addRoots("id0")
          .addQueries(query1, query2)
          .setLimitFilter(0, 100)
          .addProjection(id(), "Title", type(), parents(), object());
    JsonNode json = select.getFinalSelect();

- requête DSL unitaire d’accès pour les métadonnées : Select By Id (collections multi-query : Unit et Objects)

    include fr.gouv.vitam.common.database.builder.request.multiple.SelectMultiQuery;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;

    SelectMultiQuery select = new SelectMultiQuery()
          .addProjection(id(), "Title");
    JsonNode json = select.getFinalSelectById();

- requête DSL graphe pour recherche sur les données référentiel et logbook : Select Single Query

    include fr.gouv.vitam.common.database.builder.request.single.Select;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;

    Query query = eq("Identifier", "ID");
    Select select = new Select()
          .setQuery(query)
          .setLimitFilter(0, 100)
          .addProjection();
    JsonNode json = select.getFinalSelect();

- requête DSL unitaire d’accès pour les données référentiel et logbook : Select By Id

    include fr.gouv.vitam.common.database.builder.request.single.Select;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;

    Select select = new Select()
          .addProjection(id(), "Name");
    JsonNode json = select.getFinalSelectById();

- requête DSL de modification unitaire pour les métadonnées : Update By Id (collection multi-query : Unit et Objects)

    include fr.gouv.vitam.common.database.builder.request.multiple.UpdateMultiQuery;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.*;

    Action action = set("Description", "Ma nouvelle description");
    UpdateMultiQuery update = new UpdateMultiQuery()
            .addAction(action);
    JsonNode json = update.getFinalUpdateById();

- requête DSL de modification unitaire pour les données référentiel et logbook : Update By Id (collection single)

    include fr.gouv.vitam.common.database.builder.request.single.Update;
    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.*;

    Action action = set("Name", "Mon nouveau nom");
    Update update = new Update().addActions(action);
    JsonNode json = update.getFinalUpdateById();

## Exemples d’usages du DSL

### Partie $query

- $and, $or, $not

    { "$and" : [ { "$gte" : { "StartDate" : "2014-03-23T00:00:00" } }, { "$lt" : { "StartDate" : "2014-04-23T00:00:00" } } ] }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = and().add(gte("StartDate", dateFormat.parse("2014-03-23T00:00:00")),
             lt("StartDate", dateFormat.parse("2014-04-23T00:00:00"));

- $eq, $ne, $lt, $lte, $gt, $gte

    { "$gte" : { "StartDate" : "2014-03-23T00:00:00" } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = gt("StartDate", dateFormat.parse("2014-03-23T00:00:00"));

- $range

    { "$range" : { "StartDate" : { "$gte" : "2014-03-23T00:00:00", "$lt" : "2014-04-23T00:00:00" } } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = range("StartDate", dateFormat.parse("2014-03-23T00:00:00"), true,
          dateFormat.parse("2014-04-23T00:00:00"), true);

- $exists

    { "$exists" : "StartDate" }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = exists("StartDate");

- $in, $nin

    { "$in" : { "#unitups" : ["id1", "id2"] } }

    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = in(unitups(), "id1", "id2");

- $wildcard

    { "$wildcard" : { "#type" : "FAC*01" } }

    static include fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.*;
    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = wildcard(type(), "FAC*01");

- $match, $match_all, $match_phrase, $match_phrase_prefix

    { "$match" : { "Title" : "Napoléon Waterloo" } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = match("Title", "Napoléon Waterloo");

    { "$match_phrase" : { "Description" : "le petit chat est mort" } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = matchPhrase("Description", "le petit chat est mort");

- $regex

    { "$regex" : { "Identifier" : "AC*" } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = regex("Title", "AC*");

- $search

    { "$search" : { "Title" : "\"oeufs cuits\" +(tomate | patate) + -frite" } }

    static include fr.gouv.vitam.common.database.builder.query.QueryHelper.*;
    Query query = search("Title", "\"oeufs cuits\" +(tomate | patate) + -frite");

### Partie $action dans la fonction Update

- $set

    { "$set" : { "Title" : "Mon nouveau titre", "Description" : "Ma nouvelle description" } }

    static include fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.*;
    Action action = set("Title", "Mon nouveau titre").add("Description", "Ma nouvelle description");

- $unset

    { "$unset" : [ "StartDate", "EndDate" ] }

    static include fr.gouv.vitam.common.database.builder.query.action.UpdateActionHelper.*;
    Action action = unset("StartDate", "EndDate");