1
00:00:00,650 --> 00:00:02,350
Bonjour. Dans cette
séquence, je vais vous parler de

2
00:00:02,550 --> 00:00:04,520
Voyage qui est un wrapper
pour bases de données NoSQL.

3
00:00:05,900 --> 00:00:07,570
On va voir un petit peu
ce que c'est que Voyage.

4
00:00:08,330 --> 00:00:11,410
Là, l'objectif c'est de vous
permettre de créer une véritable application.

5
00:00:11,800 --> 00:00:16,310
Tiny blog, vous allez
pouvoir le stocker avec Voyage sur

6
00:00:16,510 --> 00:00:19,120
des bases de données Mongo et
le déployer sur un vrai service.

7
00:00:19,420 --> 00:00:20,920
L'idée, c'était de vous
montrer un petit peu aussi

8
00:00:21,280 --> 00:00:24,340
comment on peut sauver
facilement des objets, et on a

9
00:00:24,540 --> 00:00:27,320
choisi cette solution parce qu'elle
est vraiment super simple pour le cours.

10
00:00:28,940 --> 00:00:31,000
MongoDB, qu'est-ce
que c'est en fait?

11
00:00:31,200 --> 00:00:34,250
MongoDB, c'est les
nouvelles bases de données NoSQL qui

12
00:00:34,450 --> 00:00:38,340
sont orientées
documents. Vous avez un langage de

13
00:00:39,510 --> 00:00:42,220
requêtes dessous et c'est
une des plus populaires.

14
00:00:42,420 --> 00:00:44,420
Après, vous avez Couch DB et Riak.

15
00:00:44,840 --> 00:00:47,750
Là pour le moment, on
utilise MongoDB et Voyage.

16
00:00:48,350 --> 00:00:49,200
Qu'est-ce que Voyage ?

17
00:00:49,400 --> 00:00:51,010
En fait Voyage
finalement, c'est un mappeur qui va

18
00:00:51,210 --> 00:00:54,750
prendre des objets et les
mapper sur MongoDB et le faire

19
00:00:54,950 --> 00:00:56,370
quasiment automatiquement pour vous.

20
00:00:56,760 --> 00:01:00,260
Pour ceux qui ont fait du
Java en hibernate, Voyage, c'est

21
00:01:00,460 --> 00:01:03,750
l'équivalent de hibernate pour
MongoDB et bien sûr, c'est fait pour Pharo.

22
00:01:05,380 --> 00:01:07,550
Quelles sont les
fonctionnalités de Voyage?

23
00:01:07,750 --> 00:01:10,150
En fait, Voyage est très
simple, il va vous garantir l'identité

24
00:01:10,350 --> 00:01:12,470
de vos objets quand vous les sauvez
en base et que vous les rechargez.

25
00:01:13,030 --> 00:01:15,570
Il offre des capacités
de gérer des erreurs.

26
00:01:16,150 --> 00:01:20,470
Il y a aussi une pool de
connexion pour que ça aille plus

27
00:01:20,670 --> 00:01:23,080
vite en fait.

28
00:01:23,280 --> 00:01:25,120
Juste pour démarrer et
pour vous montrer, la première

29
00:01:25,320 --> 00:01:27,000
chose qu'on va faire,
c'est créer un repository Mongo

30
00:01:29,880 --> 00:01:31,520
avec ce genre d'expression.

31
00:01:32,320 --> 00:01:34,340
Là, c'est si vous voulez
accéder à votre base de données

32
00:01:34,590 --> 00:01:37,930
Mongo qui est gérée de
manière extérieure à Pharo.

33
00:01:38,320 --> 00:01:40,770
Maintenant ce qu'on fait
souvent quand on est en mode

34
00:01:41,000 --> 00:01:44,420
prototype, on va utiliser une
base de données Mongo en mémoire.

35
00:01:44,800 --> 00:01:47,000
Vous avez vu la différence, là
il y a Mongo memory repository.

36
00:01:48,090 --> 00:01:49,880
L'idée, c'est que vous
n'avez pas besoin d'une base de

37
00:01:50,080 --> 00:01:52,270
données Mongo, vous allez
prototyper votre application.

