Re: Tree rest resource and sorting

David Steinberger <[email protected]>
Newsgroups gmane.comp.web.gallery.devel
Organization FH - KufsteinTirol
Message-ID <[email protected]>
Gentlemen,

That issue should be solved. Blake from/Two Toasters/// pushed 2 changes 
that allow us to preserve the order of the tree.

Commits:
https://github.com/twotoasters/RestKit/commit/0949337749e3152c87ab32743f07c8cc5910575c
https://github.com/twotoasters/RestKit/commit/851df3bcbaa624a3845a5447eb391167d347043c

I used it in my app in the following way:
I added a category on the model that injects the index when it's dealing 
with the tree object.
Need to do some more testing, but looks solid.

@implementation RKObjectLoaderTTModel (positionInAlbum)


#pragma mark RKModelLoaderDelegate

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id 
*)mappableData {
      if (loader.objectMapping.objectClass == [RKMTree class]) {
          NSArray* origEntities = [*mappableData 
valueForKeyPath:@"entity"];
          NSMutableArray* newEntity = [[NSMutableArray alloc] 
initWithCapacity:[origEntities count]];

          int i = 0;
          for (NSDictionary* origEntity in origEntities) {
              NSMutableDictionary* oneEntity = [origEntity mutableCopy];

              // inject the position in the array
              NSMutableDictionary* entity = ([(NSDictionary*)[oneEntity 
objectForKey:@"entity"] mutableCopy]);
              [entity setObject:[NSString stringWithFormat:@"%i", i] 
forKey:@"positionInAlbum"];

              [oneEntity removeObjectForKey:@"entity"];
              [oneEntity setObject:entity forKey:@"entity"];

              [newEntity addObject:oneEntity];
              [oneEntity release];
              [entity release];
              i++;
          }

          [*mappableData removeObjectForKey:@"entity"];
          [*mappableData setObject:newEntity forKey:@"entity"];
          [newEntity release];
      }
  }


@end


