Lines Matching refs:args
90 struct mail_search_arg *args,
97 *prev_argp = args;
102 mail_search_arg_one_deinit(args);
104 if ((*prev_argp)->match_not != args->match_not) {
116 struct mail_search_arg *args)
120 mail_search_arg_get_base_mask(args, &mask);
121 mask.bin_mask.mail_flags = args->value.flags;
122 return mail_search_args_merge_mask(ctx, args, &mask);
127 struct mail_search_arg *args)
131 mail_search_arg_get_base_mask(args, &mask);
132 mask.str_mask = args->value.str;
133 return mail_search_args_merge_mask(ctx, args, &mask);
136 static void mail_search_args_simplify_set(struct mail_search_arg *args)
141 if (args->match_not) {
146 if (seq_range_exists(&args->value.seqset, (uint32_t)-1))
148 args->match_not = FALSE;
149 seq_range_array_invert(&args->value.seqset, 1, (uint32_t)-2);
151 seqset = array_get(&args->value.seqset, &count);
154 args->type = SEARCH_ALL;
158 args->type = SEARCH_ALL;
159 args->match_not = TRUE;
164 struct mail_search_arg *args)
169 if (args->match_not) {
174 mail_search_arg_get_base_mask(args, &mask);
175 mask.bin_mask.match_not = args->match_not;
179 *prev_argp = args;
183 &args->value.seqset);
187 &args->value.seqset);
193 struct mail_search_arg *args)
198 mail_search_arg_get_base_mask(args, &mask);
199 mask.bin_mask.match_not = args->match_not;
200 mask.bin_mask.date_type = args->value.date_type;
204 *prev_argp = args;
209 switch (args->type) {
212 if (prev_arg->value.time < args->value.time) {
216 prev_arg->value.time = args->value.time;
219 if (prev_arg->value.time < args->value.time) {
221 prev_arg->value.time = args->value.time;
228 if (prev_arg->value.time == args->value.time)
233 if (prev_arg->value.time < args->value.time) {
235 prev_arg->value.time = args->value.time;
240 if (prev_arg->value.time < args->value.time) {
244 prev_arg->value.time = args->value.time;
255 struct mail_search_arg *args)
260 mail_search_arg_get_base_mask(args, &mask);
261 mask.bin_mask.match_not = args->match_not;
265 *prev_argp = args;
270 switch (args->type) {
273 if (prev_arg->value.size < args->value.size) {
277 prev_arg->value.size = args->value.size;
280 if (prev_arg->value.size < args->value.size) {
282 prev_arg->value.size = args->value.size;
290 if (prev_arg->value.size < args->value.size) {
292 prev_arg->value.size = args->value.size;
297 if (prev_arg->value.size < args->value.size) {
301 prev_arg->value.size = args->value.size;
312 struct mail_search_arg *args)
316 mail_search_arg_get_base_mask(args, &mask);
317 mask.hdr_field_name_mask = args->hdr_field_name;
318 mask.str_mask = args->value.str;
319 return mail_search_args_merge_mask(ctx, args, &mask);
323 mail_search_args_have_equal(const struct mail_search_arg *args,
328 for (arg = args; arg != NULL; arg = arg->next) {
387 mail_search_args_count(const struct mail_search_arg *args)
391 for (count = 0; args != NULL; count++)
392 args = args->next;
411 /* find the arg which has the lowest number of child args */
427 /* if there are any args that include lowest_arg, drop the arg since
485 /* check if sub_arg is found from all the args */
507 /* replace all the original args with a single new SUB/OR arg */
511 /* there are only common args */
538 ctx.pool = pool_alloconly_create("mail search args simplify", 1024);
544 struct mail_search_arg *args = *argsp;
546 if (args->match_not && (args->type == SEARCH_SUB ||
547 args->type == SEARCH_OR)) {
550 args->type = args->type == SEARCH_SUB ?
552 args->match_not = FALSE;
553 sub = args->value.subargs;
560 if ((args->type == SEARCH_SUB && parent_and) ||
561 (args->type == SEARCH_OR && !parent_and) ||
562 ((args->type == SEARCH_SUB || args->type == SEARCH_OR) &&
563 args->value.subargs->next == NULL)) {
567 sub = args->value.subargs;
569 sub->next = args->next;
570 *args = *args->value.subargs;
575 if (args->type == SEARCH_SUB ||
576 args->type == SEARCH_OR ||
577 args->type == SEARCH_INTHREAD) {
578 i_assert(!args->match_not);
580 if (args->type != SEARCH_INTHREAD) {
581 bool and_arg = args->type == SEARCH_SUB;
583 if (mail_search_args_simplify_drop_redundant_args(all_args, &args->value.subargs, and_arg))
585 if (mail_search_args_simplify_extract_common(all_args, &args->value.subargs, pool, and_arg))
588 if (mail_search_args_simplify_sub(all_args, pool, &args->value.subargs,
589 args->type != SEARCH_OR))
592 if (args->type == SEARCH_SEQSET ||
593 args->type == SEARCH_UIDSET)
594 mail_search_args_simplify_set(args);
598 switch (args->type) {
600 if (*all_argsp == args && args->next == NULL) {
604 if ((parent_and && !args->match_not) ||
605 (!parent_and && args->match_not)) {
614 The other args are irrelevant -> drop them */
615 *all_argsp = args;
616 args->next = NULL;
621 merged = mail_search_args_merge_flags(&ctx, args);
624 merged = mail_search_args_merge_keywords(&ctx, args);
628 merged = mail_search_args_merge_set(&ctx, args);
633 merged = mail_search_args_merge_time(&ctx, args);
637 merged = mail_search_args_merge_size(&ctx, args);
641 if (args->value.str[0] == '\0') {
643 args->type = SEARCH_ALL;
651 merged = mail_search_args_merge_text(&ctx, args);
657 *argsp = args->next;
662 argsp = &args->next;
677 struct mail_search_arg *args = *argsp;
679 if (args->type == SEARCH_SUB ||
680 args->type == SEARCH_OR ||
681 args->type == SEARCH_INTHREAD) {
682 if (mail_search_args_simplify_merge_flags(&args->value.subargs,
683 args->type != SEARCH_OR))
685 } else if (args->type != SEARCH_FLAGS) {
687 } else if (!((!args->match_not && parent_and) ||
688 (args->match_not && !parent_and))) {
689 /* can't merge these flags args */
692 prev_flags = args;
695 prev_flags->value.flags |= args->value.flags;
696 *argsp = args->next;
700 argsp = &args->next;
706 mail_search_args_unnest_inthreads(struct mail_search_args *args,
717 if (!mail_search_args_unnest_inthreads(args,
728 if (mail_search_args_unnest_inthreads(args,
733 args->have_inthreads = TRUE;
748 thread_arg = p_new(args->pool, struct mail_search_arg, 1);
762 /* We want to OR the args */
763 or_arg = p_new(args->pool, struct mail_search_arg, 1);
771 void mail_search_args_simplify(struct mail_search_args *args)
775 args->simplified = TRUE;
777 removals = mail_search_args_simplify_sub(args, args->pool, &args->args, TRUE);
778 if (mail_search_args_unnest_inthreads(args, &args->args,
781 if (mail_search_args_simplify_sub(args, args->pool, &args->args, TRUE))
785 if (mail_search_args_simplify_drop_redundant_args(args, &args->args, TRUE))
787 if (mail_search_args_simplify_extract_common(args, &args->args, args->pool, TRUE))
790 removals = mail_search_args_simplify_sub(args, args->pool, &args->args, TRUE);
792 up until then they're treated as any other search args,
795 if (mail_search_args_simplify_merge_flags(&args->args, TRUE))