38
00:01:53,080 --> 00:01:56,080
Et quand finalement ça
fonctionne, vous allez pouvoir

39
00:01:56,550 --> 00:01:59,670
changer le memory
repository en un vrai repository et

40
00:01:59,870 --> 00:02:04,090
attaquer votre base extérieure,
donc c'est la bonne pratique à avoir.

41
00:02:06,180 --> 00:02:10,760
Pour illustrer Mongo, on
va faire un petit modèle

42
00:02:10,960 --> 00:02:14,370
objet qui est des super-héros qui ont
des super pouvoirs, avec des armures.

43
00:02:17,340 --> 00:02:19,450
Vous aurez un exercice,
vous pourrez le faire de toute

44
00:02:19,650 --> 00:02:21,590
façon, tout ce que je vous
montre pendant ce cours, vous

45
00:02:21,790 --> 00:02:23,260
aurez le support
pour pouvoir le faire.

46
00:02:23,730 --> 00:02:26,370
Et je vous suggère de le faire parce
que c'est marrant de scrypter Superman.

47
00:02:28,210 --> 00:02:32,330
On va regarder juste comment
fonctionne Héros et les supers pouvoirs.

48
00:02:33,730 --> 00:02:35,490
En gros, on a une classe Héros.

49
00:02:35,750 --> 00:02:39,310
Il a un nom, un niveau
et puis il a des pouvoirs.

50
00:02:40,190 --> 00:02:42,090
Le nom, j'ai un
accesseur avec le nom.

51
00:02:42,290 --> 00:02:44,000
J'ai un setter pour mettre son nom.

52
00:02:44,200 --> 00:02:45,690
J'ai un niveau pareil ici.

53
00:02:46,000 --> 00:02:48,130
Et les pouvoirs, je les
gère sous forme d'un ensemble.

54
00:02:48,330 --> 00:02:51,440
Donc là, je dis les
pouvoirs, au début si c'est vide je

55
00:02:51,640 --> 00:02:55,350
mets un ensemble, et quand
je peux ajouter un pouvoir, ça

56
00:02:55,610 --> 00:02:56,670
rajoute un pouvoir à l'ensemble.

57
00:02:56,870 --> 00:02:59,170
Donc, vraiment complètement basique.

58
00:03:00,820 --> 00:03:02,810
Et les pouvoirs,
qu'est-ce que c'est?

59
00:03:03,010 --> 00:03:07,880
Pour le moment, notre
pouvoir a juste un nom et on peut

60
00:03:08,080 --> 00:03:09,060
mettre ce nom ou pas.

61
00:03:10,310 --> 00:03:13,570
Maintenant, le point c'est
comment est-ce que je déclare

62
00:03:13,770 --> 00:03:17,480
que les classes de mon
domaine sont stockées en base?

63
00:03:17,680 --> 00:03:21,000
Là c'est l'idée de root class,
quels sont les points d'entrée

64
00:03:21,320 --> 00:03:23,270
qu'on va avoir dans
notre base de données?

65
00:03:23,470 --> 00:03:24,870
Ça peut être n'importe
quelle classe du système.

66
00:03:25,830 --> 00:03:26,850
Comment on va déclarer ça ?

67
00:03:27,050 --> 00:03:30,240
On doit déclarer ça avec une
méthode de classe, j'insiste

68
00:03:30,440 --> 00:03:32,090
sur le classe, une méthode de
 classe qui s'appelle isVoyageRoot.

69
00:03:32,290 --> 00:03:35,180
Comment on fait pour les héros ?

70
00:03:35,410 --> 00:03:38,560
C'est super débile, on va faire
héros classe isVoyage rend vrai.

71
00:03:39,390 --> 00:03:42,800
À partir de ce moment-là,
Voyage sait que je vais pouvoir

72
00:03:43,000 --> 00:03:45,680
stocker mes héros dans la base Mongo.

73
00:03:47,000 --> 00:03:50,420
Si on fait Spiderman,
Spiderman il s'appelle Spiderman,

74
00:03:50,620 --> 00:03:54,260
il est de niveau épique,
il a comme super pouvoir une

75
00:03:54,460 --> 00:03:59,150
super force, il peut monter
aux murs lui aussi et il a

