On Feb 10, 6:59 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Feb 10, 2010, at 4:36 PM, Kent wrote:
>
> > Further, if I inspect the returned object *directly* after the call to
> > merge(), then aren't I guaranteed any Relations with use_list=True
> > have will have the same length, since that is the point of merge in
> > the first place?
>
> you can assume the lengths are the same.   I'm not sure though why you arent 
> using the attributes.get_history() function I showed you which would allow 
> you to see anything that changed directly.   seems a lot simpler than what 
> you're trying to do.
>


I am using this handy function, actually, and I could explain why, in
this case, I need more, but that is really a whole more discussion (in
short, the original object has some plain python attributes I need to
read which merge() does not copy for me because the are not mapper
properties, so I need a reference to the original object)

>
>
> > That being the case, I can always simply correspond the merged index
> > with the original instances, correct (regardless of whether it is a
> > newly created object or was get()'ed from the database)?
>
> > Correct?
>
> Yeah looking at the source its actually wholesale replacing the list on the 
> target object so its a direct copy.  I had the notion that it was appending 
> to the list but I was incorrect.
>
>

Thanks.

>
> > On Feb 10, 4:28 pm, Kent <k...@retailarchitects.com> wrote:
> >> Very good, thanks.
>
> >> Although, I'm pretty sure I understand what you are saying, what
> >> exactly do you mean by "pending/transients"?
>
> >> On Feb 10, 4:13 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> >>> On Feb 10, 2010, at 3:52 PM, Kent wrote:
>
> >>>> If I understand you correctly, you are saying
> >>>> object.list[0] will always cause creation (or fetch) of merged.list[0]
> >>>> object.list[1] will always cause creation (or fetch) of merged.list[1]
> >>>> etc.
>
> >>>> There may be also more merged.list[2], [3], etc...
>
> >>>> Correct?
>
> >>>> This is the merge code 0.5.8:
>
> >>>>        if self.uselist:
> >>>>            dest_list = []
> >>>>            for current in instances:
> >>>>                _recursive[(current, self)] = True
> >>>>                obj = session._merge(current, dont_load=dont_load,
> >>>> _recursive=_recursive)
> >>>>                if obj is not None:
> >>>>                    dest_list.append(obj)
> >>>>            if dont_load:
> >>>>                coll = attributes.init_collection(dest_state,
> >>>> self.key)
> >>>>                for c in dest_list:
> >>>>                    coll.append_without_event(c)
> >>>>            else:
> >>>>                getattr(dest.__class__,
> >>>> self.key).impl._set_iterable(dest_state, dest_dict, dest_list)
>
> >>>> Can I rely this implementation remaining ordered (deterministic), even
> >>>> if it is re-written for optimization purposes or something?
>
> >>> as long as you're using lists for your relations' collection 
> >>> implementations there's no reason the order of pending/transients would 
> >>> change.  The objects coming back from the DB are not deterministic unless 
> >>> you add order_by to your relation, but thats why i said process those 
> >>> separately.
>
> >>>> Also, I see that if obj is None, then dest_list.append() won't be
> >>>> called, which would mess up my indexes.  I am wondering is there a
> >>>> more sure mechanism?  Under what circumstances will obj be None?
>
> >>> There's no codepath I can see where that can be None and there's no test 
> >>> that generates a None at that point, I'm not really sure why that check 
> >>> is there.   I'd want to dig back to find its origins before removing it 
> >>> but _merge() pretty explicitly doesn't return None these days.
>
> >>>> On Feb 10, 3:30 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >>>>> On Feb 10, 2010, at 2:49 PM, Kent wrote:
>
> >>>>>> After merge() returns, is there a way for me to pair each object in
> >>>>>> the returned merge_obj with the object it was created from?
>
> >>>>>> For example:
> >>>>>> merged_obj = session.merge(object)
>
> >>>>>> At the top level, it is trivial, merged_obj was created because of the
> >>>>>> instance "object"
>
> >>>>>> For single RelationProperties under the top level, it is fairly
> >>>>>> simple, too.
>
> >>>>>> That is:
>
> >>>>>> merged.childattr was merged from object.childattr
>
> >>>>>> Where it falls apart I think is if the RelationProperty.use_list ==
> >>>>>> True
>
> >>>>>> merged.list came from object.list, but is there a way for me to
> >>>>>> reference the original objects inside the list.
>
> >>>>>> Did merged.list[0] come from object.list[0] or object.list[1] or
> >>>>>> object_list[2]?
>
> >>>>>> I particularly can't use the pk because it won't always be set (often
> >>>>>> this will be a new record)
>
> >>>>>> Any suggestions?
>
> >>>>> the ordering of those lists (assuming they are lists and not sets) are 
> >>>>> deterministic, especially with regards to the pending objects that have 
> >>>>> been added as a result of your merge (i.e. the ones that wont have 
> >>>>> complete primary keys).   I would match them up based on comparison of 
> >>>>> the list of instances that are transient/pending.
>
> >>>>>> --
> >>>>>> You received this message because you are subscribed to the Google 
> >>>>>> Groups "sqlalchemy" group.
> >>>>>> To post to this group, send email to sqlalch...@googlegroups.com.
> >>>>>> To unsubscribe from this group, send email to 
> >>>>>> sqlalchemy+unsubscr...@googlegroups.com.
> >>>>>> For more options, visit this group 
> >>>>>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> >>>> --
> >>>> You received this message because you are subscribed to the Google 
> >>>> Groups "sqlalchemy" group.
> >>>> To post to this group, send email to sqlalch...@googlegroups.com.
> >>>> To unsubscribe from this group, send email to 
> >>>> sqlalchemy+unsubscr...@googlegroups.com.
> >>>> For more options, visit this group 
> >>>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalch...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to