Petits problèmes de prise en main de Play

20 views
Skip to first unread message

David Sferruzza

unread,
Apr 14, 2014, 2:30:37 PM4/14/14
to nant...@googlegroups.com
Bonjour à tous !

En ce moment, j'essaie de prendre un peu en main Play Framework (en Scala).
Je rencontre quelques problèmes liés à Anorm, que j'aimerais bien résoudre de manière optimale.
(J'ai complété les 2 MOOCs sur Coursera qui parlent de Scala, donc j'ai quelques bases en Scala.)

1) Colonnes de type date, time et timestamp (ou autres)

Pour ces types de colonnes, je me demande quel est le type en Scala qui correspond le mieux (java.sql.Date pour date ?).
Je suis tombé sur ce fichier écrit par Clément : https://github.com/nantes-fp/tasks-play/blob/master/app/models/AnormType.scala
Est-ce que je me trompe si je dis que :
- il faut se baser un type défini dans une bibliothèque externe (org.joda.time.DateTime) pour timestamp
- il faut écrire les méthodes qui permettent de parser des bouts de réponse SQL vers des occurrences de ce type
- il faut le faire "à la main", ce n'est pas géré par une bibliothèque externe

2) Parser le résultat d'une jointure

Je me base sur l'exemple de Clément : https://github.com/nantes-fp/tasks-play/blob/master/app/models/Task.scala
On défini un objet (L15), un parser (L18), et une méthode getAll qui utilise tout ça (L32).
Déjà, je ne suis pas sûr de comprendre ce que représente la méthode * dans as(Task.simple.*) (L34).

Ensuite, j'ai l'impression qu'on défini un 2e parser (L28) qui combine le 1er parser (simple) avec le parser du modèle User.
Je ne suis pas sûr d'avoir bien compris ; est-ce qu'on pourrait utiliser ce 2e parser comme dans le code qui suit ?

def getAllWithCreator(): List[(Task, Option[User])] = {    // Je ne suis pas sûr du type de retour.
  DB.withConnection { implicit connection =>
    SQL("select * from task inner join user on user.id = task.creator_id").as(Task.withCreator.*)
  }
}

3) Notation

Qu'est-ce que c'est cette notation qu'on voit là ? https://github.com/nantes-fp/tasks-play/blob/master/app/models/Task.scala#L59
'truc c'est pareil que "truc" ?


J'espère que vous saurez m'éclairer.
Bonne soirée !

Clement Delafargue

unread,
Apr 14, 2014, 5:34:37 PM4/14/14
to nant...@googlegroups.com


Le 14 avr. 2014 20:30, "David Sferruzza" <david.s...@gmail.com> a écrit :
>
> Bonjour à tous !
>
> En ce moment, j'essaie de prendre un peu en main Play Framework (en Scala).
> Je rencontre quelques problèmes liés à Anorm, que j'aimerais bien résoudre de manière optimale.
> (J'ai complété les 2 MOOCs sur Coursera qui parlent de Scala, donc j'ai quelques bases en Scala.)
>
> 1) Colonnes de type date, time et timestamp (ou autres)
>
> Pour ces types de colonnes, je me demande quel est le type en Scala qui correspond le mieux (java.sql.Date pour date ?).

Dans le monde java on a tendance à utiliser joda time qui est plus simple et plus propre.


> Je suis tombé sur ce fichier écrit par Clément : https://github.com/nantes-fp/tasks-play/blob/master/app/models/AnormType.scala
> Est-ce que je me trompe si je dis que :
> - il faut se baser un type défini dans une bibliothèque externe (org.joda.time.DateTime) pour timestamp

En java/scala c'est le standard propre pour la gestion des dates


> - il faut écrire les méthodes qui permettent de parser des bouts de réponse SQL vers des occurrences de ce type

Anorm ne le gérant pas de base, il faut lui dire comment faire.


> - il faut le faire "à la main", ce n'est pas géré par une bibliothèque externe

C'est pas nativement géré par anorm


>
> 2) Parser le résultat d'une jointure
>
> Je me base sur l'exemple de Clément : https://github.com/nantes-fp/tasks-play/blob/master/app/models/Task.scala
> On défini un objet (L15), un parser (L18), et une méthode getAll qui utilise tout ça (L32).
> Déjà, je ne suis pas sûr de comprendre ce que représente la méthode * dans as(Task.simple.*) (L34).

C'est pour passer 0 ou plus lignes * a le même sens que dans une regex

>
> Ensuite, j'ai l'impression qu'on défini un 2e parser (L28) qui combine le 1er parser (simple) avec le parser du modèle User.

Oui les parsers se combinent


> Je ne suis pas sûr d'avoir bien compris ; est-ce qu'on pourrait utiliser ce 2e parser comme dans le code qui suit ?
>
> def getAllWithCreator(): List[(Task, Option[User])] = {    // Je ne suis pas sûr du type de retour.
>   DB.withConnection { implicit connection =>
>     SQL("select * from task inner join user on user.id = task.creator_id").as(Task.withCreator.*)
>   }
> }
>
> 3) Notation
>
> Qu'est-ce que c'est cette notation qu'on voit là ? https://github.com/nantes-fp/tasks-play/blob/master/app/models/Task.scala#L59
> 'truc c'est pareil que "truc" ?

On appelle ça un symbole, c'est des chaines de caractères indexées a la compilation


>
>
> J'espère que vous saurez m'éclairer.
> Bonne soirée !
>

> --
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Nantes FP".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse nantes-fp+...@googlegroups.com.
> Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse nant...@googlegroups.com.
> Visitez ce groupe à l'adresse http://groups.google.com/group/nantes-fp.
> Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Mog

unread,
Apr 14, 2014, 9:47:16 PM4/14/14
to nant...@googlegroups.com
On 04/15/2014 03:30 AM, David Sferruzza wrote:
> - il faut se baser un type défini dans une bibliothèque externe
> (org.joda.time.DateTime) pour timestamp

Oui si tu utilises Java < 8. Si tu utilises Java 8, tu peux directement
utiliser les classes de java.time.

David Sferruzza

unread,
Apr 16, 2014, 7:31:43 AM4/16/14
to nant...@googlegroups.com
Merci pour les conseils !
C'est dommage que Anorm ne gère pas ça alors que ça semble être un cas très courant.

J'utilise Java 7 pour l'instant, mais je retiens pour le jour où je changerai !


--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Nantes FP.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse nantes-fp+...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à nant...@googlegroups.com.

Visitez ce groupe à l'adresse http://groups.google.com/group/nantes-fp .
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Clement Delafargue

unread,
Apr 16, 2014, 7:32:44 AM4/16/14
to nant...@googlegroups.com

L'idée est de ne pas embarquer 50 dépendances non plus

David Sferruzza

unread,
Apr 16, 2014, 8:28:53 AM4/16/14
to nant...@googlegroups.com
Bien sûr, mais pour un cas courant, ça peut avoir du sens de faire un composant réutilisable plutôt que de réécrire le même comportement plein de fois.
J'imagine que c'est une volonté de Anorm de ne pas gérer ça pour rester générique (?)

Clement Delafargue

unread,
Apr 16, 2014, 8:34:04 AM4/16/14
to nant...@googlegroups.com

Oui. Après, grâce au mécanisme de typeclass c'est pas compliqué à étendre

Reply all
Reply to author
Forward
0 new messages