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.