Did a blog post explaining the $subject, http://www.dimuthu.org/blog/2008/11/21/apache-axis2c-restful-url-mapping-algorithm/
Thanks Dimuthu On Thu, Nov 20, 2008 at 10:01 AM, Dimuthu Gamage <[EMAIL PROTECTED]> wrote: > Hi devs, > > As you may have already noticed, I changed the REST URL pattern matching > algorithm while fixing the > https://issues.apache.org/jira/browse/AXIS2C-1290 issue and the WSF/PHP > issue, https://wso2.org/jira/browse/WSFPHP-347. Since Apache's principle > is to 'Commit first' I committed the code first (after making sure > everything works), decided to start a discussion on that :) > > Basically What I have done is changing the code > 1. Initializing the REST Mapping per operation - > axis2_svc_get_rest_op_list_with_method_and_location ( in > src/core/description/svc.c) > 2. REST dispaching algorithm to find the operation and the matching > patterns - axis2_rest_disp_find_op (in src/core/engine/rest_disp.c ) > > At the initializing face It store the url pattern in a internal recursive > structure call 'axutil_core_utils_map_internal_t' whcih is only used inside > the core_utils.c function. And it store this structure for each operation in > the svc->op_rest_map hash. Here is the structure of the struct. > > /* internal structure to keep the rest map in a multi level hash */ > typedef struct { > /* the structure will keep as many as following fields */ > > /* if the mapped value is directly the operation */ > axis2_op_t *op_desc; > > /* if the mapped value is a constant, this keeps a hash map of > possible constants => corrosponding map_internal structure */ > axutil_hash_t *consts_map; > > /* if the mapped value is a param, this keeps a hash map of > possible param_values => corrosponding_map_internal structre */ > axutil_hash_t *params_map; > > } axutil_core_utils_map_internal_t; > > For an example think you have operations with following REST mapping > (Using the example attached in the > https://issues.apache.org/jira/browse/AXIS2C-1290 and > http://www.dimuthu.org/blog/2008/10/18/write-restful-services-in-c/ ) > > GET students > GET students/{stduent_id} > GET students/{student_id}/marks/{subject_id} > > Then thes svc->op_rest_map will be like > > <pre> > svc->op_rest_map (hash) > | > "GET:students" --------- axutil_core_utils_map_internal_t > (instance) > | > op_desc > (axis2_op_t* for "GET students" op) > | > consts_map (empty > hash) > | > params_map (hash) > | > > "{student_id}" ------------- axutil_core_utils_map_internal_t (instance) > > | > > op_desc (axis2_op_t* for "GET students/{student_id}" op) > > | > > parms_map (empty hash) > > | > > const_map (hash) > > | > > "marks" ------------------- > axutil_core_utils_map_internal_t (instance) > > | > > op_desc (NULL) > > | > > consts_map (empty > hash) > > | > > params_map (hash) > > > | > > > "{subject_id}" ----------- axutil_core_utils_map_internal_t (instance) > > > | > > op_desc (axis2_op_t* > for "GET students/{student_id}/marks/{subject_id}" op) > > | > > consts_map / params_map (Both NULL) > > > </pre> > > So at the Dispatching URL we can clearly sort out the operation and the > parameter values. > > For matching patterns like {student_id}, {subject_id} and more complex > matching like xx{p}yy{q}zz{r} the logic uses the function > axis2_core_utils_match_url_component_with_pattern ( in > src/core/util/core_utils.c) > This is O(n^2) order (in worse case) algorithm. > > And what I want to discuss is the point whether the above described logic > is better than the early logic which sequentilly checks all the mapping. > > Calculating the approximate time complexity takng n =numbe of operations, p > = average URL mapping length > The early logic = n/2 (<--go through all the operation in average) * > O(p^2) (<--the complexity of > axis2_core_utils_match_url_component_with_pattern) =>O (n*p^2) > > For the second logic it is really complex to do a methematical analysis of > the tiime complexity. Assuming (being optimistic:) average length of the url > component is d (d <= p) and the average parameters in a url is k (k <=p/d) > and taking hash search is O(1) > > The new logic = log(n) (<-- long n number of hash search) *(k*O(d^2)) (<-- > assuming k parameters have to execute the function > axis2_core_utils_match_url_component_with_pattern) => O(logn * k* d^2) > > Clearly O(logn *k *d ^2) < O(n*p^2) (taking logn < n and d <=p and k > <=p/d) > > Anyway the new logic contain some recursive functions and hash functions > heavily which may slow down things at little n (number of operations), > littld k (little number of url components) and little d (small length urls). > > > So my question is do we need to favor on the smal number of operation so go > back to old logic(after correcting bugs) or do we stay with the current > logic?. Your opinions? > > > > -- > Thanks, > Dimuthu Gamage > > http://www.dimuthu.org > http://www.wso2.org > -- Thanks, Dimuthu Gamage http://www.dimuthu.org http://www.wso2.org