**On 6/28/11 7:04 AM, Bharat Mediratta wrote:
>
> On Mon, Jun 27, 2011 at 4:06 AM, David Steinberger 
> <[email protected] <mailto:[email protected]>> wrote:
>
>     Can u add me to the list of frustrated users?
>     When, after weeks of waiting, someone suggests a module as THE
>     solution ... well, that hurts too.
>     K, let's not get stuck here.
>
>
> Yes, I think that's totally fair.  I don't think that it's appropriate 
> to do this in a module :-/
>
>
>     I have my objections against the injection of elements into the
>     payload but it's worth spending some time on.
>     I'll sit down tonight and give it a try.
>
>
> Thanks.  If that doesn't pan out, I promise you I'll sit down and 
> write the code to inject it on the G3 side and we'll all move on.
>
>
>     -------- Original-Nachricht --------
>     > Datum: Sun, 26 Jun 2011 22:12:12 -0700
>     > Von: Bharat Mediratta <[email protected]
>     <mailto:[email protected]>>
>     > An: David Steinberger <[email protected]
>     <mailto:[email protected]>>
>     > CC: [email protected]
>     <mailto:[email protected]>
>     > Betreff: Re: [Gallery-devel] Tree rest resource and sorting
>
>     > On Sun, Jun 26, 2011 at 2:39 PM, David Steinberger
>     > <[email protected] <mailto:[email protected]>>wrote:
>     >
>     > > **
>     > >
>     > >  Regarding injection of order field:
>     > > AFAIK it's not possible. We can register a delegate (see
>     > RKObjectMapper.m)
>     > > and get notified before the mapping operation begins, but RK
>     continues
>     > to
>     > > map in the background.
>     > > So long story short:  Haven't found a good possibility for that.
>     > >
>     >
>     > Ok, so I see at
>     >
>     https://github.com/twotoasters/RestKit/blob/master/Code/ObjectMapping/RKObjectMapper.m#L208that
>     > it makes a call to
>     > objectMapperWillBeginMapping:self on the delegate. I don't fully
>     > understand
>     > the model there, but isn't that synchronous? It seems like at
>     that point
>     > we
>     > could grab the sourceObject and do a traversal.
>     >
>     >
>     > > My main objection here is that this manipulation is a heavy
>     operation
>     > for
>     > > the client.
>     > > So I think the query param would be best (but cannot really
>     judge how
>     > much
>     > > effort this is on gallery3 side).
>     > >
>     >
>     > Is it that expensive?  To update tree_rest it's an O(N)
>     operation across
>     > an
>     > ordered list, right?  I'd have to spend a lot more time with the
>     code than
>     > I
>     > have.
>     >
>     > My (and Tim's) frustration with this is that this limitation in
>     the iOS
>     > code
>     > is really bone-headed.  It's frustrating for us to have to work
>     around it
>     > on
>     > the server side when it makes no sense at all to me that they
>     would make
>     > this design decision.  We pass down an ordered list and the
>     library stores
>     > it in an unordered fashion -- they're throwing out relevant
>     data.  Putting
>     > the data back in again is doable, but I feel like we're going to
>     have to
>     > repeat this exercise over and over again until they fix their
>     API.  Sorry
>     > that this is dragging on so long, but I'm sure there is *some*
>     alternative
>     > here.
>     >
>     >
>     > >
>     > > FYI: The tutorial is way outdated, so don't rely on that. Get
>     their
>     > source
>     > > from Github (https://github.com/twotoasters/RestKit) and check the
>     > > examples inside. The handling is now much easier than back in Feb.
>     > RestKit
>     > > rulez :)!
>     > >
>     > >  On 6/26/11 9:09 PM, Bharat Mediratta wrote:
>     > >
>     > >
>     > >  Ok, so the problem so far are:
>     > > 1) If we don't provide ordering, the iOS client won't work
>     properly
>     > > 2) If we provide ordering in the core app it breaks our
>     abstractions
>     > >  3) If we provide ordering in a 3rd party module then it'll be
>     a pain
>     > and
>     > > we'll lose users
>     > >
>     > >  I suspect that doing #2 with a query param is the way to go.
>      But I've
>     > > been looking at the RestKit code and docs, specifically
>     > > http://mobile.tutsplus.com/tutorials/iphone/restkit_ios-sdk/
>     -- what I'm
>     > > trying to figure out is if we can intercept the JSON response
>     on that
>     > side
>     > > and inject the order field in the client, then parse the JSON.
>      If we
>     > could
>     > > do that, it would solve all problems.  David, is that doable?
>     > >
>     > > On Sun, Jun 26, 2011 at 12:34 AM, David Steinberger
>     > <[email protected] <mailto:[email protected]>>wrote:
>     > >
>     > >>
>     > >>  I really don't think this should go into a module. Reasons:
>     > >>
>     > >>    - We'd replicate existing functionality (heavily).
>     > >>    - From a mobile client we always have to check that the
>     module is
>     > >>    installed, if not have to tell the user to contact an
>     admin for that
>     > ...
>     > >>    this needs to work out of the box
>     > >>    - Regarding *Apple*: So far it's vendor specific. But we
>     might ran
>     > >>    into this on other platforms as well.
>     > >>    We just don't know this as of now.
>     > >>
>     > >> How about adding this as a query parameter?
>     > >> So those who need it will get it, those who don't will get
>     the same as
>     > of
>     > >> today?
>     > >>
>     > >>   On 6/26/11 4:32 AM, Tim Almdal wrote:
>     > >>
>     > >> God forbid, we add this to every entity... I'm opposed to
>     adding custom
>     > >> anything to make something work for one vendor...  Add it as
>     a module
>     > and
>     > >> then stuff it into -contrib, so those of us that never use
>     Apple don't
>     > have
>     > >> to carry this baggage around.
>     > >>
>     > >> On 6/25/2011 11:45 AM, David Steinberger wrote:
>     > >>
>     > >>
>     > >> Yeah you're right: My patch is not sufficient. If we could
>     add this to
>     > >> every entity that would be much better.
>     > >>
>     > >> The reason why I pushed so hard for tree_rest was that here a
>     missing
>     > >> sorting attribute *destroys* the whole concept of core data.
>     I have *
>     > >> Entity* modeled as a core data entity and relate it to the
>     item entity
>     > as
>     > >> well as to the tree-entity. However when I retrieved the tree
>     entity
>     > the
>     > >> sorting was gone.
>     > >>
>     > >> Quick question: I realized that my sorting attribute has
>     another issue.
>     > I
>     > >> just gave the *parent* an id of -1.
>     > >> But an album can also be seen as a member of a parent-album at a
>     > specific
>     > >> index. So my sorting attribute change. How could this be
>     prevented
>     > (although
>     > >> that's not a deal breaker for me)?
>     > >>
>     > >>  On 6/25/11 8:31 PM, Bharat Mediratta wrote:
>     > >>
>     > >>
>     > >>  Ok, I'm convinced that Apple needs this.  :-)  But won't
>     your patch be
>     > >> somewhat insufficient?  From my reading, you're going to have
>     this
>     > problem
>     > >> with any ordered list that we send back, right?  Instead of
>     putting
>     > this
>     > >> into tree_rest, would it make sense to add a new query param like
>     > >> "add_indexes" and then have rest::reply walk the entire
>     structure it's
>     > about
>     > >> to return and add an "_index" field to every entity in every
>     list that
>     > it
>     > >> finds?  I could probably bang that out pretty quickly, if you
>     think
>     > that
>     > >> there's a need for it beyond tree_rest.
>     > >>
>     > >> On Mon, Jun 6, 2011 at 9:40 AM, David Steinberger
>     > <[email protected] <mailto:[email protected]>>wrote:
>     > >>
>     > >>> Best doc is the one from Apple:
>     > >>>
>     > >>>
>     >
>     http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFAQ.html#//apple_ref/doc/uid/TP40001802-CJBDBHCB
>     > >>>
>     > >>> See 'How do I fetch objects in the same order I created
>     them?' about
>     > >>> collections and core data.
>     > >>>
>     > >>> I'm using core data 90% via RestKit:
>     > >>> https://github.com/twotoasters/RestKit
>     > >>>
>     > >>> If you want checkout the example 'RKTwitterCoreData' to see
>     how it
>     > works
>     > >>> (branch 67-object-mapping-2.0).
>     > >>> I can also send a mockup how I mapped gallery3 json
>     responses (tree &
>     > >>> item).
>     > >>>
>     > >>> -------- Original-Nachricht --------
>     > >>> > Datum: Sun, 5 Jun 2011 16:44:49 -0700
>     > >>> > Von: Bharat Mediratta <[email protected]
>     <mailto:[email protected]>>
>     > >>> > An: David Steinberger <[email protected]
>     <mailto:[email protected]>>
>     > >>> > CC: [email protected]
>     <mailto:[email protected]>
>     > >>> > Betreff: Re: [Gallery-devel] Tree rest resource and sorting
>     > >>>
>     > >>> > On Sun, Jun 5, 2011 at 3:44 PM, David Steinberger
>     > >>> > <[email protected] <mailto:[email protected]>>wrote:
>     > >>> >
>     > >>> > >
>     > >>> > > Right after I sent the message I realized that I'd be
>     beaten up by
>     > >>> that.
>     > >>> > >
>     > >>> > > So let me give details: Core Data doesn't store NSArray, but
>     > NSSet:
>     > >>> > >
>     > >>> > >
>     > >>> >
>     > >>>
>     >
>     http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html
>     > >>> > >
>     > >>> > > Yes it's platform specific. but right now iOS is the
>     most common
>     > one.
>     > >>> > > Core Data is the best way to serialize objects (IMHO)
>     and I really
>     > >>> want
>     > >>> > to
>     > >>> > > use it.
>     > >>> > >
>     > >>> >
>     > >>> > Ok.  I'm reading through the Core Data docs, but I'm new
>     to it and
>     > >>> there
>     > >>> > are
>     > >>> > a ton of docs out there.  Can you point me at relevant
>     docs that
>     > talk
>     > >>> > about
>     > >>> > how Core Data does its underlying storage?
>     > >>> >
>     > >>> > I assume that at some point you're going to coerce the
>     NSSet into an
>     > >>> > NSArray
>     > >>> > by applying a sort order over the given field.  But it's a
>     little
>     > >>> > surprising
>     > >>> > that the initial ordering isn't preserved somewhere...
>     > >>> >
>     > >>> >
>     > >>> > >
>     > >>> > > Why should it be wrong to indicate the sort by an attribute?
>     > >>> > > It doesn't impact the server-side at all.
>     > >>> > >
>     > >>> >
>     > >>> > But it doesn't belong on the server side, either.  We're
>     already
>     > >>> sending
>     > >>> > an
>     > >>> > ordered list -- adding an ordering field is redundant.
>      This is
>     > really
>     > >>> a
>     > >>> > limitation on the client side and it should be fixed
>     there.  Yes,
>     > I'm
>     > >>> > being
>     > >>> > a bit of a purist but I hate crapping up our APIs to
>     handle edge
>     > cases.
>     > >>> > If
>     > >>> > this is the only way to do it, I'll be grumpy but I'll
>     fiddle with
>     > the
>     > >>> > server side code.  But I'd like to be convinced that there
>      isn't
>     > some
>     > >>> way
>     > >>> > to do it in Core Data.  Surely this must be a common use case.
>     > >>> >
>     > >>> >
>     > >>> > >
>     > >>> > >
>     > >>> > > On 6/6/11 12:16 AM, Bharat Mediratta wrote:
>     > >>> > >
>     > >>> > >
>     > >>> > >  Hm.  An array is an ordered list, and I would expect
>     NSArray to
>     > >>> > maintain
>     > >>> > > the ordering --
>     > >>> > >
>     > >>> >
>     > >>>
>     >
>     http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.htmlseems
>     > >>> > > to bear that out.  Are you seeing it lose the ordering?
>     > >>> > >
>     > >>> > >  Even if it was, I'd expect that this is a platform specific
>     > problem
>     > >>> so
>     > >>> > > I'd expect it'd be something you'd fix on your side by
>     updating
>     > the
>     > >>> > entity
>     > >>> > > after you load it.  Doing it on the server side smells
>     wrong to
>     > me.
>     > >>> > >
>     > >>> > >  Thoughts?
>     > >>> > >
>     > >>> > > On Wed, Jun 1, 2011 at 10:55 AM, David Steinberger
>     > >>> > <[email protected] <mailto:[email protected]>>wrote:
>     > >>> > >
>     > >>> > >>  Team,
>     > >>> > >>
>     > >>> > >> I'm reworking the data model of my iPhone app.
>     > >>> > >> One thing I want to revisit is how I deal with the tree
>     rest
>     > >>> resource
>     > >>> > >> (tree_rest.php).
>     > >>> > >>
>     > >>> > >> Reason:
>     > >>> > >> I know that the tree_rest.php delivers the objects in
>     the right
>     > >>> order,
>     > >>> > but
>     > >>> > >> this doesn't help me much.
>     > >>> > >> I need to store and retrieve the array and by doing such an
>     > >>> operation
>     > >>> > with
>     > >>> > >> an array the order might be lost.
>     > >>> > >>
>     > >>> > >> Proposed solution:
>     > >>> > >> The patch attached adds a relative_position attribute
>     to each
>     > >>> entity.
>     > >>> > Via
>     > >>> > >> this attribute the entity order can be reconstructed at
>     any time.
>     > >>> > There's no
>     > >>> > >> impact on performance and overall structure.
>     > >>> > >>
>     > >>> > >> Please review and merge to master or propose something even
>     > better.
>     > >>> > >>
>     > >>> > >> Thanks,
>     > >>> > >>   David
>     > >>> > >>
>     > >>> > >> ---
>     > >>> > >>
>     > >>> > >> FYI Details:
>     > >>> > >> I use core data to cache all objects (tree/album,
>     items, tags,
>     > ...).
>     > >>> > Core
>     > >>> > >> data is kind of a database for objects on iOS. The tree is
>     > modeled
>     > >>> via
>     > >>> > a
>     > >>> > >> Class that has a NSString property that holds the url
>     (that's the
>     > >>> > primary
>     > >>> > >> key) and a NSArray that holds all the entities.
>     > >>> > >> But when I retrieve the object-graph iOS applies any
>     sorting. ==>
>     > A
>     > >>> > >> sort-attribute is needed.
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> > >>
>     > >>> >
>     > >>>
>     >
>     ------------------------------------------------------------------------------
>     > >>> > >> Simplify data backup and recovery for your virtual
>     environment
>     > with
>     > >>> > >> vRanger.
>     > >>> > >> Installation's a snap, and flexible recovery options
>     mean your
>     > data
>     > >>> is
>     > >>> > >> safe,
>     > >>> > >> secure and there when you need it. Data protection magic?
>     > >>> > >> Nope - It's vRanger. Get your free trial download today.
>     > >>> > >> http://p.sf.net/sfu/quest-sfdev2dev
>     > >>> > >> __[ g a l l e r y - d e v e l ]_________________________
>     > >>> > >>
>     > >>> > >> [ list info/archive --> http://gallery.sf.net/lists.php ]
>     > >>> > >> [ gallery info/FAQ/download --> http://gallery.sf.net ]
>     > >>> > >>
>     > >>> > >
>     > >>> > >
>     > >>>
>     > >>>  --
>     > >>> NEU: FreePhone - kostenlos mobil telefonieren!
>     > >>> Jetzt informieren: http://www.gmx.net/de/go/freephone
>     > >>>
>     > >>>
>     > >>
>     > >>
>     >
>     ------------------------------------------------------------------------------
>     > >> All the data continuously generated in your IT infrastructure
>     contains
>     > a
>     > >> definitive record of customers, application performance, security
>     > >> threats, fraudulent activity and more. Splunk takes this data
>     and makes
>     > >> sense of it. Business sense. IT sense. Common sense..
>     > http://p.sf.net/sfu/splunk-d2d-c1
>     > >>
>     > >>
>     > >> __[ g a l l e r y - d e v e l ]_________________________
>     > >>
>     > >> [ list info/archive --> http://gallery.sf.net/lists.php ]
>     > >> [ gallery info/FAQ/download --> http://gallery.sf.net ]
>     > >>
>     > >>
>     > >>
>     > >> No virus found in this message.
>     > >> Checked by AVG - www.avg.com <http://www.avg.com>
>     > >> Version: 10.0.1388 / Virus Database: 1513/3726 - Release
>     Date: 06/25/11
>     > >>
>     > >>
>     > >>
>     >
>     ------------------------------------------------------------------------------
>     > >> All the data continuously generated in your IT infrastructure
>     contains
>     > a
>     > >> definitive record of customers, application performance, security
>     > >> threats, fraudulent activity and more. Splunk takes this data
>     and makes
>     > >> sense of it. Business sense. IT sense. Common sense..
>     > http://p.sf.net/sfu/splunk-d2d-c1
>     > >>
>     > >>
>     > >> __[ g a l l e r y - d e v e l ]_________________________
>     > >>
>     > >> [ list info/archive --> http://gallery.sf.net/lists.php ]
>     > >> [ gallery info/FAQ/download --> http://gallery.sf.net ]
>     > >>
>     > >>
>     > >>
>     > >>
>     >
>     ------------------------------------------------------------------------------
>     > >> All of the data generated in your IT infrastructure is seriously
>     > valuable.
>     > >> Why? It contains a definitive record of application performance,
>     > security
>     > >> threats, fraudulent activity, and more. Splunk takes this
>     data and
>     > makes
>     > >> sense of it. IT sense. And common sense.
>     > >> http://p.sf.net/sfu/splunk-d2d-c2
>     > >> __[ g a l l e r y - d e v e l ]_________________________
>     > >>
>     > >> [ list info/archive --> http://gallery.sf.net/lists.php ]
>     > >> [ gallery info/FAQ/download --> http://gallery.sf.net ]
>     > >>
>     > >
>     > >
>
>     --
>     NEU: FreePhone - kostenlos mobil telefonieren!
>     Jetzt informieren: http://www.gmx.net/de/go/freephone
>
>     ------------------------------------------------------------------------------
>     All of the data generated in your IT infrastructure is seriously
>     valuable.
>     Why? It contains a definitive record of application performance,
>     security
>     threats, fraudulent activity, and more. Splunk takes this data and
>     makes
>     sense of it. IT sense. And common sense.
>     http://p.sf.net/sfu/splunk-d2d-c2
>     __[ g a l l e r y - d e v e l ]_________________________
>
>     [ list info/archive --> http://gallery.sf.net/lists.php ]
>     [ gallery info/FAQ/download --> http://gallery.sf.net ]
>
>
>
> ------------------------------------------------------------------------------
> All of the data generated in your IT infrastructure is seriously valuable.
> Why? It contains a definitive record of application performance, security
> threats, fraudulent activity, and more. Splunk takes this data and makes
> sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-d2d-c2
>
>
> __[ g a l l e r y - d e v e l ]_________________________
>
> [ list info/archive -->  http://gallery.sf.net/lists.php ]
> [ gallery info/FAQ/download -->  http://gallery.sf.net ]

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2

__[ g a l l e r y - d e v e l ]_________________________

[ list info/archive --> http://gallery.sf.net/lists.php ]
[ gallery info/FAQ/download --> http://gallery.sf.net ]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.