76
00:03:59,420 --> 00:04:01,920
apparemment un instinct d'araignée.

77
00:04:02,500 --> 00:04:03,370
Et puis on en a un autre.

78
00:04:03,570 --> 00:04:08,420
Là vous voyez, je sauve,
save, ça indique à Voyage "OK,

79
00:04:08,620 --> 00:04:11,130
tu prends ce super héros et
tu le stockes dans ta base".

80
00:04:11,510 --> 00:04:13,930
Et de la même manière avec
Wolverine, vous avez compris

81
00:04:14,130 --> 00:04:16,460
qu'il a d'autres propriétés
et pareil, je peux sauver.

82
00:04:17,460 --> 00:04:20,260
Maintenant si je regarde
ma base Mongo, si je fais DB

83
00:04:20,460 --> 00:04:22,570
Hero find 0, qu'est-ce que je vois ?

84
00:04:22,870 --> 00:04:26,160
Je vois mon héros
Spiderman et qu'est-ce qu'il a?

85
00:04:26,360 --> 00:04:29,090
Alors là justement il faut
faire attention, on voit bien

86
00:04:29,290 --> 00:04:34,050
qu'il a son super pouvoir
qui est complètement décrit

87
00:04:34,360 --> 00:04:37,410
ici. Vous auriez pareil
avec Wolverine, et caetera.

88
00:04:37,790 --> 00:04:40,140
D'accord ?

89
00:04:40,340 --> 00:04:42,250
Une fois qu'on a fait ça
au niveau de Pharo, on peut

90
00:04:42,450 --> 00:04:44,830
faire des tas
d'expressions. Je ne vais pas aller dans

91
00:04:45,030 --> 00:04:48,180
les détails mais je peux
sélectionner tous les super-héros.

92
00:04:48,380 --> 00:04:51,240
Là, je vais avoir
Spiderman et Wolverine.

93
00:04:51,760 --> 00:04:54,830
Je peux dire que je veux trouver
le héros qui s'appelle Spiderman.

94
00:04:55,280 --> 00:04:59,670
Là, je peux dire moi je veux
trouver tous les super-héros

95
00:04:59,870 --> 00:05:00,750
qui ont comme level épique.

96
00:05:00,950 --> 00:05:04,930
Là, je vais
retrouver mes 2 super-héros.

97
00:05:06,620 --> 00:05:10,670
Maintenant, je vais
l'exprimer différemment parce qu'en

98
00:05:10,870 --> 00:05:14,390
fait, la base de données
Mongo comprend du json, donc je

99
00:05:14,590 --> 00:05:18,470
peux créer du json au vol et
l'injecter et faire une query à base de json.

100
00:05:18,670 --> 00:05:23,580
Là, j'aimerais
connaître le super-héros dont le

101
00:05:23,780 --> 00:05:25,670
nom est Spiderman mais
vous voyez que je l'ai exprimé

102
00:05:25,870 --> 00:05:29,930
sous-forme de Json, et en faisant as
directory ça me rend un dictionnaire.

103
00:05:30,730 --> 00:05:32,570
Je peux faire la même
chose pour select as many.

104
00:05:32,770 --> 00:05:35,700
Ça dépendra des query, il
y a des query qui sont plus

105
00:05:35,900 --> 00:05:38,050
faciles à exprimer sous
cette forme-là ou sous une autre,

106
00:05:38,250 --> 00:05:40,000
mais pour vous pour le
moment c'est du détail.

107
00:05:41,220 --> 00:05:44,000
On peut faire des query
qui sont bien plus avancées.

108
00:05:44,200 --> 00:05:48,930
Je peux dire "Je veux
sélectionner la plupart des

109
00:05:49,720 --> 00:05:52,750
super-héros qui ont un
niveau épique, dont le nom est

110
00:05:52,950 --> 00:05:55,870
trié dans un ordre ascendant
et je veux une limite de 10,

111
00:05:56,090 --> 00:06:00,270
et je veux commencer à la
page 0" pour pouvoir chercher

112
00:06:00,470 --> 00:06:01,720
des tranches dans ma base de données.

113
00:06:03,120 --> 00:06:05,040
Ça, quand vous en aurez
besoin vous regarderez la doc.

