forked from ahn-ens-lyon/basex-camp2014
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cr-coworking-2014-11-03
186 lines (118 loc) · 11.6 KB
/
cr-coworking-2014-11-03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# cr Coworking 03 novembre 2014
## Introduction sur la compagnie
Christian rappelle qu'il a débuté il y a neuf ans à produit à l'université avec les étudiants des classes java, utilisation xquery. Plus en plus de demande et de service commerciaux, raison pour laquelle ils ont mis sur pied une entreprise. Ce projet fut d'abord mis en œuvre avec Michael, Lucas, et Luke il y a deux ou trois ans. Actuellement la société BaseX GmbH emploie trois personnes à plein temps et trois personnes à temps partiel, la pluspart des salariés ayant réalisé précédemment des travaux de recherche universitaire sur le projet BaseX.
BaseX GmbH a d'abord pu profiter d'un dispositif permettant de constituer une entreprise à partir d'un projet universitaire. Cela a bien fonctionné la première année, puis il a ensuite été possible de constituer une société. Leur premier client a été un grand éditeur allemand. Depuis, la société s'est chargé de la construction de diverses applications web personnelles ou d'entreprises dans le domaine de l'édition. Elle dispose de nombreux clients en Allemagne, mais rapidement aussi en Europe avec Airbus, ou sur d'autres continents en Australie, ou au Canada. Toutefois, le marché n'est pas nécessairement très important pour les bases de données XML natives, si les technologies XML sont beaucoup employées, les utilisateurs ne connaissent pas toujours les langages ou les outils dédiés. Cependant ils ont été très surpris du niveau de connaissance de XML dans le domaine de l'édition en Allemagne.
Pour aborder l'organisation des projets qu'ils mettent en œuvre, Christian propose de nous présenter la structure d'un gros projet où ils utilisent JSON et AngularJS, avec des conversions réalisées à partir de XML en arrière-plan. Outre ces conversions, il y a également une couche supplémentaire pour valider les données. Il n'existe pas de mapping standardisé avec JSON, un format fixe.
Question sur JSON-LD http://json-ld.org, pas connaissance.
## Organisation des projets
L'équipe de BaseX n'emploie pas de structure fixe pour l'ensemble des projets, leur organisation varie en fonction de leur nature. Dans certains cas, elle utilise XForms, dans d'autres AngularJS. Mais de plus en plus, l'équipe a recourt à AngularJS, car si XForms est un projet attrayant, certaines choses élémentaires sont plus simples à réaliser avec AngularJS (comme pour les messages de formulaires). On confère alors habituellement la présentation au client, et côté serveur on traite plutôt les services REST.
Xforms used to prepare Html forms to the server
New logic =>
* Server side mostly for REST, data is prepared
* Client is for presentation with javascript
## Exemple de l'application Klett-rt
Un éditeur qui doit gérer une base iconographique importante avec des informations concernant les crédits et les copyrights : des millions d'entrées à administrer.
Affichage d'une notice d'image, avec formulaire : tout est réalisé en AngularJS avec Bootstrap pour le design.
L'application permet de sélectionner une image pour un livre donné. La vue de cet item présente des informations sur l'usage de l'image, les crédits, etc. Chaque référence peut contenir des crédits relatifs plusieurs sociétés d'auteurs différentes, il peut y avoir plusieurs bénéficiaires pour une image...
Différentes vues d'index (créditeurs, images)
Les données sont affichées en JSON
meta, data
Changing data model is possible with AngularJS
Restxq permet la création de l'équivalent de points d'entrée dans l'application pour les requêtes HTTP du serveur. Cela permet d'associer des fonctions ressources à des URI.
Un `fichier.xqm` qui traite le RESTXQ basique.
L'ensemble du code des fonctions appellées par les fonctions ressources RESTXQ est stocké dans `repo`
Les données sont stockées en XML, et chaque entrée dispose d'un élément meta avec un identifiant.
## Utilisation incrémentielle de deux bases de données
Une des particularités du projet et liée à la présence de deux bases de données. Une approche incrémentielle a été mise en place avec deux bases de données. La première est destinée aux données de stock, et l'autre aux données de travail :
- la première base sert pour l'interrogation (avec tous les index, pour permette la recherche full-text)
- la seconde s'occupe des nouvelles entrées
Un tel choix a paru nécessaire car il y avait des millions de données à gérer, sur lesquelles on devait pouvoir conduire des recherche plein texte, etc. et qu'il devait y avoir probablement 30 utilisateurs de saisie.
Chaque soir, les deux bases de données sont mergées. :
fonction data:get
Une fonction recherche
search:search, utilisation de map pour exact, fulltext, filter
Higher order function
Fonction search:match
Utilisation de la notation JSON `\.`
`if ($q-id) then map {`...
équivaent $q-id[.] ! map {...
si une chaîne non vide retourne true, si pas d'id une séquence vide
ft:tokenize()
normalisation des diacritiques et de la casse
Si une ou plusieurs entrées, alors rapporte un token pour chaque partie séparée par des espaces.
peut les compter avec count()
`count(ft:tokenize("test de tokenisation"))`
Réunion dans une même fonction complexe de plusieurs traitements pour simplifier les modifications.
Possibilités de produire des fonctions complexes de cette sorte qui explique probablement.
## Distinction .xqm et .xq
Lorsque l'on écrit des scripts simples, on peut leur donner l'extension `.xq`. Si dans le principe tout est module, le standard XQuery distingue les modules de bibliothèque et les modules principaux (`main`). Les modules de bibliothèque ne peuvent pas être évalués directement, en revanche ils fournissent des fonctions et des déclarations de variables qui peuvent être importées dans d'autres modules.
Le standard XQuery ne définissant pas d'extension, chaque processeur utilise ses propres extensions (.xquery, .xql, .xqy, etc.). Dans son ouvrage récent sur eXist publié chez O'Reilly, Adam Retter a décidé d'utiliser la même terminologie que BaseX (http://www.stylusstudio.com/xquerytalk/201301/004033.html)
Dans BaseX, on emploie les conventions suivantes pour l'extension :
- xq pour les modules principaux ('main')
- .xqm pour les modules qui font appel à d'autres modules y compris RESTXQ (modules de bibliothèque)
Les fichiers avec l'extension `.xqm` seront généralement destinés à contenir des fonctions, les scripts porteront habituellement l'extension `.xq`.
## Déployement
Le code de l'application qui nous est présentée est déployé avec [Maven](http://maven.apache.org).
Ici les différents répertoires sont compris dans un répertoire global pour l'application qui contient `public`, `repo`, `webapp` puis déclarés dans ".basex".
Les données sont stockées séparéemment des données web.
application
-- data/
-- media/
-- model/
-- public/
-- -- scripts/
-- -- -- controlers
-- -- -- filters
-- -- -- services
-- -- static/
-- -- target/
-- -- views/
-- -- WEB-INF/
-- -- index
-- repo/
-- webapp/
Structure probablement lié à AngularJS dans public/script
Correspond aux bonnes pratiques du processeur JS. Conceptuellement proche de XForms. Côté client un modèle de donné conforme à celui de XForms et lié à celui contenu dans la webapp. En changeant le modèle de données, modifie l'apparence du frontend comme avec XForms. Ici JavaScript avec les avantages de JS, sa large communauté, et ses fonctionnalités.
Cependant si doit éditer du contenu mixte avec contrôle complet, peut-etre intérêt à avoir TEI.
Pas les mêmes utilisations JS plus adapté pour le frontend et l'interactivité car mieux pris en charge par les navigateurs. En revanche, XForms bien adapté pour les interactions directes avec la base de données (plus proche des données).
Module Client http://docs.basex.org/wiki/Client_Module est un module qui sert à connecter une autre base de données depuis une un module.
Pour le moment, pas possible d'administrer une base distante par l'intermédiaire du client. Un client web est en cours de développement pour l'administration de la base de données.
Module xquery
Qui permet aussi de créer des requêtes XQuery sur la base depuis un module. Souvent très utile pour RESTXQ. De même, lorsque les problèmes de sécurité seront résolus, dans la version 8 il devrait être possible d'interrompre des requêtes en exécution côté serveur pour qu'ellles ne continuent pas à s'exécuter en arrière plan.
Inline function
optimisation
```xquery
declare function local:x() {
123
};
for $i in 1 to 10000
return 123
```
Champs du formulaires attachés dynamiquement aux fichiers XML
Utilisation d'un fichier de schema.
Définissent dans ce fichier plusieurs contraintes par l'intermédiaire d'attributs.
Déjà un module de validation. http://docs.basex.org/wiki/Validation_Module
Un Xquery qui boucle sur les entrées du schema et vérifie les contraintes.
Vont essayer d'étendre ce système avec RelaxNG.
nouvelles fonctions JSON
fn:parse-json('["A"]')
cf. http://docs.basex.org/wiki/XQuery_3.1
Pour le moment utilisateurs de la base de données, et utilisateurs implémentés en XQuery.
Une classe user: user:login, user:logout, etc.
utilisation hash et salt pour l'identification
Les utilisateurs enregistrés dans la base de données.
Séparation entre admin et utilisateurs de la base de données, mais envisagent d'unifier le système à l'avenir dans l'administration de la base de données.
La base des utilisateurs peut être mélangée avec les données ou bien dans une base de données dédiée.
Possibilité de branché une couche persistante pour mapper, etc. Toujours possible d'avoir dans une application des utilisateurs gérés dans un autre système (couchdb, mysql etc.).
id, name, log, salt
OpenAuth code écrit pour facebook, et google. Dès qu'auront des cas d'usage vont les implémenter, de même toujours possible d'implémenter Ldap.
https://github.com/apb2006/XQuery-OAuth (en partie MarkLogic)
Le fait de travailler avec des données XML peut présenter l'inconvénient de ne pas pouvoir disposer d'implémentation standardisées par exemple pour gérer les utilisateurs. Dans certains cas, des approches mixtes sont plus appropriées.
Pourraient être intéressés dans une généralisation de ces systèmes. Un des buts génériques de disposer d'un CMS pour XML. Une des difficultés actuellement consiste à puiser dans différents projets réalisés et généraliser les solutions. Depuis trois mois, pensent à la manière dont pourraient gérer sur l'ensemble des projets ces composants en généricisant.
Un système de gestion entièrement basé sur XForm, possible, l'avons traité avec succès avec ces technologies. Dans le second projet que nous venons de présenter, utilisation de AngularJS qui a permis de traiter nombreuses choses pas disponibles avec XForms ou seulement conceptuellement (upload de fichiers, etc. qui s'ils sont spécifiés ne sont pas réellement implémentés). Même si cela est une bonne chose conceptuellement, les fabriquants des principaux navigateurs se désengagent des technologies XML, on doit donc l'anticiper.
En réalité la véritable communauté de BaseX n'existe pas réellement au sens où pour le moment seulement des utilisateurs et des développeurs. Il y a des échanges mais plutôt entre développeurs de BaseX et eXist. Par exemple, comme le travail réalisé pour le module de fichiers.
Pour partage d'exemples
https://github.com/BaseXdb/basex-contrib
Une bonne manière de faire, à plus niveau par exemple
http://expath.org
Conceptuellement intéressant mais pour le moment trop centré sur une personne et n'a pas pris. Pas vraiment une grande communauté d'utilisateurs, donc important de bien réfléchir.