Naftoli,

As I said at the outset, this is really beyond my expertise. But I
think it's too
broad and maybe, even unnecessary. In my example, K can only be one
type,
Long, and T can only be of type User. Anything else, and the compiler
can't be
guaranteed to catch it, but try running the application and you get
things like
stack overflow errors.

How you would fix this is beyond me. All you can really do, at this
point, is
make sure to include these kinds of restrictions in the docs.

Glenn...

On Aug 6, 9:33 am, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
> It's too broad, or it's too restrictive/unnecessary? I'm confused, you seem
> to imply both.If it's too broad, tell me why. But if you want to know why it
> needs the type parameter, it's because it has to use the type parameter in
> its implentation -- just count how many times its source code uses it! And
> if you want to know why the compiler can't infer it or be told to infer
> it... that's another issue.
> But if passing a type that creates a conflicting inheritance causes a
> compiler crash, that's not something I can help. :)
> Regards.
>
> On Thu, Aug 6, 2009 at 12:26 PM, glenn <gl...@exmbly.com> wrote:
>
> > Naftoli,
>
> > At the risk of discussing something obviously beyond my pay grade,
> > isn't the real issue Scala traits
> > and the use of parameterized types. The ManyToMany trait is defined
> > as:
>
> > trait ManyToMany[K,T<:KeyedMapper[K, T]]....
>
> > But this isn't really correct,is it, the parameter is too broad, and
> > that leads to a lot of the confusion and results in the need for
> > unnecessary documentation. When you think about it, why all the
> > duplication? Why do I need to
> > write my User entity as:
>
> > class User extends MegaProtoUser[User] with ManyToMany[Long,User]
>
> > when we all know that this would be much cleaner:
>
> > class User extends MegaProtoUser[User] with ManyToMany.
>
> > But traits aren't like interfaces. They have implementation and would
> > need to know something about
> > the parent class they are attached to - and how would you accomplish
> > that (reflection, maybe). This is
> > more a Scala issue than a Lift one, I think.
>
> > Glenn...
>
> > On Aug 5, 8:24 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
> > > Building causes a stack overflow?
> > > So the question is, is it the resident compiler or plain scalac also
> > crashes? Or just the presentation compiler? What do you see in the error log
> > view or file?
> > > I get compiler crashes very often when doing fancy mapper type related
> > tricks.
>
> > > -------------------------------------
>
> > > glenn<gl...@exmbly.com> wrote:
>
> > > Naftoli,
>
> > > Hate to do this to you, but I'm getting the following error using
> > > ManyToMany for Users to Roles:
>
> > > Message: java.lang.RuntimeException: Broken join
> > >         scala.Predef$.error(Predef.scala:76)
>
> > net.liftweb.mapper.ManyToMany$MappedManyToMany$$anonfun$children$1$
> > > $anonfun$apply$1.apply(ManyToMany.scala:54)
>
> > net.liftweb.mapper.ManyToMany$MappedManyToMany$$anonfun$children$1$
> > > $anonfun$apply$1.apply(ManyToMany.scala:54)
> > >         net.liftweb.util.EmptyBox.openOr(Box.scala:372)
> > >         net.liftweb.mapper.ManyToMany$MappedManyToMany$$anonfun$children
> > > $1.apply(ManyToMany.scala:54)
> > >         net.liftweb.mapper.ManyToMany$MappedManyToMany$$anonfun$children
> > > $1.apply(ManyToMany.scala:54)
> > >         scala.List.map(List.scala:812)
> > >         net.liftweb.mapper.ManyToMany$MappedManyToMany.children
> > > (ManyToMany.scala:54)
> > >         net.liftweb.mapper.ManyToMany$MappedManyToMany.elements
> > > (ManyToMany.scala:96)
> > >         scala.Seq$class.flatMap(Seq.scala:293)
> > >         net.liftweb.mapper.ManyToMany$MappedManyToMany.flatMap
> > > (ManyToMany.scala:44)
>
> > >  def edit(ns: NodeSeq): NodeSeq = {
> > >     val theUser = view.entity
> > >     val addRole = TheBindParam("insert", view.snippet.link("edit", ()
> > > => theUser.roles += new Role, Text(S?("Add Role"))))
>
> > >     bind("user", ns,
> > >          "firstname" -> text(theUser.firstName.is, theUser.firstName
> > > (_), ("size","20")),
> > >          "lastname" -> text(theUser.lastName.is,theUser.lastName(_),
> > > ("size", "30")),
> > >          "roles" -> theUser.roles.flatMap{role =>
> > >               bind("role", ns,
> > >                   "name" -> role.name.toForm,
> > >                   "remove" -> SHtml.submit(S?("Remove"), ()=>
> > > theUser.roles -= role)
> > >               )
> > >           },
> > >          addRole,
> > >          "submit" -> SHtml.submit(S?("Save"), ()=>view.save)
> > >          )
> > >     }
>
> > > The offending code seems to be the line: "roles" ->
> > > theUser.roles.flatMap{....
> > > in the above bind method when I click on the addRole link.
>
> > > Here's my User class:
>
> > > class User extends MegaProtoUser[User] with ManyToMany[Long,User]{
> > >   def getSingleton = User // what's the "meta" server
>
> > >    object roles
> > >     extends MappedManyToMany(UserRole, UserRole.user, UserRole.role,
> > > Role)
>
> > > }
>
> > > What am I doing wrong? You can see how difficult it is to slog through
> > > this code, let alone just
> > > trying to explain the problem so I can get help.
>
> > > On Aug 5, 9:57 am, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
>
> > > > I'll try.
> > > > By the way, as per my correction, you can implement list the regular
> > way without ModelView, and just use ModelSnippet's load function in your
> > edit link or button, passing it the User instance.
>
> > > > -------------------------------------
>
> > > > glenn<gl...@exmbly.com> wrote:
>
> > > > Naftoli,
>
> > > > I fixed my code per your comments and now I can edit and remove users
> > > > from a list, as long as I populate the list with
> > > > ModelView instances, as you said. As for the docs, this step was not
> > > > clear to me at all. I just assumed that the list was
> > > > just populated with User entities and the view in the ModelSnippet was
> > > > instantiated with the selected User on each request.
>
> > > > It sounds like your plate is pretty full, so I won't expect much, but
> > > > sometime soon, could you provide an example, or improved
> > > > docs, for using TableEditor and its related ItemsList trait.
>
> > > > Thanks for all.
>
> > > > Glenn...
>
> > > > On Aug 5, 9:18 am, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
>
> > > > > Correction: ModelSnippet.load takes the actual Mapper instance, not
> > the ModelView wrapper.
>
> > > > > -------------------------------------
>
> > > > > Naftoli Gugenheim<naftoli...@gmail.com> wrote:
>
> > > > > To answer your immediate question, the listing should not refer to
> > the snippet's view but new ModelView instances for each entity. Then
> > editAction is shorthand for the snippet's link method with a callback to
> > call load on the ModelView. To set the snippet's view's entity, either call
> > load on the snippet with the other ModelView, or call load on the other
> > ModelView (or just set its entity directly).
> > > > > As far as documentation, please tell me what scaladocs need what
> > clarification. Thanks.
>
> > > > > -------------------------------------
>
> > > > > glenn<gl...@exmbly.com> wrote:
>
> > > > > Naftoli,
>
> > > > > Functional programming systems are notoriously difficult to document.
> > > > > The only way to really know what's going on is to meticulously trace
> > > > > through the source. But that requires
> > > > > time-consuming trial and error coding. So, without clear examples
> > > > > demonstrating exactly what you have in mind, I and others in the same
> > > > > boat, could spend days and still not
> > > > > get it right.
>
> > > > > For example, I tried this:
>
> > > > > var theUser:User = null
> > > > > val view = new ModelView(theUser, this)
>
> > > > >  def list(ns: NodeSeq): NodeSeq =  User.currentUser.map({user =>
> > > > >         User.findAll.flatMap({u =>
> > > > >             bind("user", chooseTemplate("user", "entry", ns),
> > > > >                  "firstname" -> Text(u.firstName.is),
> > > > >                  "lastname" -> Text(u.lastName.is),
> > > > >                  "email" -> Text(u.email.is),
> > > > >                  "roles" -> u.roles.map(_.name.toString).mkString(",
> > > > > "),
> > > > >                  view.editAction,
> > > > >                  view.removeAction
> > > > >                  )
> > > > >           })
> > > > >                         }) openOr Text("You're not logged in")
>
> > > > > and, I get a null value exception when I try to remove a user in the
> > > > > list. Simply using
> > > > > val view = new ModelView(new User, this), doesn't work either,
> > > > > although I don't get an
> > > > > exception. Now, where should I be calling load in all of this?
>
> > > > > Glenn...
>
> > > > > On Aug 3, 6:22 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote:
>
> > > > > > Your snippet should extend ModelSnippet (which extends
> > StatefulSnippet).
> > > > > > Then write:
> > > > > > val view = new ModelView(new User, this) {}
> > > > > > Calling load on another ModelView that references the snippet will
> > load its entity into that view val. It has a number of methods of possible
> > interest, like save which checks validity.
> > > > > > Also see Util.
> > > > > > Are you seeing the scaladocs?
>
> > > > > > -------------------------------------
>
> > > > > > glenn<gl...@exmbly.com> wrote:
>
> > > > > > Just to add to what I just wrote, I don't see how your ModelView
> > can
> > > > > > be applied to
> > > > > > User, which already extends a class, MegaProtoUser.  Maybe I'm not
> > > > > > comprehending this correctly.
>
> > > > > > Glenn...
>
> > > > > > On Aug 3, 3:48 pm, glenn <gl...@exmbly.com> wrote:
>
> > > > > > > Naftoli,
>
> > > > > > > Liked your OneToMany article, but not sure how the new
> > > > > > > ModelView and ModelSnippet code can be applied to ManyToMany.
> > > > > > > Can you provide a sample?
>
> > > > > > > Glenn...
>
> > > > > > > On Aug 2, 1:21 pm, Naftoli Gugenheim <naftoli...@gmail.com>
> > wrote:
>
> > > > > > > > I put an article on the wiki about OneToMany --
> >http://wiki.github.com/dpp/liftweb/how-to-work-with-one-to-many-relat...
> > > > > > > > .
>
> > > > > > > > On Sun, Aug 2, 2009 at 11:20 AM, Naftoli Gugenheim <
> > naftoli...@gmail.com>wrote:
>
> > > > > > > > > Glad to hear. Also see mapper.view.ItemsList (anyone have a
> > better name?),
> > > > > > > > > which is used byTableEditor. It's a similar idea without
> > relationships.
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to