[Date Prev][Date Next] [Chronological] [Thread] [Top]

search practice



Hello,
Using openldap 2.3.35.

I have some simpleString like "aaaBBBcccDDDeeeFFF", and I want
to find entries, in which a specified attribute "mySearchAttr"
has values like

entry 1:
mySearchAttr=aaaBBBcccDD

entry 2:
mySearchAttr=aa

entry 3:
mySearchAttr=aaaBBBc

entry 4:
mySearchAttr=aaaBBBcccDDDeeeFFF

and example entries which should NOT be covered by search:

entry 5:
mySearchAttr=aaaBBBcccDDDeeeFFFgggHHH

entry 6:
mySearchAttr=XXXyyyZZZaaaBBBcccDDDeeeFFFxxxYYYzzz

entry 7:
mySearchAttr=XXXyyyZZZaaaBBBcccXXXyyyZZZ

and so on. 
In other words, I want to find all entries having
a value of mySearchAttr attribute starting with
the same characters as simpleString, and shorter than or
equal to simpleString. 

What would be best practice to do such search? I imagined
three versions:

a. iterate over simpleString from 0 to strlen(simpleString) - 1, 
and do a search for 
"mySearchAttr=a", then for "mySearchAttr=aa", ..., 
then for "mySearchAttr=aaaBBBcccDDD" and so on until
end of simpleString is reached. But this would be
probably inefficient, regarding number of searches.

b. iterate over simpleString from 0 to strlen(simpleString) -1,
and build a really long filter from all partial strings, like

(|(mySearchAttr=a)(mySearchAttr=aa)(mySearchAttr=aaa)...)

but the string may be even 100+ characters long, so filter
would have 100+ conditions in it, which also seems not so well).

c. find all entries which have (myAttrSearch=*), sort by myAttrSearch,
and then iterate over search result, to extract final set of entries,
which have myAttrSearch matching all partial strings of simpleString.
But actually I don't even need to know all strings, I need
only the first one found.

On one hand - simpleString may be long. on the other hand - number
of entries (c) may hundreds, or even thousands of entries,
and all partial strings of simpleString should be compared to each
value of mySearchAttr attribute.

Finally I search for mySearchAtt=*, then I sort, next I iterate
over search result, and for each entry, and each attribute value,
next if the value is shorter than or equal to simpleString, I iterate over 
all partial strings (starting from left), and matching by some strcasecmp 
- all of this until the first is found. Even some regex value
matching wouldn't be solution for "aa", ..., "aaaBBB",...

Any hints ? Actually mySearchAttr keeps for me some filesystem object name
string. Knowing some fsobject name like /some/dir/subfileordir, I want 
to find all entries, which are related to objects _above_ my fsobject 
in filesystem directory tree. I have no special characters in directory 
and file names, only letters, digits and slashes. This actually
is used to check some fs directory access permissions - to determine
whether access to /some/sub/dir/or/file should be granted, I need
to make sure, that there's no above object which restricts access,
it should work like http access control.

Isn't there really some filter to cover this? Did I miss something
trivial? :)

Regards,
Piotr