On Wed, Jul 29, 2009 at 1:09 PM, Hannes <hannes.flo...@gmx.li> wrote:

>
> Hi Dave,
>
> Thanks for your answer and sorry for the late reply.
> > In the first "filter" line... do you just want to filter out the
> > LimitOrders that do not have the same tradeType foreign key reference
> > as the FK of the parameter that you pass in?
> Yes, that's part of the filtering, but I need to do more stuff.
> >
> > Can you post the model opens (the LimitOrder and the other stuff) as
> > well as the logic?
> I gonna do some more thinking about the logic, and paste the source later.
> >
> > For example,
> >
>  
> LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,remainingOrders(i).id)).map(_.status.set("OPEN"))
> > openOr 0L
> >
> > I'm not sure why you're doing a map and an openOr 0L... you're not
> > returning an expression.
> This was the only way I knew to do that......but probably the wrong
> one.....8-)


What's the "that" that you are trying to do?  If it's accessing something
inside a Box, you can use the foreach method on Box:

foreach(f: A => Unit): Unit

foreach takes a function that takes the type of the contents of the Box and
the result is discarded.

So, when you want to mutate (change) something, use foreach.  When you want
to calculate something (create a new Box based on the contents of the other
Box, use Map):

map[B](f: A => B): Box[B]





