Hi Gimantha,

Don't we need to maintain a version with an API?

Regards
Roshan

On Fri, Feb 13, 2015 at 3:08 AM, Gimantha Bandara <giman...@wso2.com> wrote:

> Hi all,
> I changed the APIs so they follow the convention and i tested if there are
> conflicts between some APIs. JAX RS treats *GET
> /analytics/tables/{tableName}/{from} *, *GET
> /analytics/tables/{tableName}/recordcount *and *GET
> /analytics/tables/{tableName}/indices* as different APIs, so there will
> not be any conflict.
>
> Changed APIs :
>
> 1. Create a table
> *POST /analytics/tables*
> {
>    tableName : "<table-name>"
> }
>  ; table-name - The name of the table to be created.
>
> 2. Delete a table.
> *DELETE /analytics/tables*/*{tableName}*
>
> ; tableName - The name of the table to be deleted.
>
> 3. Check if a table exists
> *GET /analytics/tables?tableName=<table-name>*
> ; table-name - The name of the table being checked.
>
> 4. List All the tables
> *GET /analytics/tables*
> ;Response will be an JSON array of table names. e.g. [ "table1" , "table2"
> , "table3" ]
>
> 5. Get the records from a table.
> *GET /analytics/tables/{tableName}/{from}/{to}/{start}/{count}*
> ; tableName - The name of the table from which the records are retrieved.
> ; from - The starting time to get records from.
> ; to - The ending time to get records to.
> ; start - The paginated index from value
> ; count - The paginated records count to be read
> ; response - takes the format of the request content of No.7
>
> 7. Create records ( can be created in different tables or in the same )
> *POST /analytics/records*
> ; Content - A list of records in json format like in below.
> [
>     {
>         "id": "id1", (optional),
>         "tableName": "tableName1",
>         "timestamp": "<long-value>", (optional)
>         "values":
>         {
>             "columnName1": "value1",
>             "columnName2": "value2"
>         }
>     },
>    {
>         "tableName": "tableName2",
>         "values":
>         {
>             "columnName1": "value1",
>             "columnName2": "value2"
>         }
>     },
> ]
>
> 8. Delete records
> *DELETE /analytics/tables/{tableName}/{timeFrom}/{timeTo}*
> ; tableName - Name of the table from which the records are deleted.
> ; timeFrom - The starting time to delete records from.
> ; timeTo - The end time to delete records to.
>
> 9. Update a set of records
> *PUT /analytics/records* ( PATCH will be more suitable, but jax rs does
> not give PATCH method out of the box so we have to implement it)
> ; Content - As same as the POST method for creating records
>
> 10. Get the record count of table
> *GET /analytics/tables/{tableName}/recordcount*
> ; tableName - The name of the table
>
> 11. Create Indices for a table
> *POST /analytics/tables/{tableName}/indices*
> ; tableName - The name of the table of which the indices are set
> ; Content - takes the following format. TYPE is one of "INTEGER",
> "BOOLEAN", "DOUBLE", "STRING", "FLOAT", "LONG"
> {
>     "indexColumnName1" : "TYPE1",
>     "indexColumnName2" : "TYPE2"
> }
>
> 12. get the indices of a table
> *GET /analytics/tables/{tableName}/indices*
> ; tableName - The name of the table
> ; Response will be of the format of the previous POST request's Content.
>
> 13. Clear the indices of a table
> *DELETE /analytics/tables/{tableName}/indices*
> ; tableName - The name of the table
>
> 14. Search records of a table
> *POST /analytics/search*
> ; Content - takes the following format
> {
>     "tableName": "sampleTableName",
>     "language": "sampleLanguageName",
>     "query": "sampleQuery",
>     "start": "start-location-of-the-result",
>     "count": "maximum-number-of-entries-to-return"
> }
>
> On Wed, Jan 21, 2015 at 8:38 AM, Anjana Fernando <anj...@wso2.com> wrote:
>
>> Hi Gimantha,
>>
>> You haven't really replied to Sinthuja's points there. We have to decide
>> if we are going ahead with Sinthuja's suggestions, or not. Lets first
>> educate ourselves on the best practices of RESTful API design a bit,
>> Googling helps [1]. For example, I'm also not sure if should be
>> /analytics/{tableName}/records or /analytics/records/{tableName}, each has
>> benefits, like, first approach can have ambiguity issues, specially when
>> there other operations with optional fields. And also, I guess we will need
>> to have /analytics/tables/{tableName} for creating tables etc.. or else,
>> for example when we do a POST for like "/analytics/T1", it may not be that
>> informative what we are actually doing there.
>>
>> [1]
>> https://www.google.com/search?q=REST+service+design&gws_rd=ssl#q=REST+api+design
>>
>> Cheers,
>> Anjana.
>>
>> On Wed, Jan 21, 2015 at 3:35 AM, Gimantha Bandara <giman...@wso2.com>
>> wrote:
>>
>>> Hi,
>>> Goood point!. Initially the search was implemented such a way that it
>>> returns a list of ids of records that match the query. Now the search
>>> method is changed, so it returns the records. So +1 for removing the API
>>> #6.
>>>
>>> @Sinduja, @Harshan
>>>    Thanks for the reference links and for the feedback.
>>>
>>> On Tue, Jan 20, 2015 at 6:52 PM, Harshan Liyanage <hars...@wso2.com>
>>> wrote:
>>>
>>>> Hi Gimantha,
>>>>
>>>> Could you please explain the use-case for the API  #6? IMO there should
>>>> not be any operation to fetch a list of records by ids. Instead there could
>>>> be an API which sends a list of records as the response for a query.
>>>>
>>>> For the API #14 you can still use GET method with query strings. I
>>>> think you have included start & count parameters to control the pagination.
>>>> For that you can use the HTTP range-header [1] or link headers as mentioned
>>>> in [2].
>>>>
>>>> [1]. http://otac0n.com/blog/2012/11/21/range-header-i-choose-you.html
>>>> [2]. https://developer.github.com/v3/#pagination
>>>>
>>>> Regards,
>>>>
>>>> Lakshitha Harshan
>>>> Software Engineer
>>>> Mobile: *+94724423048*
>>>> Email: hars...@wso2.com
>>>> Blog : http://harshanliyanage.blogspot.com/
>>>> *WSO2, Inc. :** wso2.com <http://wso2.com/>*
>>>> lean.enterprise.middleware.
>>>>
>>>> On Tue, Jan 20, 2015 at 6:34 PM, Gimantha Bandara <giman...@wso2.com>
>>>> wrote:
>>>>
>>>>> Hi Harshan,
>>>>>
>>>>> Thanks for the feedback. The list of IDs of the records to be
>>>>> retrieved can be too long. So setting a list of ids as a query param is 
>>>>> not
>>>>> convenient. Even for the Search, we have to pass a query, which can be too
>>>>> long. Thats why the post method is used for Search.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> On Tue, Jan 20, 2015 at 12:52 PM, Sinthuja Ragendran <
>>>>> sinth...@wso2.com> wrote:
>>>>>
>>>>>> Hi Gimantha,
>>>>>>
>>>>>> I think following the conventions will be more intuitive to the
>>>>>> users, and we should have a proper reason to not follow. And the post
>>>>>> request is generally needs to be sent to create the object and the back 
>>>>>> end
>>>>>> is going to decide where to create the tables resource, therefore it 
>>>>>> should
>>>>>> be POST to '/analytics/tables' and message body should be having the 
>>>>>> table
>>>>>> name. If you want to use /analytics/{tableName}, then you should use
>>>>>> PUT rather POST [1]. But IMO POST is the most suitable operation for this
>>>>>> context.
>>>>>>
>>>>>> And through out the below given URL patterns, in order to fetch the
>>>>>> records from a table, you have used '/analytics/records/{tableName}' url
>>>>>> pattern where 'records' is in the middle and it is not the correct data
>>>>>> hierarchy and again I feel it's not the convention. Basically tables
>>>>>> contains records and not records contains tables. Therefore if we use
>>>>>> POST to '/analytics/tables' for create table, then you can use simply
>>>>>> user 'analytics/{tableName}' to GET/POST for the tables, IMHO the records
>>>>>> is just an additional segment which is not needed to be here.
>>>>>>
>>>>>> [1] http://restcookbook.com/HTTP%20Methods/put-vs-post
>>>>>>
>>>>>> Thanks,
>>>>>> Sinthuja.
>>>>>>
>>>>>> On Tue, Jan 20, 2015 at 1:29 AM, Gimantha Bandara <giman...@wso2.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Sinduja,
>>>>>>>
>>>>>>> Thank you for the feedback.
>>>>>>>
>>>>>>> On Mon, Jan 19, 2015 at 12:04 PM, Sinthuja Ragendran <
>>>>>>> sinth...@wso2.com> wrote:
>>>>>>>
>>>>>>>> Hi gimantha,
>>>>>>>>
>>>>>>>> Please see the comments inline.
>>>>>>>>
>>>>>>>> On Sun, Jan 18, 2015 at 11:24 PM, Gimantha Bandara <
>>>>>>>> giman...@wso2.com> wrote:
>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>> Currently, I am working on $subject. Basically the methods in
>>>>>>>>> AnalyticsDataService will be exposed through REST APIs. Please refer 
>>>>>>>>> to
>>>>>>>>> Architecture mail thread "*[Architecture] BAM 3.0 Data Layer
>>>>>>>>> Implementation / RDBMS / Distributed Indexing / Search*" for more
>>>>>>>>> Details. Following are the supported REST APIs.
>>>>>>>>>
>>>>>>>>> 1. Create a table
>>>>>>>>> *POST /analytics/{tableName}*
>>>>>>>>>  ; tableName - The name of the table to be created.
>>>>>>>>>
>>>>>>>>
>>>>>>>> IMHO the above should be POST to '/analytics/*tables*' and the
>>>>>>>> request content should have the table name as given below.
>>>>>>>> {
>>>>>>>>  "tableName" : "Test"
>>>>>>>> }
>>>>>>>>
>>>>>>> Since the POST takes only the table name, it is straightforward to
>>>>>>> use it as a path parameter.
>>>>>>>
>>>>>>>>
>>>>>>>>> 2. Delete a table
>>>>>>>>> *DELETE /analytics/{tableName} *
>>>>>>>>> ; tableName - The name of the table to be deleted.
>>>>>>>>>
>>>>>>>>
>>>>>>>>> 3. Check if a table exists
>>>>>>>>> *GET /analytics/{tableName} *
>>>>>>>>> ; tableName - The name of the table being checked.
>>>>>>>>>
>>>>>>>>> 4. List All the tables
>>>>>>>>> *GET /analytics/tables*
>>>>>>>>> ;Response will be an JSON array of table names. e.g. [ "table1" ,
>>>>>>>>> "table2" , "table3" ]
>>>>>>>>>
>>>>>>>>> 5. Get the records from a table.
>>>>>>>>> *GET /analytics/records/{tableName}/{from}/{to}/{start}/{count} *
>>>>>>>>> ; tableName - The name of the table from which the records are
>>>>>>>>> retrieved.
>>>>>>>>> ; from - The starting time to get records from.
>>>>>>>>> ; to - The ending time to get records to.
>>>>>>>>> ; start - The paginated index from value
>>>>>>>>> ; count - The paginated records count to be read
>>>>>>>>> ; response - takes the format of the request content of No.7
>>>>>>>>>
>>>>>>>>
>>>>>>>> Do we need to have 'records' in the URL?  I think it's better to
>>>>>>>> have  */analytics/{tableName}/{from}/{to}/{start}/{count} *
>>>>>>>>
>>>>>>>
>>>>>>> "records" is there to avoid conflicts with other contexts. As an
>>>>>>> example, If we remove "records", the URL will take the format
>>>>>>> "/analytics/{tableName}", which is already a defined REST API.
>>>>>>>
>>>>>>>>
>>>>>>>>> 6. Get the records from a table (By IDs)
>>>>>>>>> *POST /analytics/records/{tableName}*
>>>>>>>>> ; tableName - The name of the table from which the records are
>>>>>>>>> retrieved.
>>>>>>>>> ; Content  - A List of IDs of the records to be retrieved in the
>>>>>>>>> following format.
>>>>>>>>> [ "id1" , "id2" , "id3" ]
>>>>>>>>> ; response - takes the format of the request content of No.7
>>>>>>>>>
>>>>>>>>
>>>>>>>> Similarly can we have this as * /analytics/{tableName}?*
>>>>>>>>
>>>>>>>>>
>>>>>>>>> 7. Create records ( can be created in different tables or in the
>>>>>>>>> same )
>>>>>>>>> *POST /analytics/records*
>>>>>>>>> ; Content - A list of records in json format like in below.
>>>>>>>>> [
>>>>>>>>>     {
>>>>>>>>>         "id": "id1",
>>>>>>>>>         "tenantId": -1234,
>>>>>>>>>         "tableName": "tableName1",
>>>>>>>>>         "timestamp": "yyyy-mm-dd hh:mm:ss",
>>>>>>>>>         "values":
>>>>>>>>>         {
>>>>>>>>>             "columnName1": "value1",
>>>>>>>>>             "columnName2": "value2"
>>>>>>>>>         }
>>>>>>>>>     },
>>>>>>>>>    {
>>>>>>>>>         "id": "id2",
>>>>>>>>>         "tenantId": -1234,
>>>>>>>>>         "tableName": "tableName2",
>>>>>>>>>         "timestamp": "yyyy-mm-dd hh:mm:ss",
>>>>>>>>>         "values":
>>>>>>>>>         {
>>>>>>>>>             "columnName1": "value1",
>>>>>>>>>             "columnName2": "value2"
>>>>>>>>>         }
>>>>>>>>>     },
>>>>>>>>> ]
>>>>>>>>>
>>>>>>>>> 8. Delete records
>>>>>>>>> *DELETE /analytics/records/{tableName}/{timeFrom}/{timeTo}*
>>>>>>>>> ; tableName - Name of the table from which the records are deleted.
>>>>>>>>> ; timeFrom - The starting time to delete records from.
>>>>>>>>> ; timeTo - The end time to delete records to.
>>>>>>>>>
>>>>>>>>>
>>>>>>>> Again do we need to have 'records' in the middle?  IMHO
>>>>>>>> /analytics/{tableName}/{timeFrom}/{timeTo} is better.
>>>>>>>>
>>>>>>>> 9. Update records
>>>>>>>>> *PUT /analytics/records*
>>>>>>>>> ; Content - As same as the POST method for creating records
>>>>>>>>>
>>>>>>>>> 10. Get the record count of table
>>>>>>>>> *GET /analytics/count/{tableName}*
>>>>>>>>> ; tableName - The name of the table
>>>>>>>>>
>>>>>>>>> 11. Create Indices for a table
>>>>>>>>> *POST /analytics/indices/{tableName}*
>>>>>>>>> ; tableName - The name of the table of which the indices are set
>>>>>>>>> ; Content - takes the following format. TYPE is one of "INTEGER",
>>>>>>>>> "BOOLEAN", "DOUBLE", "STRING", "FLOAT", "LONG"
>>>>>>>>> {
>>>>>>>>>     "indexColumnName1" : "TYPE1",
>>>>>>>>>     "indexColumnName2" : "TYPE2"
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>
>>>>>>>>> 12. get the indices of a table
>>>>>>>>> *GET /analytics/indices/{tableName}*
>>>>>>>>> ; tableName - The name of the table
>>>>>>>>> ; Response will be of the format of the previous POST request's
>>>>>>>>> Content.
>>>>>>>>>
>>>>>>>>> 13. Clear the indices of a table
>>>>>>>>> *DELETE /analytics/indices/{tableName}*
>>>>>>>>> ; tableName - The name of the table
>>>>>>>>>
>>>>>>>>> 14. Search records of a table
>>>>>>>>> *POST /analytics/search*
>>>>>>>>> ; Content - takes the following format
>>>>>>>>> {
>>>>>>>>>     "tableName": "sampleTableName",
>>>>>>>>>     "language": "sampleLanguageName",
>>>>>>>>>     "query": "sampleQuery",
>>>>>>>>>     "start": "start-location-of-the-result",
>>>>>>>>>     "count": "maximum-number-of-entries-to-return"
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>
>>>>>>>> IMHO this should be a GET request.
>>>>>>>>
>>>>>>>
>>>>>>> Here the problem is, that the search method in AnalyticsDataService
>>>>>>> takes few parameters. If we are to implement it as a GET, then we will 
>>>>>>> have
>>>>>>> to put all the parameters in the URL itself.
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Sinthuja.
>>>>>>>>
>>>>>>>>
>>>>>>>>> If a method does not have a specific response mentioned above, the
>>>>>>>>> response will take the following format.
>>>>>>>>>
>>>>>>>>> {
>>>>>>>>> "status" : "statusValue",
>>>>>>>>> "message" : "sampleMessage"
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Suggestions and feedbacks are appreciated.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Gimanthaa Bandara
>>>>>>>>> Software Engineer
>>>>>>>>> WSO2. Inc : http://wso2.com
>>>>>>>>> Mobile : +94714961919
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Architecture mailing list
>>>>>>>>> Architecture@wso2.org
>>>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Sinthuja Rajendran*
>>>>>>>> Senior Software Engineer <http://wso2.com/>
>>>>>>>> WSO2, Inc.:http://wso2.com
>>>>>>>>
>>>>>>>> Blog: http://sinthu-rajan.blogspot.com/
>>>>>>>> Mobile: +94774273955
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Architecture mailing list
>>>>>>>> Architecture@wso2.org
>>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Gimantha Bandara
>>>>>>> Software Engineer
>>>>>>> WSO2. Inc : http://wso2.com
>>>>>>> Mobile : +94714961919
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Sinthuja Rajendran*
>>>>>> Senior Software Engineer <http://wso2.com/>
>>>>>> WSO2, Inc.:http://wso2.com
>>>>>>
>>>>>> Blog: http://sinthu-rajan.blogspot.com/
>>>>>> Mobile: +94774273955
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Gimantha Bandara
>>>>> Software Engineer
>>>>> WSO2. Inc : http://wso2.com
>>>>> Mobile : +94714961919
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Gimantha Bandara
>>> Software Engineer
>>> WSO2. Inc : http://wso2.com
>>> Mobile : +94714961919
>>>
>>> _______________________________________________
>>> Architecture mailing list
>>> Architecture@wso2.org
>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>>>
>>>
>>
>>
>> --
>> *Anjana Fernando*
>> Senior Technical Lead
>> WSO2 Inc. | http://wso2.com
>> lean . enterprise . middleware
>>
>> _______________________________________________
>> Architecture mailing list
>> Architecture@wso2.org
>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>>
>>
>
>
> --
> Gimantha Bandara
> Software Engineer
> WSO2. Inc : http://wso2.com
> Mobile : +94714961919
>
> _______________________________________________
> Architecture mailing list
> Architecture@wso2.org
> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>
>


-- 
Roshan Wijesena.
Senior Software Engineer-WSO2 Inc.
Mobile: *+94719154640*
Email: ros...@wso2.com
*WSO2, Inc. :** wso2.com <http://wso2.com/>*
lean.enterprise.middleware.
_______________________________________________
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to