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( op->o_bd, 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( op->o_bd, 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( op, 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( op, 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( op, 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( op, 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( op, 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( op, 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 *) op->o_bd->be_private;
147 BDB_IDL_ALL( bdb, ids );
152 case LDAP_FILTER_AND:
154 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAND\n", 0, 0, 0 );
156 Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
158 rc = list_candidates( op,
159 f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
164 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tOR\n", 0, 0, 0 );
166 Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
168 rc = list_candidates( op,
169 f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
174 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tUNKNOWN\n", 0, 0, 0 );
176 Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
177 (unsigned long) f->f_choice, 0, 0 );
182 LDAP_LOG ( INDEX, RESULTS,
183 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
184 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long) BDB_IDL_LAST( ids ));
186 Debug( LDAP_DEBUG_FILTER,
187 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
189 (long) BDB_IDL_FIRST( ids ),
190 (long) BDB_IDL_LAST( ids ) );
205 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
210 LDAP_LOG ( INDEX, ARGS, "=> bdb_list_candidates: 0x%x\n", ftype, 0 , 0 );
212 Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
215 if ( ftype == LDAP_FILTER_OR ) {
216 BDB_IDL_ALL( bdb, save );
219 BDB_IDL_CPY( save, ids );
222 for ( f = flist; f != NULL; f = f->f_next ) {
223 rc = bdb_filter_candidates( op, f, save, tmp,
224 save+BDB_IDL_UM_SIZE );
227 if ( ftype == LDAP_FILTER_AND ) {
234 if ( ftype == LDAP_FILTER_AND ) {
235 bdb_idl_intersection( ids, save );
236 if( BDB_IDL_IS_ZERO( ids ) )
239 bdb_idl_union( ids, save );
240 BDB_IDL_ALL( bdb, save );
244 if( rc == LDAP_SUCCESS ) {
246 LDAP_LOG ( INDEX, RESULTS,
247 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
248 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
249 (long) BDB_IDL_LAST( ids ) );
251 Debug( LDAP_DEBUG_FILTER,
252 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
254 (long) BDB_IDL_FIRST(ids),
255 (long) BDB_IDL_LAST(ids) );
260 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
262 Debug( LDAP_DEBUG_FILTER,
263 "<= bdb_list_candidates: undefined rc=%d\n",
274 AttributeDescription *desc,
277 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
281 struct berval prefix = {0, NULL};
284 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
285 desc->ad_cname.bv_val, 0, 0 );
287 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
288 desc->ad_cname.bv_val, 0, 0 );
291 if( desc == slap_schema.si_ad_objectClass ) {
292 BDB_IDL_ALL( bdb, ids );
296 rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT,
297 &db, &mask, &prefix );
299 if( rc != LDAP_SUCCESS ) {
301 LDAP_LOG ( INDEX, RESULTS,
302 "<= bdb_presence_candidates: (%s) index_param "
304 desc->ad_cname.bv_val, rc, 0 );
306 Debug( LDAP_DEBUG_TRACE,
307 "<= bdb_presence_candidates: (%s) index_param "
309 desc->ad_cname.bv_val, rc, 0 );
317 LDAP_LOG(INDEX, RESULTS,
318 "<= bdb_presence_candidates: (%s) not indexed\n",
319 desc->ad_cname.bv_val, 0, 0 );
321 Debug( LDAP_DEBUG_TRACE,
322 "<= bdb_presence_candidates: (%s) not indexed\n",
323 desc->ad_cname.bv_val, 0, 0 );
328 if( prefix.bv_val == NULL ) {
330 LDAP_LOG(INDEX, RESULTS,
331 "<= bdb_presence_candidates: (%s) no prefix\n",
332 desc->ad_cname.bv_val, 0, 0 );
334 Debug( LDAP_DEBUG_TRACE,
335 "<= bdb_presence_candidates: (%s) no prefix\n",
336 desc->ad_cname.bv_val, 0, 0 );
341 rc = bdb_key_read( op->o_bd, db, NULL, &prefix, ids );
343 if( rc == DB_NOTFOUND ) {
346 } else if( rc != LDAP_SUCCESS ) {
348 LDAP_LOG ( INDEX, RESULTS,
349 "<= bdb_presence_candidates: (%s) "
350 "key read failed (%d)\n",
351 desc->ad_cname.bv_val, rc, 0 );
353 Debug( LDAP_DEBUG_TRACE,
354 "<= bdb_presense_candidates: (%s) "
355 "key read failed (%d)\n",
356 desc->ad_cname.bv_val, rc, 0 );
362 LDAP_LOG ( INDEX, RESULTS,
363 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
364 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
366 Debug(LDAP_DEBUG_TRACE,
367 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
369 (long) BDB_IDL_FIRST(ids),
370 (long) BDB_IDL_LAST(ids) );
380 AttributeAssertion *ava,
388 struct berval prefix = {0, NULL};
389 struct berval *keys = NULL;
393 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
394 ava->aa_desc->ad_cname.bv_val, 0, 0 );
396 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
397 ava->aa_desc->ad_cname.bv_val, 0, 0 );
400 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
401 &db, &mask, &prefix );
403 if( rc != LDAP_SUCCESS ) {
405 LDAP_LOG ( INDEX, RESULTS,
406 "<= bdb_equality_candidates: (%s) "
407 "index_param failed (%d)\n",
408 ava->aa_desc->ad_cname.bv_val, rc, 0);
410 Debug( LDAP_DEBUG_ANY,
411 "<= bdb_equality_candidates: (%s) "
412 "index_param failed (%d)\n",
413 ava->aa_desc->ad_cname.bv_val, rc, 0 );
420 LDAP_LOG(INDEX, RESULTS,
421 "<= bdb_equality_candidates: (%s) not indexed\n",
422 ava->aa_desc->ad_cname.bv_val, 0, 0 );
424 Debug( LDAP_DEBUG_ANY,
425 "<= bdb_equality_candidates: (%s) not indexed\n",
426 ava->aa_desc->ad_cname.bv_val, 0, 0 );
431 mr = ava->aa_desc->ad_type->sat_equality;
436 if( !mr->smr_filter ) {
440 rc = (mr->smr_filter)(
441 LDAP_FILTER_EQUALITY,
443 ava->aa_desc->ad_type->sat_syntax,
447 &keys, op->o_tmpmemctx );
449 if( rc != LDAP_SUCCESS ) {
451 LDAP_LOG ( INDEX, RESULTS,
452 "<= bdb_equality_candidates: (%s, %s) "
453 "MR filter failed (%d)\n",
454 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
456 Debug( LDAP_DEBUG_TRACE,
457 "<= bdb_equality_candidates: (%s, %s) "
458 "MR filter failed (%d)\n",
459 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
466 LDAP_LOG ( INDEX, RESULTS,
467 "<= bdb_equality_candidates: (%s) no keys\n",
468 ava->aa_desc->ad_cname.bv_val, 0, 0 );
470 Debug( LDAP_DEBUG_TRACE,
471 "<= bdb_equality_candidates: (%s) no keys\n",
472 ava->aa_desc->ad_cname.bv_val, 0, 0 );
477 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
478 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
480 if( rc == DB_NOTFOUND ) {
483 } else if( rc != LDAP_SUCCESS ) {
485 LDAP_LOG ( INDEX, RESULTS,
486 "<= bdb_equality_candidates: (%s) "
487 "key read failed (%d)\n",
488 ava->aa_desc->ad_cname.bv_val, rc, 0 );
490 Debug( LDAP_DEBUG_TRACE,
491 "<= bdb_equality_candidates: (%s) "
492 "key read failed (%d)\n",
493 ava->aa_desc->ad_cname.bv_val, rc, 0 );
498 if( BDB_IDL_IS_ZERO( tmp ) ) {
500 LDAP_LOG ( INDEX, RESULTS,
501 "<= bdb_equality_candidates: (%s) NULL\n",
502 ava->aa_desc->ad_cname.bv_val, 0, 0);
504 Debug( LDAP_DEBUG_TRACE,
505 "<= bdb_equality_candidates: (%s) NULL\n",
506 ava->aa_desc->ad_cname.bv_val, 0, 0 );
512 bdb_idl_intersection( ids, tmp );
514 if( BDB_IDL_IS_ZERO( ids ) )
518 ber_bvarray_free_x( keys, op->o_tmpmemctx );
521 LDAP_LOG ( INDEX, RESULTS,
522 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
523 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
524 (long) BDB_IDL_LAST( ids ) );
526 Debug( LDAP_DEBUG_TRACE,
527 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
529 (long) BDB_IDL_FIRST(ids),
530 (long) BDB_IDL_LAST(ids) );
539 AttributeAssertion *ava,
547 struct berval prefix = {0, NULL};
548 struct berval *keys = NULL;
552 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
553 ava->aa_desc->ad_cname.bv_val, 0, 0 );
555 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
556 ava->aa_desc->ad_cname.bv_val, 0, 0 );
559 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
560 &db, &mask, &prefix );
562 if( rc != LDAP_SUCCESS ) {
564 LDAP_LOG ( INDEX, RESULTS,
565 "<= bdb_approx_candidates: (%s) "
566 "index_param failed (%d)\n",
567 ava->aa_desc->ad_cname.bv_val, rc, 0 );
569 Debug( LDAP_DEBUG_ANY,
570 "<= bdb_approx_candidates: (%s) "
571 "index_param failed (%d)\n",
572 ava->aa_desc->ad_cname.bv_val, rc, 0 );
579 LDAP_LOG(INDEX, RESULTS,
580 "<= bdb_approx_candidates: (%s) not indexed\n",
581 ava->aa_desc->ad_cname.bv_val, 0, 0 );
583 Debug( LDAP_DEBUG_ANY,
584 "<= bdb_approx_candidates: (%s) not indexed\n",
585 ava->aa_desc->ad_cname.bv_val, 0, 0 );
590 mr = ava->aa_desc->ad_type->sat_approx;
592 /* no approx matching rule, try equality matching rule */
593 mr = ava->aa_desc->ad_type->sat_equality;
600 if( !mr->smr_filter ) {
604 rc = (mr->smr_filter)(
607 ava->aa_desc->ad_type->sat_syntax,
611 &keys, op->o_tmpmemctx );
613 if( rc != LDAP_SUCCESS ) {
615 LDAP_LOG ( INDEX, RESULTS,
616 "<= bdb_approx_candidates: (%s, %s) "
617 "MR filter failed (%d)\n",
618 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
620 Debug( LDAP_DEBUG_TRACE,
621 "<= bdb_approx_candidates: (%s, %s) "
622 "MR filter failed (%d)\n",
623 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
630 LDAP_LOG ( INDEX, RESULTS,
631 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
632 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
634 Debug( LDAP_DEBUG_TRACE,
635 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
636 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
641 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
642 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
644 if( rc == DB_NOTFOUND ) {
648 } else if( rc != LDAP_SUCCESS ) {
650 LDAP_LOG ( INDEX, RESULTS,
651 "<= bdb_approx_candidates: (%s) "
652 "key read failed (%d)\n",
653 ava->aa_desc->ad_cname.bv_val, rc, 0);
655 Debug( LDAP_DEBUG_TRACE,
656 "<= bdb_approx_candidates: (%s) "
657 "key read failed (%d)\n",
658 ava->aa_desc->ad_cname.bv_val, rc, 0 );
663 if( BDB_IDL_IS_ZERO( tmp ) ) {
665 LDAP_LOG ( INDEX, RESULTS,
666 "<= bdb_approx_candidates: (%s) NULL\n",
667 ava->aa_desc->ad_cname.bv_val, 0, 0 );
669 Debug( LDAP_DEBUG_TRACE,
670 "<= bdb_approx_candidates: (%s) NULL\n",
671 ava->aa_desc->ad_cname.bv_val, 0, 0 );
677 bdb_idl_intersection( ids, tmp );
679 if( BDB_IDL_IS_ZERO( ids ) )
683 ber_bvarray_free_x( keys, op->o_tmpmemctx );
686 LDAP_LOG ( INDEX, RESULTS,
687 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
688 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
689 (long) BDB_IDL_LAST( ids ) );
691 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
693 (long) BDB_IDL_FIRST(ids),
694 (long) BDB_IDL_LAST(ids) );
700 substring_candidates(
702 SubstringsAssertion *sub,
710 struct berval prefix = {0, NULL};
711 struct berval *keys = NULL;
715 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
716 sub->sa_desc->ad_cname.bv_val, 0, 0 );
718 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
719 sub->sa_desc->ad_cname.bv_val, 0, 0 );
722 rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
723 &db, &mask, &prefix );
725 if( rc != LDAP_SUCCESS ) {
727 LDAP_LOG ( INDEX, RESULTS,
728 "<= bdb_substring_candidates: (%s) "
729 "index_param failed (%d)\n",
730 sub->sa_desc->ad_cname.bv_val, rc, 0);
732 Debug( LDAP_DEBUG_ANY,
733 "<= bdb_substring_candidates: (%s) "
734 "index_param failed (%d)\n",
735 sub->sa_desc->ad_cname.bv_val, rc, 0 );
742 LDAP_LOG ( INDEX, RESULTS,
743 "<= bdb_substring_candidates: (%s) not indexed\n",
744 sub->sa_desc->ad_cname.bv_val, 0, 0 );
746 Debug( LDAP_DEBUG_ANY,
747 "<= bdb_substring_candidates: (%s) not indexed\n",
748 sub->sa_desc->ad_cname.bv_val, 0, 0 );
753 mr = sub->sa_desc->ad_type->sat_substr;
759 if( !mr->smr_filter ) {
763 rc = (mr->smr_filter)(
764 LDAP_FILTER_SUBSTRINGS,
766 sub->sa_desc->ad_type->sat_syntax,
770 &keys, op->o_tmpmemctx );
772 if( rc != LDAP_SUCCESS ) {
774 LDAP_LOG ( INDEX, RESULTS,
775 "<= bdb_substring_candidates: (%s) "
776 "MR filter failed (%d)\n",
777 sub->sa_desc->ad_cname.bv_val, rc, 0 );
779 Debug( LDAP_DEBUG_TRACE,
780 "<= bdb_substring_candidates: (%s) "
781 "MR filter failed (%d)\n",
782 sub->sa_desc->ad_cname.bv_val, rc, 0 );
789 LDAP_LOG ( INDEX, RESULTS,
790 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
791 mask, sub->sa_desc->ad_cname.bv_val, 0 );
793 Debug( LDAP_DEBUG_TRACE,
794 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
795 mask, sub->sa_desc->ad_cname.bv_val, 0 );
800 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
801 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
803 if( rc == DB_NOTFOUND ) {
807 } else if( rc != LDAP_SUCCESS ) {
809 LDAP_LOG ( INDEX, RESULTS,
810 "<= bdb_substring_candidates: (%s) "
811 "key read failed (%d)\n",
812 sub->sa_desc->ad_cname.bv_val, rc, 0 );
814 Debug( LDAP_DEBUG_TRACE,
815 "<= bdb_substring_candidates: (%s) "
816 "key read failed (%d)\n",
817 sub->sa_desc->ad_cname.bv_val, rc, 0 );
822 if( BDB_IDL_IS_ZERO( tmp ) ) {
824 LDAP_LOG ( INDEX, RESULTS,
825 "<= bdb_substring_candidates: (%s) NULL\n",
826 sub->sa_desc->ad_cname.bv_val, 0, 0 );
828 Debug( LDAP_DEBUG_TRACE,
829 "<= bdb_substring_candidates: (%s) NULL\n",
830 sub->sa_desc->ad_cname.bv_val, 0, 0 );
836 bdb_idl_intersection( ids, tmp );
838 if( BDB_IDL_IS_ZERO( ids ) )
842 ber_bvarray_free_x( keys, op->o_tmpmemctx );
845 LDAP_LOG ( INDEX, RESULTS,
846 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
847 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
848 (long) BDB_IDL_LAST( ids ) );
850 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
852 (long) BDB_IDL_FIRST(ids),
853 (long) BDB_IDL_LAST(ids) );