114
00:06:06,620 --> 00:06:07,890
On peut faire
d'autres opérations dessus.

115
00:06:08,090 --> 00:06:10,280
Je peux compter le nombre de
héros, déjà ça c'est super.

116
00:06:10,810 --> 00:06:14,020
Et puis, je peux compter ceux qui
satisfont une certaine propriété.

117
00:06:14,720 --> 00:06:16,820
Bien sûr, je peux enlever,
alors là si vous faites remove

118
00:06:17,020 --> 00:06:20,040
all, vous n'aurez plus d'objets
en base, il faut savoir assumer.

119
00:06:20,610 --> 00:06:23,520
Là, je peux dire "Je vais en
sélectionner un et puis je vais l'enlever.

120
00:06:23,720 --> 00:06:26,650
" Et j'aurai pu enlever mon
héros de ma base de données.

121
00:06:26,850 --> 00:06:30,740
Ce n'est que les opérations
qui font du sens, on va dire.

122
00:06:32,110 --> 00:06:34,630
Maintenant la question qui
se pose finalement quand vous

123
00:06:34,830 --> 00:06:38,690
allez utiliser MongoDB,
c'est "Qu'est-ce qu'on appelle

124
00:06:38,890 --> 00:06:41,330
une racine de base, et
quand est-ce qu'on définit une

125
00:06:41,530 --> 00:06:42,560
 classe comme une racine de base ?"

126
00:06:43,090 --> 00:06:45,900
On définit une classe comme
une racine de base quand on a

127
00:06:46,100 --> 00:06:46,860
besoin de faire des query.

128
00:06:47,060 --> 00:06:49,710
Ça, c'est la première règle:
je fais une query parce que

129
00:06:49,960 --> 00:06:52,130
je définis ma classe comme
une racine parce que je veux

130
00:06:52,330 --> 00:06:54,020
pouvoir accéder à tous
les objets de cette classe.

131
00:06:56,620 --> 00:07:00,380
L'autre point, c'est "Je
veux partager des objets entre

132
00:07:02,370 --> 00:07:05,130
mes objets. " Donc là par
exemple je veux partager des

133
00:07:05,330 --> 00:07:07,420
pouvoirs, parce que la
phrase n'est pas très claire, je

134
00:07:07,620 --> 00:07:10,190
veux partager des
pouvoirs entre mes héros.

135
00:07:11,850 --> 00:07:14,750
Dans ces cas-là, je vais
devoir définir "pouvoirs" comme

136
00:07:14,950 --> 00:07:16,480
une racine, donc on va voir ça.

137
00:07:18,100 --> 00:07:20,570
Si on regarde héros, c'est
bien une racine dans notre

138
00:07:20,770 --> 00:07:22,770
exemple, mais en fait les
pouvoirs ça pourrait être aussi

139
00:07:23,000 --> 00:07:24,190
des racines, il n'y
a pas de problème.

140
00:07:24,560 --> 00:07:28,310
Dans Voyage, on peut déclarer
n'importe quelle classe comme racine.

141
00:07:29,170 --> 00:07:31,790
Comment on fait ça ?

142
00:07:32,310 --> 00:07:34,350
Pareil que tout à l'heure,
je vais dire que ma classe

143
00:07:34,550 --> 00:07:39,450
power, c'est une
racine. Ça veut dire que

144
00:07:39,650 --> 00:07:43,500
si je crée le pouvoir fly
qui veut dire voler et que je

145
00:07:43,700 --> 00:07:47,590
le sauve, il sera mis en base;
la force surhumaine, c'est pareil.

146
00:07:48,090 --> 00:07:49,590
Et maintenant ce que je vais
faire, je vais pouvoir faire

147
00:07:49,790 --> 00:07:54,530
une query qui me dit "Je
veux récupérer le pouvoir

148
00:07:54,830 --> 00:07:59,120
de voler. Je veux aussi récupérer le
pouvoir d'avoir une force surhumaine.

149
00:07:59,320 --> 00:08:04,190
" Et là maintenant, je
recrée Superman en disant "J'

150
00:08:07,060 --> 00:08:08,630
ai récupéré ces 2 pouvoirs",
donc ça veut dire qu'il n'y

