Re: Follow up on: Tags rest resource request for mobile apps

Bharat Mediratta <[email protected]>
Newsgroups gmane.comp.web.gallery.devel
Message-ID <[email protected]>
On Wed, May 18, 2011 at 10:59 AM, David Steinberger <[email protected]>wrote:

>
> Bharat,
>
> Think I got most your idea described above.
>
> Question: Do you want to have a generic way to expand rest resources?
>
> We could do that by analyzing the fields parameter (
> fields=tag_item.tag,tag.title,tag.count<http://x.com/g3/rest/item_tags/1?output=html&fields=tag_item.tag,tag.title,tag.count>
> ).
> But this is tricky!
> Much easier would be that a rest resource (e.g. item_tags) checks all
> field parameters and in case it knows how to handle them does the needful
> (e.g. calls another rest resource, puts some specific fields into the json
> payload etc.).
>
>
>  The second seems to be much easier, but results in dependencies between
> the rest resources.
>

I was thinking the second approach as well.  The rest framework could parse
the fields param into $request->fields and each get() function checks that
and does the right thing.  I don't see that causing any dependencies between
rest resources -- can you explain what you're worried about there?


On 5/16/11 6:43 AM, Bharat Mediratta wrote:
>
>
>
> On Sun, May 15, 2011 at 3:07 PM, David Steinberger <[email protected]>wrote:
>
>>
>> So if I get this right, your proposed way is the following:
>>
>> We go with a fields parameter:
>>
>>    - The syntax of this one is <<data_model>>.<<field_name>>.
>>    data_model: is any related data record;
>>    field_name: is any 'column' from this related record
>>    - The rest-resource can return either a single value or an array of
>>    values
>>
>> Something like this:
>> GET /rest/item/1?fields=<<table>>.<<column-name>> ==>
>> 'url' => '',
>> 'entity' => array(),
>> 'relationships' => array(),
>> 'related_fields' =>
>> array (
>>     'url' => '<<url identifier>>',
>>     'member' => '<<row-value>>'
>> ),
>> 'members' => array()
>>
>> or
>>
>> GET /rest/item/1?fields=tags.tag_name ==>
>> 'url' => '',
>> 'entity' => array(),
>> 'relationships' => array(),
>> 'related_fields' =>
>> array (
>>     'url' => '<<url identifier>>',
>>     'members' =>
>>     array (
>>         0 => 'value1',
>>         1 => 'value2',
>>         2 => 'value3',
>>         3 => 'value4',
>>     ),
>> ),
>> 'members' => array()
>>
>> IMHO we'd need this fields-logic on the items and the tree-resource.
>> The implementation could be similar to the existing 'relationships' logic,
>> isn't it?
>>
>
>  I was thinking that instead of separating out the related fields, we'd
> expand them inline.
>
>   *WHAT WE HAVE NOW:*
>
>  REQUEST: GET /rest/item/1?output=html
> RESPONSE: array(
>   'url' => 'http://x.com/g3/rest/item/1?output=html',
>   'entity' => array(
>     'id' => '1',
>     ...
>   ),
>   'relationships' => array(
>     'comments' => ...
>     'tags' => array(
>       'url' => 'http://x.com/g3/rest/item_tags/1?output=html',
>       'members' => array(
>       ),
>     ),
>   ),
>   'members' => array(
>     0 => 'http://x.com/g3/rest/item/2?output=html',
>   ),
> )
>
>  ==========
>
>  *WHAT WE'D HAVE WITH FIELDS:*
>
>  REQUEST: GET
> /rest/item/1?output=html&fields=tag_item.tag,tag.title,tag.count
> RESPONSE: array(
>   'url' => '
> http://x.com/g3/rest/item/1?output=html&fields=tag_item.tag,tag.title,tag.count
> ',
>   'entity' => array(
>     'id' => '1',
>     ...
>   ),
>   'relationships' => array(
>     'comments' => ...
>     'tags' => array(
>       'url' => '
> http://x.com/g3/rest/item_tags/1?output=html&fields=tag_item.tag,tag.title,tag.count
> ',
>       'members' => array(
>         0 => array(
>           'url' => '
> http://x.com/g3/rest/tag_item/1,1?output=html&fields=tag_item.tag,tag.title,tag.count
> ',
>           'entity' => array(
>     'tag' => array(
>               'url' => '
> http://x.com/g3/rest/tag/1?output=html&fields=tag_item.tag,tag.title,tag.count
> ',
>       'entity' => array(
>                 'title' => 'ThisIsMyTag',
>                 'count' => '2'
>               )
>             )
>           ),
>         ),
>       ),
>     ),
>   ),
>   'members' => array(
>     0 => 'http://x.com/g3/rest/item/2?output=html',
>   ),
>
>
>  Some things to note here:
> 1) Even though the format of the response changes, it's consistent because
> it's dictated by the query parameters.
>
>  2) We expand the tag_item resource because there's an "tag_item.tag"
> field specified.  We still present the url as before in the expanded data
> structure, but we *only* expand the tag element underneath it (so the item
> field normally in the entity is dropped).
>
>  3) We then expand the tag resource below the item_tags resource because
> we requested the tag.title and tag.count fields.  The id field is ignored.
>
>  GOTCHAS:
>
>  One problem here is that the tag resource contains a relationship back to
> tag_item, so we'd then expand *that* tag_item which would in turn expand its
> tag, and we'll have an infinite loop.  I haven't figured out whether that's
> an implementation detail or if we need something in the design to prevent it
> from happening.
>
>
>>
>> On 5/15/11 9:07 PM, Bharat Mediratta wrote:
>>
>>
>>
>> On Thu, May 12, 2011 at 11:48 AM, David Steinberger <[email protected]
>> > wrote:
>>
>>>  I created a very simple tag_values module that delivers all tag values
>>> for a given item id.
>>> Based on the tags modules ... very simple. Cool!
>>>
>>> It's like this:
>>> Request: http://localhost/~david/gallery3/index.php/rest/tag_values/<<item
>>> id>>?output=html
>>> Response:
>>> array (
>>>     'url' => '
>>> http://localhost/~david/gallery3/index.php/rest/tag_values/<<item
>>> id>>?output=html',
>>>     'members' =>
>>>     array (
>>>         0 => 'tag1',
>>>         1 => 'tag2',
>>>         2 => 'tag3',
>>>         3 => 'tag4',
>>>     ),
>>> )
>>>
>>>
>>> Question on consistency:
>>> I implemented relationships($resource_type, $resource). Now it shows up
>>> in the item-rest-resource under relationships. Just great. BUT: It's not
>>> consistent!
>>> Usually rest-resources should only put restful urls in 'relationships',
>>> isn't it?
>>>
>>> How should this be structured? Via a parameter on the rest-resources?
>>> I was thinking about '&resolveRelationships=true/false, what do other
>>> think?
>>>
>>
>>  So if I understand it correctly, what you really want here is to display
>> information about the tag itself so that you don't have to make a second
>> query?    I think what you want is the "fields" parameter that we've been
>> discussing on this thread:
>>
>>  http://old.nabble.com/REST-docs-td27351326.html
>>
>>  Essentially, some resources would just be a URL, some would be a data
>> structure containing the url with *some* fields inlined.  I think the code
>> is relatively easy to write, but nobody's done it yet.  If you want to take
>> a shot at it this week, we could still get it into 3.0.2.
>>
>>
>>>
>>>
>>> 1 Gallery3 question:
>>> Why does $request->url result in an item id (context
>>> rest::resolve($request->url))?
>>> Where's this defined/coded? Just want to understand what I'm actually
>>> doing :).
>>>
>>
>>  I'm not sure I exactly follow what you mean.  rest::resolve looks at the
>> url (eg: "tag_values/3") and breaks it up into two parts ("tag_values", "3")
>> then calls tag_values_rest::resolve("3") which returns something arbitrary.
>>
>>  The important thing is that your rest resource's resolve() and url()
>> functions match up, so for example:
>>
>>    tag_values_rest::url("3") == "tag_values/3"
>>   tag_values_rest::resolve("tag_values/3") == "3"
>>
>>  Does that make sense?
>>
>>
>>>
>>> Thx,
>>>   David
>>>
>>> Btw. gallery3 & kohana are fantastic to work with.
>>> And sorry to start a new conversion, but can't follow up on the old one.
>>>
>>
>>  thanks!
>>
>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Achieve unprecedented app performance and reliability
>>> What every C/C++ and Fortran developer should know.
>>> Learn how Intel has extended the reach of its next-generation tools
>>> to help boost performance applications - inlcuding clusters.
>>> http://p.sf.net/sfu/intel-dev2devmay
>>> __[ 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 ]
>>>
>>
>>
>> ------------------------------------------------------------------------------
>> Achieve unprecedented app performance and reliability
>> What every C/C++ and Fortran developer should know.
>> Learn how Intel has extended the reach of its next-generation tools
>> to help boost performance applications - inlcuding clusters.http://p.sf.net/sfu/intel-dev2devmay
>>
>>
>> __[ 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 ]
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Achieve unprecedented app performance and reliability
>> What every C/C++ and Fortran developer should know.
>> Learn how Intel has extended the reach of its next-generation tools
>> to help boost performance applications - inlcuding clusters.
>> http://p.sf.net/sfu/intel-dev2devmay
>> __[ 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 ]
>>
>
>

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay

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