On Mon, Apr 13, 2009 at 1:53 PM, Yarko Tymciurak <[email protected]> wrote:

> On Mon, Apr 13, 2009 at 1:40 PM, Yarko Tymciurak <[email protected]>wrote:
>
>> I have a couple of immediate comments:
>> [1] - with this syntax, you do not process and fields or migrate
>> statements (but you _could_; suggest you do)
>> [2] - the autofields() function seems to mash concerns in other ways also:
>>  it handles tablename update (? why here) in addition to "autofields";  for
>> one thing, it does NOT do cleanup() (as define_table otherwise does) - this
>> is the beginnings of handling things differently in different conditions
>> (and a typical symptom of blurred boundaries of concerns).
>>
>> Suggest you DO table name handling in _one place_, and field processing
>> (as you have) in one place, and consider that you only ADD "autofields" as a
>> new syntax for defining fields.
>>
>> Having said that, it occurs to me that a comma separated text string is
>> just one layer of this, and it would be good to split this out, so that
>> web2py application developers could create things more automatically, to
>> wit:
>>
>> [3] in sql.autofields() ==> for field in fields.split(',') ---- I would
>> make this do NO MORE than call an individual field processing function
>> (separate this functionality)
>>
>> [4]  I would add / allow a list to be passed (that is, allow the
>> application developer to _already_ have split the field definitions to "the
>> new text specification format") --- this will be much handier for automated
>> processing.   There are a couple of ways you could handle this, one being
>> parsing *fields in define_table()  to first split them out to string (or
>> list?) vs.  function types, process all the string types by some
>> autofields_parse() function, collect and pass the rest to SQLTable(self,
>> tablename, *fields)...
>>
>
> ... as I think of this, and of application developers I would ONLY process
> lists for the "new" syntax - there is no useful reason to have a string that
> the CORE then splits on ','  and only complicates the core.... this is the
> kind of niceity that better belongs at the application level - either for
> the app writer, or in an admin (or other higher level function).
>
> So I now would prefer to see *fields  argument to define_table()  handle
> all field definitions, and based on type of ...field in fields'... I would
> collect them and process accordingly.  If you _really_ want, you could
> insist that the fields list passed to define table be already coalesced
> (this would simplify core) - that is, all of one together, so that a change
> is assumed to apply to rest of fields (I think this is prefectly
> reasonable)....
>
> So you see what I am proposing, I would do something like:
>
> db.define_table('mytable',
>   'name',
>   'birthday date',
>   SQLField( 'some_other_field', 'integer', default=foo()),
>   # and all the following are now assumed to be function calls
> )
>
> or, alternatively:
>
> dyna_fields= ['name', 'birthday date']
>

Note this also can free up other things:   ":" can now be a separator (so
spaces in validators can be used), e.g.:

dyna_fields=['name', 'birthday: date', 'some_comment: text: default string']

I think this opens the possibility for more "regular" processing, and
broader ways of generating tables.

What do you think?

- Yarko (... still thinking about this...)

db.define_table('mytable, *dyna_fields,
>    SQLField( # and so forth....)
> )
>
> - Yarko
>
>>
>> Make sense?   I think with a little finesse this could provide more than a
>> "nice syntax", rather a handy way to automatically generate tables from
>> descriptors.
>>
>> Regards,
>> - Yarko
>>
>>
>>
>> 2009/4/13 mdipierro <[email protected]>
>>
>>
>>> Try latest trunk. You can do:
>>>
>>> db.define_table('friendship: person by name birthday notnull, dog by
>>> name ')
>>>
>>> mind that you cannot have both notnull and unique and you cannot have
>>> a unique reference because I just realized we lack a validator to do
>>> it. I will make one and extend this..
>>>
>>> Massimo
>>>
>>> On Apr 13, 12:26 pm, mdipierro <[email protected]> wrote:
>>> > Actually it does just
>>> >
>>> > db.define_table('friendship'
>>> >   ,SQLField('person_name')
>>> >   )
>>> >
>>> > but I am about to follow your suggestion (with a slight change in
>>> > notation) and do
>>> >
>>> > db.define_table('friendship: person by name birthday notnull, dog by
>>> > name ')
>>> >
>>> > generate:
>>> >
>>> > db.define_table('friendship'
>>> >   ,SQLField('person',requires=IS_IN_DB(db,'person.id','%(name) %
>>> > (birthday)',notnull = True),
>>> >   ,SQLField('dog',requires=IS_NULL_OR(IS_IN_DB(db,'dog.id','%
>>> > (name)')),
>>> >   )
>>> >
>>> > Massimo
>>> >
>>> > On Apr 13, 11:13 am, DenesL <[email protected]> wrote:
>>> >
>>> > > Maybe too short to be useful, but when you get to references it would
>>> > > be nice to have:
>>> >
>>> > > db.define_table('friendship: person.name, dog.name')
>>> >
>>> > > But then, does this mean:
>>> >
>>> > > db.define_table('friendship'
>>> > >   ,SQLField('person_name'
>>> > >     ,db.person
>>> > >     ,requires=IS_IN_DB(db,db.person,'%(name)')
>>> > >   )...
>>> >
>>> > > or
>>> >
>>> > >   ,SQLField('person_name'
>>> > >      ,db.person.name.type
>>> > >      ,db.person.name.length
>>> > >      ,requires=IS_IN_DB(db,db.person.name)
>>> > >   )...
>>> >
>>> > > On Apr 13, 2:16 am, mdipierro <[email protected]> wrote:
>>> >
>>> > > > In trunk you can now do
>>> >
>>> > > > db.define_table('person : Name, Birthday date, Telephone')
>>> > > > db.define_table('dog: Name, Owner person, Picture upload')
>>> >
>>> > > > Is this useful? Look at the source. Is the syntax reasonable?
>>> >
>>> > > > Massimo
>>> >>>
>>>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to