>
> >
> > Also, I'm not sure why you are loading an instance out of the RDBMS in
> > order to to set the status to "OPEN" and then just discard the
> > instance.  Does the set method on the status open have some side
> > effect that you've coded?
> It was the first approach to implement the logic and since I'm still not
> very close with Lift, some ugly code came out.
> >
> > If you want to load a bunch of records, update fields on those
> > records, and save the records, I'd like to suggest the following code:
> That's really helpful, I try to use that to get a better implementation!
> >
> > class Dog extends LongKeyedMapper[Dog] with IdPK {
> >   def getSingleton = Dog
> >
> >   object name extends MappedPoliteString(this, 128)
> >   object weight extends MappedInt(this)
> > }
> >
> > object Dog extends Dog with LongKeyedMetaMapper[Dog]
> >
> > class MyStuff extends LongKeyedMapper[MyStuff] with IdPK {
> >   def getSingleton = MyStuff
> >
> >   object info extends MappedString(this, 128)
> >   object count extends MappedInt(this)
> >   object dog extends MappedLongForeignKey(this, Dog)
> > }
> >
> >
> > object MyStuff extends MyStuff with LongKeyedMetaMapper[MyStuff] {
> >   def mutate(in: MyStuff) {
> >     for {
> >       // find all the items where info = 'NEW' and dog != the value of
> > in's dog field
> >       item <- MyStuff.findAll(By(MyStuff.info, "NEW"),
> > NotBy(MyStuff.dog, in.dog))
> >       // increment the count field, update the info field and save
> >     } item.count(item.count + 1).info("Not so NEW").save
> >   }
> > }
> >
> >
> thanks!
> >
> >
> > On Wed, Jul 22, 2009 at 4:05 PM, Hannes <hannes.flo...@gmx.li
> > <mailto:hannes.flo...@gmx.li>> wrote:
> >
> >
> >     I kind of found the problem. So far, it has nothing to do with save
> or
> >     anything like that. The problem is that this line:
> >
> >     val newOrders =
> LimitOrderMetaObj.findAll(By(LimitOrderMetaObj.status,
> >     "NEW")).toList.filter(o2 => o2.tradeType.name
> >     <http://o2.tradeType.name> != o1.tradeType.name
> >     <http://o1.tradeType.name>)
> >
> >     does not compare the "name" of the tradetype (TradeType has an own
> >     "name" field) in the filter method, instead "name" returns
> "tradetype"
> >     (is this the object name?). The thing is, because its a foreign key
> >     reference and as you told me, it needs to be accessed via
> >
> >     o.tradeType.obj.map(_.name.is <http://name.is>) openOr ""
> >
> >     But now, when I want to compare two of those TradeType.name field
> >     (which
> >     are normal strings) I don't really know how to do it. I tried
> >     something
> >     like that, but it doesn't work:
> >
> >     val newOrders =
> LimitOrderMetaObj.findAll(By(LimitOrderMetaObj.status,
> >     "NEW")).toList.filter(o2 => {o2.tradeType.obj.map(_.name.is
> >     <http://name.is>) openOr ""}
> >     != {o1.tradeType.obj.map(_.name.is <http://name.is>) openOr "")
> >
> >
> >     thanks.
> >
> >     > Howdy,
> >     >
> >     > You can save some memory by using findMap:
> >     >
> >     > def joinOrders(o1: LimitOrder): Unit = {
> >     >    /* select all orders where status=NEW and where that.tradeType
> !=
> >     > order1.tradeType */
> >     >    val newOrders =
> >     > LimitOrderMetaObj.findMap(By(LimitOrderMetaObj.status, "NEW")){o2
> =>
> >     > Full(o2).filter(o2.tradeType.name <http://o2.tradeType.name>
> >     <http://o2.tradetype.name/> !=
> >     > o1.tradeType.name <http://o1.tradeType.name>
> >     <http://o1.tradetype.name/>)}
> >     >
> >     > findMap applies the filtering operation as each row is pulled
> >     from the
> >     > RDBMS... so you'll have fewer objects in memory.
> >     >
> >     > In terms of the remaining logic... I'm a little lost in your
> code...
> >     > can you describe the logic?  What gets updated under which
> >     conditions?
> >     >
> >     >
> >     > On Wed, Jul 22, 2009 at 5:35 AM, Hannes <hannes.flo...@gmx.li
> >     <mailto:hannes.flo...@gmx.li>
> >     > <mailto:hannes.flo...@gmx.li <mailto:hannes.flo...@gmx.li>>>
> wrote:
> >     >
> >     >
> >     >     Hi Lifters,
> >     >
> >     >     It seems like I'm having problems to modify items that are
> >     already in
> >     >     the database. What I do is, first find the item, then set a new
> >     >     value to
> >     >     it and then save it. So far so good, or?
> >     >
> >     >     Because its a expensive filter process to find those items to
> >     >     modify, I
> >     >     made a local copy of the sub-list that contains the most
> >     interesting
> >     >     items. This sub-list is processed further on and when I
> >     finally know
> >     >     which items to modify, I look those ones up in the database
> >     again and
> >     >     set the values. I hope it makes sence...
> >     >
> >     >     thanks
> >     >
> >     >     Here's the code:
> >     >
> >     >     def joinOrders(o1: LimitOrder): Unit = {
> >     >        /* select all orders where status=NEW and where
> >     that.tradeType !=
> >     >     order1.tradeType */
> >     >        val newOrders =
> >     >     LimitOrderMetaObj.findAll(By(LimitOrderMetaObj.status,
> >     >     "NEW")).toList.filter(o2 => o2.tradeType.name
> >     <http://o2.tradeType.name>
> >     >     <http://o2.tradeType.name> != o1.tradeType.name
> >     <http://o1.tradeType.name>
> >     >     <http://o1.tradeType.name>)
> >     >
> >     >        def decideByTradeType: List[LimitOrder] = {
> >     >            /* keep all orders where that.marketPoint <=
> >     order1.marketPoint
> >     >             * sort the list from lowest to highest marketPoint */
> >     >            if (o1.tradeType.name <http://o1.tradeType.name>
> >     <http://o1.tradeType.name> == "BUY")
> >     >                newOrders.filter(o2 => o2.marketPoint.is
> >     <http://o2.marketPoint.is>
> >     >     <http://o2.marketPoint.is> <=
> >     >     o1.marketPoint.is <http://o1.marketPoint.is>
> >     <http://o1.marketPoint.is>).sort((s, t) =>
> >     >     s.marketPoint.is <http://s.marketPoint.is>
> >     <http://s.marketPoint.is> < t.marketPoint.is <
> http://t.marketPoint.is>
> >     >     <http://t.marketPoint.is>)
> >     >            /* keep all orders where that.marketPoint >=
> >     order1.marketPoint
> >     >             * sort the list from highest to lowest marketPoint */
> >     >            else //because there are only two different types!
> >     Its the same
> >     >     as: if (o1.tradeType.name <http://o1.tradeType.name>
> >     <http://o1.tradeType.name> == "SELL")
> >     >                newOrders.filter(o2 => o2.marketPoint.is
> >     <http://o2.marketPoint.is>
> >     >     <http://o2.marketPoint.is> >=
> >     >     o1.marketPoint.is <http://o1.marketPoint.is>
> >     <http://o1.marketPoint.is>).sort((s, t) =>
> >     >     s.marketPoint.is <http://s.marketPoint.is>
> >     <http://s.marketPoint.is> > t.marketPoint.is <
> http://t.marketPoint.is>
> >     >     <http://t.marketPoint.is>)
> >     >        }
> >     >
> >     >        var i = 0
> >     >        var done = false
> >     >        val remainingOrders = decideByTradeType
> >     >        while (i < remainingOrders.length && !done) {
> >     >            if (remainingOrders(i).lots == o1.lots) {
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     remainingOrders(i).id)).map(_.status.set("OPEN")) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     remainingOrders(i).id)).map(_.save) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id>
> >     <http://o1.id>)).map(_.status.set("OPEN")) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id> <http://o1.id>)).map(_.save) openOr 0L
> >     >                done = true
> >     >            }
> >     >            if (remainingOrders(i).lots.is <http://lots.is>
> >     <http://lots.is> <
> >     >     o1.lots.is <http://o1.lots.is> <http://o1.lots.is>) {
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     remainingOrders(i).id)).map(_.status.set("OPEN")) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     remainingOrders(i).id)).map(_.save) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id>
> >     <http://o1.id>)).map(_.lots.set(o1.lots.is <http://o1.lots.is>
> >     >     <http://o1.lots.is> - remainingOrders(i).lots.is
> >     <http://lots.is>
> >     >     <http://lots.is>)) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id> <http://o1.id>)).map(_.save) openOr 0L
> >     >            }
> >     >            if (remainingOrders(i).lots.is <http://lots.is>
> >     <http://lots.is> >
> >     >     o1.lots.is <http://o1.lots.is> <http://o1.lots.is>) {
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id>
> >     <http://o1.id>)).map(_.status.set("OPEN")) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     o1.id <http://o1.id> <http://o1.id>)).map(_.save) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >
> >     remainingOrders(i).id)).map(_.lots.set(remainingOrders(i).lots.is
> >     <http://lots.is>
> >     >     <http://lots.is> -
> >     >     o1.lots.is <http://o1.lots.is> <http://o1.lots.is>)) openOr 0L
> >     >                LimitOrderMetaObj.find(By(LimitOrderMetaObj.id,
> >     >     remainingOrders(i).id)).map(_.save) openOr 0L
> >     >                done = true
> >     >            }
> >     >            i = i + 1
> >     >        }
> >     >      }
> >     >
> >     >
> >     >
> >     >
> >     >
> >     > --
> >     > Lift, the simply functional web framework http://liftweb.net
> >     > Beginning Scala http://www.apress.com/book/view/1430219890
> >     > Follow me: http://twitter.com/dpp
> >     > Git some: http://github.com/dpp
> >     >
> >     > >
> >
> >
> >
> >
> >
> >
> > --
> > Lift, the simply functional web framework http://liftweb.net
> > Beginning Scala http://www.apress.com/book/view/1430219890
> > Follow me: http://twitter.com/dpp
> > Git some: http://github.com/dpp
> >
> > >
>
>
> >
>


-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp

--~--~---------~--~----~------------~-------~--~----~
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