1 /* filterindex.c - generate the list of candidate entries from a filter */
4 * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
11 #include <ac/string.h>
16 static int presence_candidates(
18 AttributeDescription *desc,
21 static int equality_candidates(
23 AttributeAssertion *ava,
26 static int approx_candidates(
28 AttributeAssertion *ava,
31 static int substring_candidates(
33 SubstringsAssertion *sub,
37 static int list_candidates(
46 bdb_filter_candidates(
55 LDAP_LOG ( INDEX, ENTRY, "=> bdb_filter_candidates\n", 0, 0, 0 );
57 Debug( LDAP_DEBUG_FILTER, "=> bdb_filter_candidates\n", 0, 0, 0 );
60 switch ( f->f_choice ) {
61 case SLAPD_FILTER_DN_ONE:
63 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN ONE\n", 0, 0, 0 );
65 Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 );
67 rc = bdb_dn2idl( be, f->f_dn, DN_ONE_PREFIX, ids );
68 if( rc == DB_NOTFOUND ) {
74 case SLAPD_FILTER_DN_SUBTREE:
76 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN SUBTREE\n", 0, 0, 0 );
78 Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 );
80 rc = bdb_dn2idl( be, f->f_dn, DN_SUBTREE_PREFIX, ids );
83 case LDAP_FILTER_PRESENT:
85 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tPRESENT\n", 0, 0, 0 );
87 Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
89 rc = presence_candidates( be, f->f_desc, ids );
92 case LDAP_FILTER_EQUALITY:
94 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tEQUALITY\n", 0, 0, 0 );
96 Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );
98 rc = equality_candidates( be, f->f_ava, ids, tmp );
101 case LDAP_FILTER_APPROX:
103 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAPPROX\n", 0, 0, 0 );
105 Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
107 rc = approx_candidates( be, f->f_ava, ids, tmp );
110 case LDAP_FILTER_SUBSTRINGS:
112 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tSUBSTRINGS\n", 0, 0, 0 );
114 Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
116 rc = substring_candidates( be, f->f_sub, ids, tmp );
120 /* no GE index, use pres */
122 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tGE\n", 0, 0, 0 );
124 Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
126 rc = presence_candidates( be, f->f_ava->aa_desc, ids );
130 /* no LE index, use pres */
132 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tLE\n", 0, 0, 0 );
134 Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
136 rc = presence_candidates( be, f->f_ava->aa_desc, ids );
139 case LDAP_FILTER_NOT:
140 /* no indexing to support NOT filters */
142 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tNOT\n",0, 0, 0 );
144 Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
146 { struct bdb_info *bdb = (struct bdb_info *) be->be_private;
147 BDB_IDL_ALL( bdb, ids );
151 case LDAP_FILTER_AND:
153 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAND\n", 0, 0, 0 );
155 Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
157 rc = list_candidates( be,
158 f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
163 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tOR\n", 0, 0, 0 );
165 Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
167 rc = list_candidates( be,
168 f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
173 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tUNKNOWN\n", 0, 0, 0 );
175 Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
176 (unsigned long) f->f_choice, 0, 0 );
178 /* Must not return NULL, otherwise extended filters break */
179 { struct bdb_info *bdb = (struct bdb_info *) be->be_private;
180 BDB_IDL_ALL( bdb, ids );
185 LDAP_LOG ( INDEX, RESULTS,
186 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
187 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long) BDB_IDL_LAST( ids ));
189 Debug( LDAP_DEBUG_FILTER,
190 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
192 (long) BDB_IDL_FIRST( ids ),
193 (long) BDB_IDL_LAST( ids ) );
208 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
213 LDAP_LOG ( INDEX, ARGS, "=> bdb_list_candidates: 0x%x\n", ftype, 0 , 0 );
215 Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
218 for ( f = flist; f != NULL; f = f->f_next ) {
219 rc = bdb_filter_candidates( be, f, save, tmp,
220 save+BDB_IDL_UM_SIZE );
223 if ( ftype == LDAP_FILTER_AND ) {
230 if ( ftype == LDAP_FILTER_AND ) {
232 BDB_IDL_CPY( ids, save );
234 bdb_idl_intersection( ids, save );
236 if( BDB_IDL_IS_ZERO( ids ) )
240 BDB_IDL_CPY( ids, save );
242 bdb_idl_union( ids, save );
247 if( rc == LDAP_SUCCESS ) {
249 LDAP_LOG ( INDEX, RESULTS,
250 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
251 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
252 (long) BDB_IDL_LAST( ids ) );
254 Debug( LDAP_DEBUG_FILTER,
255 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
257 (long) BDB_IDL_FIRST(ids),
258 (long) BDB_IDL_LAST(ids) );
263 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
265 Debug( LDAP_DEBUG_FILTER,
266 "<= bdb_list_candidates: undefined rc=%d\n",
277 AttributeDescription *desc,
280 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
284 struct berval prefix = {0, NULL};
287 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
288 desc->ad_cname.bv_val, 0, 0 );
290 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
291 desc->ad_cname.bv_val, 0, 0 );
294 if( desc == slap_schema.si_ad_objectClass ) {
295 BDB_IDL_ALL( bdb, ids );
299 rc = bdb_index_param( be, desc, LDAP_FILTER_PRESENT,
300 &db, &mask, &prefix );
302 if( rc != LDAP_SUCCESS ) {
304 LDAP_LOG ( INDEX, RESULTS,
305 "<= bdb_presence_candidates: (%s) index_param "
307 desc->ad_cname.bv_val, rc, 0 );
309 Debug( LDAP_DEBUG_TRACE,
310 "<= bdb_presence_candidates: (%s) index_param "
312 desc->ad_cname.bv_val, rc, 0 );
320 LDAP_LOG(INDEX, RESULTS,
321 "<= bdb_presence_candidates: (%s) not indexed\n",
322 desc->ad_cname.bv_val, 0, 0 );
324 Debug( LDAP_DEBUG_TRACE,
325 "<= bdb_presence_candidates: (%s) not indexed\n",
326 desc->ad_cname.bv_val, 0, 0 );
331 if( prefix.bv_val == NULL ) {
333 LDAP_LOG(INDEX, RESULTS,
334 "<= bdb_presence_candidates: (%s) no prefix\n",
335 desc->ad_cname.bv_val, 0, 0 );
337 Debug( LDAP_DEBUG_TRACE,
338 "<= bdb_presence_candidates: (%s) no prefix\n",
339 desc->ad_cname.bv_val, 0, 0 );
344 rc = bdb_key_read( be, db, NULL, &prefix, ids );
346 if( rc == DB_NOTFOUND ) {
349 } else if( rc != LDAP_SUCCESS ) {
351 LDAP_LOG ( INDEX, RESULTS,
352 "<= bdb_presence_candidates: (%s) "
353 "key read failed (%d)\n",
354 desc->ad_cname.bv_val, rc, 0 );
356 Debug( LDAP_DEBUG_TRACE,
357 "<= bdb_presense_candidates: (%s) "
358 "key read failed (%d)\n",
359 desc->ad_cname.bv_val, rc, 0 );
365 LDAP_LOG ( INDEX, RESULTS,
366 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
367 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
369 Debug(LDAP_DEBUG_TRACE,
370 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
372 (long) BDB_IDL_FIRST(ids),
373 (long) BDB_IDL_LAST(ids) );
383 AttributeAssertion *ava,
391 struct berval prefix = {0, NULL};
392 struct berval *keys = NULL;
396 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
397 ava->aa_desc->ad_cname.bv_val, 0, 0 );
399 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
400 ava->aa_desc->ad_cname.bv_val, 0, 0 );
403 rc = bdb_index_param( be, ava->aa_desc, LDAP_FILTER_EQUALITY,
404 &db, &mask, &prefix );
406 if( rc != LDAP_SUCCESS ) {
408 LDAP_LOG ( INDEX, RESULTS,
409 "<= bdb_equality_candidates: (%s) "
410 "index_param failed (%d)\n",
411 ava->aa_desc->ad_cname.bv_val, rc, 0);
413 Debug( LDAP_DEBUG_ANY,
414 "<= bdb_equality_candidates: (%s) "
415 "index_param failed (%d)\n",
416 ava->aa_desc->ad_cname.bv_val, rc, 0 );
423 LDAP_LOG(INDEX, RESULTS,
424 "<= bdb_equality_candidates: (%s) not indexed\n",
425 ava->aa_desc->ad_cname.bv_val, 0, 0 );
427 Debug( LDAP_DEBUG_ANY,
428 "<= bdb_equality_candidates: (%s) not indexed\n",
429 ava->aa_desc->ad_cname.bv_val, 0, 0 );
434 mr = ava->aa_desc->ad_type->sat_equality;
439 if( !mr->smr_filter ) {
443 rc = (mr->smr_filter)(
444 LDAP_FILTER_EQUALITY,
446 ava->aa_desc->ad_type->sat_syntax,
452 if( rc != LDAP_SUCCESS ) {
454 LDAP_LOG ( INDEX, RESULTS,
455 "<= bdb_equality_candidates: (%s, %s) "
456 "MR filter failed (%d)\n",
457 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
459 Debug( LDAP_DEBUG_TRACE,
460 "<= bdb_equality_candidates: (%s, %s) "
461 "MR filter failed (%d)\n",
462 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
469 LDAP_LOG ( INDEX, RESULTS,
470 "<= bdb_equality_candidates: (%s) no keys\n",
471 ava->aa_desc->ad_cname.bv_val, 0, 0 );
473 Debug( LDAP_DEBUG_TRACE,
474 "<= bdb_equality_candidates: (%s) no keys\n",
475 ava->aa_desc->ad_cname.bv_val, 0, 0 );
480 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
481 rc = bdb_key_read( be, db, NULL, &keys[i], tmp );
483 if( rc == DB_NOTFOUND ) {
486 } else if( rc != LDAP_SUCCESS ) {
488 LDAP_LOG ( INDEX, RESULTS,
489 "<= bdb_equality_candidates: (%s) "
490 "key read failed (%d)\n",
491 ava->aa_desc->ad_cname.bv_val, rc, 0 );
493 Debug( LDAP_DEBUG_TRACE,
494 "<= bdb_equality_candidates: (%s) "
495 "key read failed (%d)\n",
496 ava->aa_desc->ad_cname.bv_val, rc, 0 );
501 if( BDB_IDL_IS_ZERO( tmp ) ) {
503 LDAP_LOG ( INDEX, RESULTS,
504 "<= bdb_equality_candidates: (%s) NULL\n",
505 ava->aa_desc->ad_cname.bv_val, 0, 0);
507 Debug( LDAP_DEBUG_TRACE,
508 "<= bdb_equality_candidates: (%s) NULL\n",
509 ava->aa_desc->ad_cname.bv_val, 0, 0 );
516 BDB_IDL_CPY( ids, tmp );
518 bdb_idl_intersection( ids, tmp );
521 if( BDB_IDL_IS_ZERO( ids ) )
525 ber_bvarray_free( keys );
528 LDAP_LOG ( INDEX, RESULTS,
529 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
530 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
531 (long) BDB_IDL_LAST( ids ) );
533 Debug( LDAP_DEBUG_TRACE,
534 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
536 (long) BDB_IDL_FIRST(ids),
537 (long) BDB_IDL_LAST(ids) );
546 AttributeAssertion *ava,
554 struct berval prefix = {0, NULL};
555 struct berval *keys = NULL;
559 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
560 ava->aa_desc->ad_cname.bv_val, 0, 0 );
562 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
563 ava->aa_desc->ad_cname.bv_val, 0, 0 );
566 rc = bdb_index_param( be, ava->aa_desc, LDAP_FILTER_APPROX,
567 &db, &mask, &prefix );
569 if( rc != LDAP_SUCCESS ) {
571 LDAP_LOG ( INDEX, RESULTS,
572 "<= bdb_approx_candidates: (%s) "
573 "index_param failed (%d)\n",
574 ava->aa_desc->ad_cname.bv_val, rc, 0 );
576 Debug( LDAP_DEBUG_ANY,
577 "<= bdb_approx_candidates: (%s) "
578 "index_param failed (%d)\n",
579 ava->aa_desc->ad_cname.bv_val, rc, 0 );
586 LDAP_LOG(INDEX, RESULTS,
587 "<= bdb_approx_candidates: (%s) not indexed\n",
588 ava->aa_desc->ad_cname.bv_val, 0, 0 );
590 Debug( LDAP_DEBUG_ANY,
591 "<= bdb_approx_candidates: (%s) not indexed\n",
592 ava->aa_desc->ad_cname.bv_val, 0, 0 );
597 mr = ava->aa_desc->ad_type->sat_approx;
599 /* no approx matching rule, try equality matching rule */
600 mr = ava->aa_desc->ad_type->sat_equality;
607 if( !mr->smr_filter ) {
611 rc = (mr->smr_filter)(
614 ava->aa_desc->ad_type->sat_syntax,
620 if( rc != LDAP_SUCCESS ) {
622 LDAP_LOG ( INDEX, RESULTS,
623 "<= bdb_approx_candidates: (%s, %s) "
624 "MR filter failed (%d)\n",
625 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
627 Debug( LDAP_DEBUG_TRACE,
628 "<= bdb_approx_candidates: (%s, %s) "
629 "MR filter failed (%d)\n",
630 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
637 LDAP_LOG ( INDEX, RESULTS,
638 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
639 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
641 Debug( LDAP_DEBUG_TRACE,
642 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
643 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
648 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
649 rc = bdb_key_read( be, db, NULL, &keys[i], tmp );
651 if( rc == DB_NOTFOUND ) {
655 } else if( rc != LDAP_SUCCESS ) {
657 LDAP_LOG ( INDEX, RESULTS,
658 "<= bdb_approx_candidates: (%s) "
659 "key read failed (%d)\n",
660 ava->aa_desc->ad_cname.bv_val, rc, 0);
662 Debug( LDAP_DEBUG_TRACE,
663 "<= bdb_approx_candidates: (%s) "
664 "key read failed (%d)\n",
665 ava->aa_desc->ad_cname.bv_val, rc, 0 );
670 if( BDB_IDL_IS_ZERO( tmp ) ) {
672 LDAP_LOG ( INDEX, RESULTS,
673 "<= bdb_approx_candidates: (%s) NULL\n",
674 ava->aa_desc->ad_cname.bv_val, 0, 0 );
676 Debug( LDAP_DEBUG_TRACE,
677 "<= bdb_approx_candidates: (%s) NULL\n",
678 ava->aa_desc->ad_cname.bv_val, 0, 0 );
685 BDB_IDL_CPY( ids, tmp );
687 bdb_idl_intersection( ids, tmp );
690 if( BDB_IDL_IS_ZERO( ids ) )
694 ber_bvarray_free( keys );
697 LDAP_LOG ( INDEX, RESULTS,
698 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
699 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
700 (long) BDB_IDL_LAST( ids ) );
702 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
704 (long) BDB_IDL_FIRST(ids),
705 (long) BDB_IDL_LAST(ids) );
711 substring_candidates(
713 SubstringsAssertion *sub,
721 struct berval prefix = {0, NULL};
722 struct berval *keys = NULL;
726 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
727 sub->sa_desc->ad_cname.bv_val, 0, 0 );
729 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
730 sub->sa_desc->ad_cname.bv_val, 0, 0 );
733 rc = bdb_index_param( be, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
734 &db, &mask, &prefix );
736 if( rc != LDAP_SUCCESS ) {
738 LDAP_LOG ( INDEX, RESULTS,
739 "<= bdb_substring_candidates: (%s) "
740 "index_param failed (%d)\n",
741 sub->sa_desc->ad_cname.bv_val, rc, 0);
743 Debug( LDAP_DEBUG_ANY,
744 "<= bdb_substring_candidates: (%s) "
745 "index_param failed (%d)\n",
746 sub->sa_desc->ad_cname.bv_val, rc, 0 );
753 LDAP_LOG ( INDEX, RESULTS,
754 "<= bdb_substring_candidates: (%s) not indexed\n",
755 sub->sa_desc->ad_cname.bv_val, 0, 0 );
757 Debug( LDAP_DEBUG_ANY,
758 "<= bdb_substring_candidates: (%s) not indexed\n",
759 sub->sa_desc->ad_cname.bv_val, 0, 0 );
764 mr = sub->sa_desc->ad_type->sat_substr;
770 if( !mr->smr_filter ) {
774 rc = (mr->smr_filter)(
775 LDAP_FILTER_SUBSTRINGS,
777 sub->sa_desc->ad_type->sat_syntax,
783 if( rc != LDAP_SUCCESS ) {
785 LDAP_LOG ( INDEX, RESULTS,
786 "<= bdb_substring_candidates: (%s) "
787 "MR filter failed (%d)\n",
788 sub->sa_desc->ad_cname.bv_val, rc, 0 );
790 Debug( LDAP_DEBUG_TRACE,
791 "<= bdb_substring_candidates: (%s) "
792 "MR filter failed (%d)\n",
793 sub->sa_desc->ad_cname.bv_val, rc, 0 );
800 LDAP_LOG ( INDEX, RESULTS,
801 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
802 mask, sub->sa_desc->ad_cname.bv_val, 0 );
804 Debug( LDAP_DEBUG_TRACE,
805 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
806 mask, sub->sa_desc->ad_cname.bv_val, 0 );
811 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
812 rc = bdb_key_read( be, db, NULL, &keys[i], tmp );
814 if( rc == DB_NOTFOUND ) {
818 } else if( rc != LDAP_SUCCESS ) {
820 LDAP_LOG ( INDEX, RESULTS,
821 "<= bdb_substring_candidates: (%s) "
822 "key read failed (%d)\n",
823 sub->sa_desc->ad_cname.bv_val, rc, 0 );
825 Debug( LDAP_DEBUG_TRACE,
826 "<= bdb_substring_candidates: (%s) "
827 "key read failed (%d)\n",
828 sub->sa_desc->ad_cname.bv_val, rc, 0 );
833 if( BDB_IDL_IS_ZERO( tmp ) ) {
835 LDAP_LOG ( INDEX, RESULTS,
836 "<= bdb_substring_candidates: (%s) NULL\n",
837 sub->sa_desc->ad_cname.bv_val, 0, 0 );
839 Debug( LDAP_DEBUG_TRACE,
840 "<= bdb_substring_candidates: (%s) NULL\n",
841 sub->sa_desc->ad_cname.bv_val, 0, 0 );
848 BDB_IDL_CPY( ids, tmp );
850 bdb_idl_intersection( ids, tmp );
853 if( BDB_IDL_IS_ZERO( ids ) )
857 ber_bvarray_free( keys );
860 LDAP_LOG ( INDEX, RESULTS,
861 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
862 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
863 (long) BDB_IDL_LAST( ids ) );
865 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
867 (long) BDB_IDL_FIRST(ids),
868 (long) BDB_IDL_LAST(ids) );