151
00:08:08,830 --> 00:08:10,460
en a qu'un dans le système à
chaque fois et je le sauve.

152
00:08:11,380 --> 00:08:13,190
Qu'est-ce qui se passe
au niveau de ma base?

153
00:08:13,600 --> 00:08:17,000
C'est important, il faut
faire un reset pour que ça

154
00:08:18,250 --> 00:08:19,910
fonctionne bien. En
général, à chaque fois que vous

155
00:08:20,110 --> 00:08:22,130
changez le schéma de base, il
faut faire cette expression.

156
00:08:22,530 --> 00:08:25,070
Mais ce qui m'intéresse
là, c'est de vous montrer que

157
00:08:26,180 --> 00:08:29,430
maintenant dans les pouvoirs
de Superman, je n'ai plus le

158
00:08:29,630 --> 00:08:33,870
pouvoir qui est décrit de
manière composée à l'intérieur,

159
00:08:34,070 --> 00:08:35,730
mais j'ai une
référence vers un pouvoir.

160
00:08:36,720 --> 00:08:38,000
Et là, je vais avoir
une autre référence.

161
00:08:38,160 --> 00:08:38,920
Donc qu'est-ce que ça veut dire ?

162
00:08:39,120 --> 00:08:41,130
Ça veut dire que si j'ai un
autre super-héros qui sait

163
00:08:41,330 --> 00:08:45,870
voler, je vais pouvoir
partager ce super pouvoir au lieu

164
00:08:46,070 --> 00:08:49,290
d'en avoir 2. Et ça, ça
dépend de votre domaine donc

165
00:08:49,490 --> 00:08:50,920
suivant le domaine et
suivant comment vous voulez

166
00:08:51,120 --> 00:08:54,230
modéliser votre domaine, vous allez
devoir définir des racines différentes.

167
00:08:54,430 --> 00:08:57,590
Là, c'est sur un exemple idiot mais
c'était pour vous donner l'intuition.

168
00:08:58,520 --> 00:09:02,860
Si je répète, vous allez
définir une racine du domaine si

169
00:09:03,060 --> 00:09:05,220
vous avez besoin de faire
des query, ou si vous voulez

170
00:09:05,420 --> 00:09:07,210
partager des objets de cette racine.

171
00:09:10,890 --> 00:09:14,180
Comment on exprime les
relations dans Voyage?

172
00:09:14,450 --> 00:09:16,100
En fait, c'est
l'équivalent des foreign keys dans les

173
00:09:16,300 --> 00:09:18,650
bases de données
relationnelles. Voyage va gérer

174
00:09:18,850 --> 00:09:21,360
automatiquement les
références cycliques entre vos racines.

175
00:09:21,870 --> 00:09:22,680
Vous n'avez rien à faire.

176
00:09:23,240 --> 00:09:25,580
Par contre, il faut faire
attention, Voyage ne gère pas

177
00:09:25,780 --> 00:09:28,350
les références cycliques
entre des objets qui seraient

178
00:09:28,550 --> 00:09:32,570
composés à l'intérieur. Vous
vous expérimenterez et puis

179
00:09:32,770 --> 00:09:34,220
vous verrez que la plupart
du temps quand vous avez des

180
00:09:34,420 --> 00:09:35,280
racines, vous n'avez aucun problème.

181
00:09:36,710 --> 00:09:39,070
Ce que je voulais vous
montrer dans ce cours, c'est qu'on

182
00:09:39,270 --> 00:09:43,360
peut très facilement sauver des
objets dans une base de données Mongo.

183
00:09:43,710 --> 00:09:46,550
Si vous voulez en savoir
plus, il y a aussi un chapitre

184
00:09:46,750 --> 00:09:48,730
dans Enterprise Pharo, ou
Web perspectives qui est dans

185
00:09:48,930 --> 00:09:51,720
les ressources du MOOC. Et
de toute façon, vous aurez un

186
00:09:51,920 --> 00:09:54,000
petit tutoriel qui vous
prendra par la main en vous

187
00:09:54,200 --> 00:09:58,130
faisant refaire les super-héros,
donc vous pourrez tout apprendre.

