Les requêtes de recherche permettent de rechercher des composants stockés dans FlowerDocs en fonction de différents critères. Ces requêtes de recherche sont composées de la façon suivante :
Les différentes clauses
Clause Select
La selectClause permet de définir les champs à remonter. Elle est constituée d’une liste de valeurs fields.
Clauses Filter
Les filterClauses permettent de définir des filtres à appliquer sur la recherche. Une filterClause est composée de la façon suivante :
criteria: les critères de ce filtrefilterClauses: les sous-filtres
Une clause Filter va pouvoir en contenir une ou plusieurs autres afin de pouvoir effectuer des requêtes complexes avec des opérateurs logiques ET et OU. Pour cela, il existe deux types de clause Filter :
AndClause: Clause ET, un opérateur logique ET est appliqué entre ses critères et ses sous-clausesOrClause: Clause OU, un opérateur logique OU est appliqué entre ses critères et ses sous-clauses
Clauses Order
Les orderClauses permettent de définir l’ordre dans lequel les résultats seront remontés. Elles sont composées de la façon suivante :
name: le nom du critère sur lequel triertype: le type du critèreascending: tri par ordre croissant ou non
Pagination des résultats
start: Définit le début de la page de recherchemax: Définit le nombre maximum de résultats à retourner
Exemples
Les exemples ci-dessous indiquent comment effectuer une recherche de document ayant un nom contenant la chaîne de caractères facture.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "name",
"operator": "CONTAINS",
"type": "STRING",
"values": [
"facture"
]
}
]
}
],
"max": 10
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException
{
Criterion criterion = CriterionBuilder.field(NAME).operator(CONTAINS).value("facture").build();
FilterClause filter = FilterClauseBuilder.init().criterion(criterion).build();
SearchRequest request = SearchRequestBuilder.init().filter(filter).build();
SearchResponse response = documentService.search(request);
}
CONTAINS n’est pas sensible à la casse (ne fait pas de distinction entre les majuscules et les minuscules), contrairement aux opérateurs EQUALS_TO et DIFFERENT.
Donc l’exemple ci-dessus remontera les documents dont le nom contient : “facture”, mais aussi “FACTURE”, “Facture” …
Clause Select et tri
Cet exemple montre comment sélectionner des champs spécifiques et trier les résultats. Ici nous recherchons les documents de classe Invoice, en ne remontant que le nom, l’identifiant de classe et la date de création, triés du plus récent au plus ancien.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"selectClause": {
"fields": ["name", "classid", "creationDate"]
},
"filterClauses": [
{
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Invoice"]
}
]
}
],
"orderClauses": [
{
"name": "creationDate",
"type": "TIMESTAMP",
"ascending": false
}
],
"start": 0,
"max": 20
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException
{
Criterion criterion = CriterionBuilder.field(CLASSID).operator(EQUALS_TO).value("Invoice").build();
FilterClause filter = FilterClauseBuilder.init().criterion(criterion).build();
OrderClause order = new OrderClause("creationDate", TIMESTAMP, false);
SearchRequest request = SearchRequestBuilder.init()
.display("name", "classid", "creationDate")
.filter(filter)
.order(order)
.max(20)
.build();
SearchResponse response = documentService.search(request);
}
Critères multiples (ET)
Lorsqu’une clause de filtre contient plusieurs critères, ils sont combinés avec un opérateur ET. Cet exemple recherche les documents de classe Invoice dont le tag B_ClientName contient “Dupont”.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Invoice"]
},
{
"name": "B_ClientName",
"operator": "CONTAINS",
"type": "STRING",
"values": ["Dupont"]
}
]
}
],
"max": 10
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException
{
Criterion classCriterion = CriterionBuilder.field(CLASSID).operator(EQUALS_TO).value("Invoice").build();
Criterion tagCriterion = CriterionBuilder.name("B_ClientName").operator(CONTAINS).value("Dupont").build();
FilterClause filter = FilterClauseBuilder.and()
.criterion(classCriterion)
.criterion(tagCriterion)
.build();
SearchRequest request = SearchRequestBuilder.init().filter(filter).max(10).build();
SearchResponse response = documentService.search(request);
}
Recherche par plage de dates (BETWEEN)
Utilisez l’opérateur BETWEEN avec le type TIMESTAMP pour rechercher dans une plage de dates. Les valeurs sont des timestamps epoch en millisecondes. Cet exemple recherche les documents créés durant l’année 2024.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
# Valeurs de dates en millisecondes epoch :
# 1704067200000 = 2024-01-01T0000Z
# 1735689600000 = 2025-01-01T0000Z
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "creationDate",
"operator": "BETWEEN",
"type": "TIMESTAMP",
"values": ["1704067200000", "1735689600000"]
}
]
}
],
"max": 50
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException, ParseException
{
Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2024-01-01");
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2025-01-01");
Criterion criterion = CriterionBuilder.field(CREATION_DATE)
.operator(BETWEEN).type(TIMESTAMP)
.value(startDate).value(endDate)
.build();
FilterClause filter = FilterClauseBuilder.init().criterion(criterion).build();
SearchRequest request = SearchRequestBuilder.init().filter(filter).max(50).build();
SearchResponse response = documentService.search(request);
}
Logique OU
Pour rechercher des documents correspondant à une condition OU une autre, utilisez une OrClause. Le champ type doit être défini explicitement pour indiquer la logique OU. Cet exemple recherche les documents dont la classe est soit Invoice soit Contract.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"type": "com.flower.docs.domain.search.OrClause",
"clauses": [
{
"type": "com.flower.docs.domain.search.AndClause",
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Invoice"]
}
]
},
{
"type": "com.flower.docs.domain.search.AndClause",
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Contract"]
}
]
}
]
}
],
"max": 10
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException
{
Criterion invoiceCrit = CriterionBuilder.field(CLASSID).operator(EQUALS_TO).value("Invoice").build();
Criterion contractCrit = CriterionBuilder.field(CLASSID).operator(EQUALS_TO).value("Contract").build();
FilterClause invoiceClause = FilterClauseBuilder.and().criterion(invoiceCrit).build();
FilterClause contractClause = FilterClauseBuilder.and().criterion(contractCrit).build();
FilterClause orClause = FilterClauseBuilder.or()
.filter(invoiceClause)
.filter(contractClause)
.build();
SearchRequest request = SearchRequestBuilder.init().filter(orClause).max(10).build();
SearchResponse response = documentService.search(request);
}
Combinaison ET + OU
Plusieurs filterClauses au niveau racine sont combinées avec un ET. Cet exemple recherche les documents Invoice créés en 2024, dont le nom de client est soit “Dupont” soit “Martin”. La première clause de filtre gère les conditions ET (classe + date), tandis que la seconde utilise une clause OU pour les noms de client.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
curl -X POST "<CORE_HOST>/rest/documents/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Invoice"]
},
{
"name": "creationDate",
"operator": "BETWEEN",
"type": "TIMESTAMP",
"values": ["1704067200000", "1735689600000"]
}
]
},
{
"type": "com.flower.docs.domain.search.OrClause",
"clauses": [
{
"type": "com.flower.docs.domain.search.AndClause",
"criteria": [
{
"name": "B_ClientName",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Dupont"]
}
]
},
{
"type": "com.flower.docs.domain.search.AndClause",
"criteria": [
{
"name": "B_ClientName",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Martin"]
}
]
}
]
}
],
"max": 10
}'
@Autowired
private DocumentService documentService;
public void search() throws FunctionalException, TechnicalException, ParseException
{
Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2024-01-01");
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2025-01-01");
Criterion classCrit = CriterionBuilder.field(CLASSID).operator(EQUALS_TO).value("Invoice").build();
Criterion dateCrit = CriterionBuilder.field(CREATION_DATE).operator(BETWEEN).type(TIMESTAMP)
.value(startDate).value(endDate).build();
FilterClause andClause = FilterClauseBuilder.and()
.criterion(classCrit).criterion(dateCrit).build();
Criterion dupontCrit = CriterionBuilder.name("B_ClientName").operator(EQUALS_TO).value("Dupont").build();
Criterion martinCrit = CriterionBuilder.name("B_ClientName").operator(EQUALS_TO).value("Martin").build();
FilterClause orClause = FilterClauseBuilder.or()
.filter(FilterClauseBuilder.and().criterion(dupontCrit).build())
.filter(FilterClauseBuilder.and().criterion(martinCrit).build())
.build();
SearchRequest request = SearchRequestBuilder.init()
.filter(andClause).filter(orClause).max(10).build();
SearchResponse response = documentService.search(request);
}
Rechercher d’autres types de composants
Le même modèle de recherche s’applique aux dossiers, tâches et dossiers virtuels — seul le endpoint change.
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
# Rechercher des dossiers de classe "Project"
curl -X POST "<CORE_HOST>/rest/folders/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "classid",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["Project"]
}
]
}
],
"max": 10
}'
# <CORE_HOST> URL de base de FlowerDocs Core
# <TOKEN> jeton d'authentification
# Rechercher des tâches assignées à un utilisateur
curl -X POST "<CORE_HOST>/rest/tasks/search" \
-H "token: <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"filterClauses": [
{
"criteria": [
{
"name": "assignee",
"operator": "EQUALS_TO",
"type": "STRING",
"values": ["jdoe"]
}
]
}
],
"max": 10
}'
Ces différents exemples peuvent être adaptés pour chaque catégorie de composant.