here's an updated DAL patch to try.....

thanks for trudging through this with us!

cfh

On Tuesday, February 26, 2013 3:36:30 PM UTC-8, Scott Hunter wrote:
>
> I'm working from Version 2.3.2 (2012-12-17 15:03:30) stable
>
> Here's the table in question (I've commented-out the custom_qualifier for 
> the string fields):
>
> db.define_table('t_run',
>     Field('f_trial', type='reference t_trial',
>           label=T('Trial')),
>     Field('f_when', type='date',
>           label=T('When')),
>     Field('f_dog', type='reference t_dog',
>           label=T('Dog')),
>     Field('f_name', type='string',#custom_qualifier={'indexed':False},
>           label=T('Name')),
>     Field('f_breed', type='string',#custom_qualifier={'indexed':False},
>           label=T('Breed')),
>     Field('f_jump_height', type='integer',custom_qualifier={'indexed':
> False},
>           label=T('Jump Height')),
>     Field('f_level', type='string',#custom_qualifier={'indexed':False},
>           label=T('Level')),
>     Field('f_class', type='string',#custom_qualifier={'indexed':False},
>           label=T('Class')),
>     Field('f_pref', type='boolean',custom_qualifier={'indexed':False},
>           label=T('Preferred')),
>     Field('f_armband', type='string',#custom_qualifier={'indexed':False},
>           label=T('Armband')),
>     Field('f_yards', type='integer',custom_qualifier={'indexed':False},
>           label=T('Yards')),
>     Field('f_sct', type='integer',custom_qualifier={'indexed':False},
>           label=T('SCT')),
>     Field('f_judge', type='string',#custom_qualifier={'indexed':False},
>           label=T('Judge')),
>     Field('f_score', type='integer',custom_qualifier={'indexed':False},
>           label=T('Score')),
>     Field('f_time', type='double',custom_qualifier={'indexed':False},
>           label=T('Time')),
>     Field('f_faults', type='string',#custom_qualifier={'indexed':False},
>           label=T('Faults')),
>     Field('f_handler', type='string',#custom_qualifier={'indexed':False},
>           label=T('Handler')),
>     Field('f_order', type='integer',
>           label=T('Order')),
>     auth.signature,
>     format='%(f_key)s',
>     migrate=settings.migrate)
>
>
> P.S. Turning off the indexes DOES make a difference; with the changes 
> above, instead of using up over 30% of my quota, I'm "only" using 23%.  If 
> I can get the strings unindexed, and take out the web2py-supplied fields 
> (created_by & _on, modified_by & _on, and maybe is_active), that should get 
> it down to something manageable.  (Not clear on how to handle the 
> web2py-supplied fields, as I don't know what parameters were using in 
> making them, making it difficult to know just how to "supply my own 
> definitions".)
>
> On Tuesday, February 26, 2013 6:24:21 PM UTC-5, howesc wrote:
>>
>> your line numbers are off from mine so i'm having trouble making sense of 
>> this. :(
>>
>> can you send your model definition so i can see what you are working 
>> with?  i think then i can line it up with the dal version i have here 
>> (which was trunk from HG as of saturday AM PST)
>>
>> cfh
>>
>> On Tuesday, February 26, 2013 3:18:13 PM UTC-8, Scott Hunter wrote:
>>>
>>> Sorry about that.  I've fixed it, and now I get the following:
>>>
>>> In FILE: /base/data/home/apps/s~sbhweb2py/1.365574604253984974/
>>> applications/ppt_demo/models/db_wizard.py
>>>
>>>
>>> Traceback (most recent call last):
>>>   File 
>>> "/base/data/home/apps/s~sbhweb2py/1.365574604253984974/gluon/restricted.py"
>>> , line 212, in restricted
>>>     exec ccode in environment
>>>   File 
>>> "/base/data/home/apps/s~sbhweb2py/1.365574604253984974/applications/ppt_demo/models/db_wizard.py"
>>> , line 198, in <module>
>>>     migrate=settings.migrate)
>>>   File 
>>> "/base/data/home/apps/s~sbhweb2py/1.365574604253984974/gluon/dal.py",line 
>>> 7189, in define_table
>>>     table = self.lazy_define_table(tablename,*fields,**args)
>>>   File 
>>> "/base/data/home/apps/s~sbhweb2py/1.365574604253984974/gluon/dal.py",line 
>>> 7225, in lazy_define_table
>>>     polymodel=polymodel)
>>>   File 
>>> "/base/data/home/apps/s~sbhweb2py/1.365574604253984974/gluon/dal.py",line 
>>> 4368, in create_table
>>>     ftype = self.types[field_type](**attr)
>>> TypeError: <lambda>() takes no arguments (1 given)
>>>
>>>
>>> This only happens if one of the fields in question is a string; I get no 
>>> error when the unindexed fields are all integer, boolean or double.
>>>
>>> - Scott
>>>
>>>
>>> On Tuesday, February 26, 2013 1:04:12 AM UTC-5, howesc wrote:
>>>>
>>>> it looks like you have a typo.... "custom_qualifer" vs 
>>>> "custom_qualifier"
>>>>
>>>> On Monday, February 25, 2013 6:44:14 PM UTC-8, Scott Hunter wrote:
>>>>>
>>>>> I applied the patch, and added custom_qualifiers like so:
>>>>>
>>>>>     Field('f_name', type='string',custom_qualifer={'indexed':False},
>>>>>           label=T('Name')),
>>>>>
>>>>>
>>>>>
>>>>> and this is the error I got:
>>>>>
>>>>> In FILE: /base/data/home/apps/s~sbhweb2py/1.365567821359373728/
>>>>> applications/ppt_demo/models/db_wizard.py
>>>>>
>>>>>
>>>>> Traceback (most recent call last):
>>>>>   File 
>>>>> "/base/data/home/apps/s~sbhweb2py/1.365567821359373728/gluon/restricted.py"
>>>>> , line 212, in restricted
>>>>>     exec ccode in environment
>>>>>   File 
>>>>> "/base/data/home/apps/s~sbhweb2py/1.365567821359373728/applications/ppt_demo/models/db_wizard.py"
>>>>> , line 165, in <module>
>>>>>     label=T('Name')),
>>>>> TypeError: __init__() got an unexpected keyword argument 
>>>>> 'custom_qualifer'
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Saturday, February 23, 2013 12:30:48 PM UTC-5, howesc wrote:
>>>>>>
>>>>>> Scott,
>>>>>>
>>>>>> this is *completely* untested, but here's a proposal:
>>>>>>  - use the (undocumented) field.custom_qualifier property in GAE 
>>>>>> field definitions
>>>>>>  - if you want a field to be unindexed set 
>>>>>> custom_qualifier={'indexed':False}
>>>>>>  - for "properties that don't get listed explicitly"....override 
>>>>>> those default properties with what you want (there are a few techniques 
>>>>>> for 
>>>>>> not explicitly listing fields, depending on which technique you are 
>>>>>> using 
>>>>>> the answer here is different.
>>>>>>
>>>>>> this patch against HG trunk this AM might work (i say might cause i 
>>>>>> have not tested it).  are you willing to experiment with it and let us 
>>>>>> know?
>>>>>>
>>>>>> thanks,
>>>>>>
>>>>>> christian
>>>>>>
>>>>>> On Friday, February 22, 2013 3:53:33 PM UTC-8, Scott Hunter wrote:
>>>>>>>
>>>>>>> If I had to guess, I'd say a patch is needed in the loop over the 
>>>>>>> fields in create_table, that would add a new entry to the dict for the 
>>>>>>> field definition based on a new attribute (which would be ignored for 
>>>>>>> anything other than Google's Datastore) which gets added to sql_fields; 
>>>>>>> then migrate_table, which seems to build the table building/altering 
>>>>>>> commands would need to be made to recognize the new entry & add the 
>>>>>>> disable 
>>>>>>> index command.  There's not a lot of comments in the code, and I'd be 
>>>>>>> afraid to break something, but might give it a try.
>>>>>>>
>>>>>>> - Scott
>>>>>>>
>>>>>>> P.S. Not sure of the best way to handle this (what's describe above 
>>>>>>> wouldn't handle it), but it would be nice to be able to turn off the 
>>>>>>> indexes for the fields that don't get listed explicitly in  models.db 
>>>>>>> (things like created by & when, modified by & when).
>>>>>>>
>>>>>>> On Friday, February 22, 2013 6:14:28 PM UTC-5, howesc wrote:
>>>>>>>>
>>>>>>>> thanks for the link.  i'll try and take a look this weekend and see 
>>>>>>>> if there is a place for that in the DAL  (feel free to open 
>>>>>>>> gluon/dal.py 
>>>>>>>> yourself too).
>>>>>>>>
>>>>>>>> yup, i'm paying more for writes right now then i am for instance 
>>>>>>>> hours per day on my largest paid application. :)
>>>>>>>>
>>>>>>>> cfh
>>>>>>>>
>>>>>>>> On Thursday, February 21, 2013 5:59:06 PM UTC-8, Scott Hunter wrote:
>>>>>>>>>
>>>>>>>>> According to 
>>>>>>>>> https://developers.google.com/appengine/docs/python/datastore/indexes#Unindexed_Properties,
>>>>>>>>>  
>>>>>>>>> "You declare a property unindexed by setting indexed=False in the 
>>>>>>>>> property 
>>>>>>>>> constructor".
>>>>>>>>>
>>>>>>>>> One incurs the cost of a write (or 2?) for every property of a 
>>>>>>>>> record that gets written; so, for a table with about 25 fields (once 
>>>>>>>>> you 
>>>>>>>>> include all of the ones web2py adds), inserting 300 records incurs 
>>>>>>>>> the cost 
>>>>>>>>> of 14K+ writes; as the free account has a limit of 50K writes per 
>>>>>>>>> day, that 
>>>>>>>>> is rather limiting.  It is easy to turn such indicies back on, but 
>>>>>>>>> you have 
>>>>>>>>> to re-write every record in order to repopulate them.
>>>>>>>>>
>>>>>>>>> - Scott
>>>>>>>>>
>>>>>>>>> On Thursday, February 21, 2013 4:51:59 PM UTC-5, howesc wrote:
>>>>>>>>>>
>>>>>>>>>> i'm being lazy here....do you have the instructions (or link to 
>>>>>>>>>> instructions) from GAE for disabling indexes?  i don't have it handy 
>>>>>>>>>> right 
>>>>>>>>>> now....
>>>>>>>>>>
>>>>>>>>>> we can check if the DAL has a secret way to handle it, and/or 
>>>>>>>>>> create a patch to allow it.
>>>>>>>>>>
>>>>>>>>>> may i ask what advantage you are hoping to achieve by skipping 
>>>>>>>>>> those indexes?  i've left them on for fear of making a bad choice 
>>>>>>>>>> that i 
>>>>>>>>>> can't revert.
>>>>>>>>>>
>>>>>>>>>> christian
>>>>>>>>>>
>>>>>>>>>> On Thursday, February 21, 2013 5:56:07 AM UTC-8, Scott Hunter 
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> As I understand it, the GAE datastore will automatically create 
>>>>>>>>>>> an index for every field of every table (to facilitate queries 
>>>>>>>>>>> using single 
>>>>>>>>>>> fields); those requiring multiple fields also get generated, but 
>>>>>>>>>>> will get 
>>>>>>>>>>> added to index.yaml by the SDK when tested locally.  Since these 
>>>>>>>>>>> are 
>>>>>>>>>>> created outside of the DAL, I wouldn't expect to be able to remove 
>>>>>>>>>>> them 
>>>>>>>>>>> using it.  I also understand that there is a way, with the GAE SDK, 
>>>>>>>>>>> to 
>>>>>>>>>>> disable the index for any given field (by a parameter in the field 
>>>>>>>>>>> definition); is there any way to accomplish this through the DAL, 
>>>>>>>>>>> and if 
>>>>>>>>>>> so, what is it?
>>>>>>>>>>
>>>>>>>>>>

-- 

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


diff -r 87162e3fcd8c gluon/dal.py
--- a/gluon/dal.py      Fri Feb 22 18:45:26 2013 -0600
+++ b/gluon/dal.py      Tue Feb 26 17:48:11 2013 -0800
@@ -4460,7 +4460,7 @@
                  adapter_args={}, do_connect=True, after_connection=None):
         self.types.update({
                 'boolean': gae.BooleanProperty,
-                'string': (lambda: gae.StringProperty(multiline=True)),
+                'string': (lambda **kwargs: gae.StringProperty(multiline=True, 
**kwargs)),
                 'text': gae.TextProperty,
                 'json': gae.TextProperty,
                 'password': gae.StringProperty,
@@ -4476,9 +4476,9 @@
                 'datetime': gae.DateTimeProperty,
                 'id': None,
                 'reference': gae.IntegerProperty,
-                'list:string': (lambda: gae.StringListProperty(default=None)),
-                'list:integer': (lambda: gae.ListProperty(int,default=None)),
-                'list:reference': (lambda: gae.ListProperty(int,default=None)),
+                'list:string': (lambda **kwargs: 
gae.StringListProperty(default=None, **kwargs)),
+                'list:integer': (lambda **kwargs: 
gae.ListProperty(int,default=None, **kwargs)),
+                'list:reference': (lambda **kwargs: 
gae.ListProperty(int,default=None, **kwargs)),
                 })
         self.db = db
         self.uri = uri
@@ -4501,6 +4501,9 @@
             if isinstance(polymodel,Table) and field.name in 
polymodel.fields():
                 continue
             attr = {}
+            if isinstance(field.custom_qaulifier, dict):
+                #this is custom properties to add to the GAE field declartion
+                attr = field.custom_qualifier
             field_type = field.type
             if isinstance(field_type, SQLCustomType):
                 ftype = self.types[field_type.native or 
field_type.type](**attr)
@@ -4517,10 +4520,10 @@
                 if field.notnull:
                     attr = dict(required=True)
                 referenced = field_type[10:].strip()
-                ftype = self.types[field_type[:9]](referenced)
+                ftype = self.types[field_type[:9]](referenced, **attr)
             elif field_type.startswith('list:reference'):
                 if field.notnull:
-                    attr = dict(required=True)
+                    attr['required'] = True
                 referenced = field_type[15:].strip()
                 ftype = self.types[field_type[:14]](**attr)
             elif field_type.startswith('list:'):

Reply via email to