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
On Tue, 19 Jun 2007, Piotr Wadas wrote:
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
I guess I found it - the key is ORDERING keyword with attribute definition. mySearchAttr is an attribute defined in my own local.schema, so I changed definition, adding
ORDERING caseIgnoreOrderingMatch
and reindexed directory.
Now I can use a filter like (mySearchAttr<=aaaBBBcccDDDeeeFFF) - all attributes lexicographically less than or equal to simpleString, which does the job - seems to work. If I'm mistaken, please correct me :) letter case is not important for me in this particular situation.
Regards, Piotr
openldap-software@openldap.org