pcre match optimization
This commit is contained in:
parent
5137d4d8e4
commit
e4eada3250
2 changed files with 44 additions and 10 deletions
|
@ -577,3 +577,14 @@
|
||||||
1401883468,11467197.28,4422749.94,72315.59,2289153.70
|
1401883468,11467197.28,4422749.94,72315.59,2289153.70
|
||||||
1401883480,11087024.10,4312175.00,55188.21,2296830.48
|
1401883480,11087024.10,4312175.00,55188.21,2296830.48
|
||||||
1401883491,10824939.64,4586578.13,71089.90,2213391.27
|
1401883491,10824939.64,4586578.13,71089.90,2213391.27
|
||||||
|
1401925066,10935008.42,4088160.37,77672.30,2302477.76
|
||||||
|
1401925276,10973173.75,4511027.12,49932.19,2329103.54
|
||||||
|
1401925287,11654811.40,4536210.26,72315.59,2379382.00
|
||||||
|
1401925299,11573243.70,3894464.26,59074.70,2276455.83
|
||||||
|
1401925310,11944273.21,4666625.62,62601.55,2304322.33
|
||||||
|
1401925322,11775622.43,3945455.94,43690.67,2149656.21
|
||||||
|
1401925333,11539429.12,4630751.73,43240.25,2270121.49
|
||||||
|
1401925344,11312437.08,4589657.39,62601.55,2329731.93
|
||||||
|
1401925356,10802425.91,3920785.56,55924.05,2346753.13
|
||||||
|
1401925370,8139871.96,2999119.49,61680.94,2067285.17
|
||||||
|
1401925386,5893728.90,3762869.89,32263.88,1609723.24
|
||||||
|
|
Can't render this file because it has a wrong number of fields in line 447.
|
43
src/node.c
43
src/node.c
|
@ -361,28 +361,51 @@ node * r3_tree_matchl(const node * n, const char * path, int path_len, match_ent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
restlen = path_len - ov[1]; // if it's fully matched to the end (rest string length)
|
||||||
|
|
||||||
|
if (restlen == 0 ) {
|
||||||
|
// Check the substring to decide we should go deeper on which edge
|
||||||
|
for (i = 1; i < rc; i++)
|
||||||
|
{
|
||||||
|
substring_length = ov[2*i+1] - ov[2*i];
|
||||||
|
|
||||||
|
// if it's not matched for this edge, just skip them quickly
|
||||||
|
if (substring_length == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
substring_start = path + ov[2*i];
|
||||||
|
e = n->edges[i - 1];
|
||||||
|
|
||||||
|
if (entry && e->has_slug) {
|
||||||
|
// append captured token to entry
|
||||||
|
str_array_append(entry->vars , zstrndup(substring_start, substring_length));
|
||||||
|
}
|
||||||
|
|
||||||
|
// since restlen == 0 return the edge quickly.
|
||||||
|
return e->child && e->child->endpoint > 0 ? e->child : NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Check the substring to decide we should go deeper on which edge
|
||||||
for (i = 1; i < rc; i++)
|
for (i = 1; i < rc; i++)
|
||||||
{
|
{
|
||||||
substring_start = path + ov[2*i];
|
|
||||||
substring_length = ov[2*i+1] - ov[2*i];
|
substring_length = ov[2*i+1] - ov[2*i];
|
||||||
// info("%2d: %.*s\n", i, substring_length, substring_start);
|
|
||||||
|
|
||||||
|
// if it's not matched for this edge, just skip them quickly
|
||||||
if ( substring_length == 0) {
|
if ( substring_length == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
restlen = path_len - ov[1]; // fully match to the end
|
substring_start = path + ov[2*i];
|
||||||
// info("matched item => restlen:%d edges:%d i:%d\n", restlen, n->edge_len, i);
|
|
||||||
|
|
||||||
e = n->edges[i - 1];
|
e = n->edges[i - 1];
|
||||||
|
|
||||||
if (entry && e->has_slug) {
|
if (entry && e->has_slug) {
|
||||||
// append captured token to entry
|
// append captured token to entry
|
||||||
str_array_append(entry->vars , zstrndup(substring_start, substring_length));
|
str_array_append(entry->vars , zstrndup(substring_start, substring_length));
|
||||||
}
|
}
|
||||||
if (restlen == 0 ) {
|
|
||||||
return e->child && e->child->endpoint > 0 ? e->child : NULL;
|
|
||||||
}
|
|
||||||
// get the length of orginal string: $0
|
// get the length of orginal string: $0
|
||||||
return r3_tree_matchl( e->child, path + (ov[1] - ov[0]), restlen, entry);
|
return r3_tree_matchl( e->child, path + (ov[1] - ov[0]), restlen, entry);
|
||||||
}
|
}
|
||||||
|
@ -419,8 +442,8 @@ route * r3_tree_match_route(const node *tree, match_entry * entry) {
|
||||||
|
|
||||||
inline edge * r3_node_find_edge_str(const node * n, const char * str, int str_len) {
|
inline edge * r3_node_find_edge_str(const node * n, const char * str, int str_len) {
|
||||||
char firstbyte = *str;
|
char firstbyte = *str;
|
||||||
unsigned int i = n->edge_len;
|
unsigned int i;
|
||||||
while (i--) {
|
for (i = n->edge_len; i--; ) {
|
||||||
if ( firstbyte == *(n->edges[i]->pattern) ) {
|
if ( firstbyte == *(n->edges[i]->pattern) ) {
|
||||||
info("matching '%s' with '%s'\n", str, node_edge_pattern(n,i) );
|
info("matching '%s' with '%s'\n", str, node_edge_pattern(n,i) );
|
||||||
if ( strncmp( node_edge_pattern(n,i), str, node_edge_pattern_len(n,i) ) == 0 ) {
|
if ( strncmp( node_edge_pattern(n,i), str, node_edge_pattern_len(n,i) ) == 0 ) {
|
||||||
|
|
Loading…
Reference in a new issue