The problem is speed. I believe the getitem should be as fast as possible. This 
was changed before so that the trasformation of the rows occurred only once and 
not every time a row column is accessed.

On Jan 8, 2014, at 8:41 AM, Anthony wrote:

> Let's discuss on the developers list.
> 
> On Tuesday, January 7, 2014 9:52:16 PM UTC-5, Joe Barnhart wrote:
> Maybe the best answer is to change Row so that it always holds the full set 
> of keys (table:field) and change the __getitem__ method to look up the key 
> recursively if only one part is provided.  Here is a sample method which 
> implements this strategy of testing keys for dicts within dicts.  Our case is 
> a little simpler since we never "recurse" more than one level deep.
> 
> def _finditem(obj, key):
>     if key in obj: return obj[key]
>     for k, v in obj.items():
>         if isinstance(v,dict):
>             item = _finditem(v, key)
>             if item is not None:
>                 return item
> 
> This has the advantage of working with existing code and preserving as much 
> information as possible in the Row object.  I have a feeling this could make 
> the internals of web2py a good deal more consistent.  Less testing for 
> special cases is always good!
> 
> -- Joe B.
> 
> On Tuesday, January 7, 2014 3:48:39 PM UTC-8, Anthony wrote:
> Note, same problem with .sort (it modifies the Row objects in self.records), 
> so we should probably fix that as well (will be a bit more complicated).
> 
> Anthony
> 
> On Tuesday, January 7, 2014 11:03:56 AM UTC-5, Anthony wrote:
> The Rows.find() method does the following:
> 
>         for row in self:
>             if f(row):
>                 if a<=k: records.append(row)
>                 k += 1
>                 if k==b: break
> 
> In a Rows object, there is self.records, which is a list of Row objects. Each 
> Row object has at least one top-level key with the table name, and the record 
> is stored in the value associated with that key:
> 
> <Row {'person': {'first_name': 'Bob', 'last_name': 'Smith'}}>
> 
> When .find() is called on a Rows object with compact=True, the __iter__ 
> method (called by the "for row in self" loop) returns a transformed version 
> of each Row object, removing the top-level table key:
> 
> <Row {'first_name': 'Bob', 'last_name': 'Smith'}>
> 
> I believe this is an unnecessary transformation, and it is what is 
> subsequently causing the .render() method to fail (the .render() method 
> expects the top-level table key to be there, whether or not compact=True). I 
> propose the following change to .find():
> 
>         for i, row in enumerate(self):
>             if f(row):
>                 if a<=k: records.append(self.records[i])
>                 k += 1
>                 if k==b: break
> 
> The above code appends self.records[i] instead of row, which preserves the 
> original Row objects instead of including transformed objects. Anyone see any 
> problems with that change?
> 
> Also, is there any reason all of the Rows methods (i.e., find, exclude, 
> __and__, __or__) should not be preserving the "compact" attribute of the 
> original Rows object? Perhaps we should change them all to do so. (Note, this 
> is a separate issue unrelated to the above problem with .find() and 
> .render().)
> 
> Anthony
> 
> On Tuesday, January 7, 2014 10:47:28 AM UTC-5, Anthony wrote:
> .render() works fine on Rows objects with compact=True, and it also works 
> fine on the results of .sort(), .exclude(), &, and | operations. The only 
> problem is with the results of .find() operations when the original Rows 
> object has compact=True. The problem is that the .find() method modifies the 
> Row objects in self.records when compact=True, which it probably should not 
> due.
> 
> Aside from this issue, perhaps the various Rows methods should preserve the 
> "compact" attribute -- not sure why they don't.
> 
> Forwarding to the developers list for discussion.
> 
> Anthony
> 
> On Tuesday, January 7, 2014 3:10:00 AM UTC-5, Joe Barnhart wrote:
> I've been experimenting with the render method of the Rows class, and I am 
> very impressed.  But one drawback I found is that the Rows object must have 
> its value set to "compact=False" to work properly with render().  It isn't a 
> problem if the Rows object is used directly without any operators, but I 
> discovered that many, if not most, Rows methods do not preserve the "compact" 
> setting.
> 
> For example. if you "sort" the Rows, it leaves compact=True.  Ditto, if you 
> use "extract" or "find" on the Rows object.  The "&" and "|" operators also 
> set the compact variable to "True".  The upshot is that you can't use any of 
> these operators on the Rows object and then use "render" on the resulting 
> object.
> 
> It is a simple change to add the preservation of the "compact" flag during 
> any of these steps, but I'm unsure if this will break existing code.  Other 
> than coming up with a completely parallel set of methods, which leave compact 
> set the way it came in, I can't think of another approach will be provably 
> backwards-compatible.
> 
> Here is an example:
> 
> 
>     def __and__(self,other):
>         if self.colnames!=other.colnames:
>             raise Exception('Cannot & incompatible Rows objects')
>         records = self.records+other.records
>         return Rows(self.db,records,self.colnames)
> 
> 
> Becomes:
> 
> 
>     def __and__(self,other):
>         if self.colnames!=other.colnames:
>             raise Exception('Cannot & incompatible Rows objects')
>         records = self.records+other.records
>         return Rows(self.db,records,self.colnames,compact=(self.compact or 
> other.compact))
> 
> 
> In the case above, the flag compact will be set True if either of the 
> participating Rows object is also "compact".  My logic is, if you've lost the 
> "table" values on either Rows object, you may as well lose them on the 
> combined set.
> 
> What do you think?
> 
> -- Joe B.
> 
> 
> 
> -- 
> -- mail from:GoogleGroups "web2py-developers" mailing list
> make speech: web2py-develop...@googlegroups.com
> unsubscribe: web2py-developers+unsubscr...@googlegroups.com
> details : http://groups.google.com/group/web2py-developers
> the project: http://code.google.com/p/web2py/
> official : http://www.web2py.com/
> --- 
> You received this message because you are subscribed to the Google Groups 
> "web2py-developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to web2py-developers+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to