(earliest == null || it.cur().arrival.after(earliest));
case HEADER: return it.cur().headers.get(key) != null &&
((String)it.cur().headers.get(key)).toLowerCase().indexOf(text.toLowerCase()) != -1;
- case DELETED: return it.getFlag(Mailbox.Flag.DELETED);
- case SEEN: return it.getFlag(Mailbox.Flag.SEEN);
- case FLAGGED: return it.getFlag(Mailbox.Flag.FLAGGED);
- case DRAFT: return it.getFlag(Mailbox.Flag.DRAFT);
- case ANSWERED: return it.getFlag(Mailbox.Flag.ANSWERED);
- case RECENT: return it.getFlag(Mailbox.Flag.RECENT);
+ case DELETED: return (it.getFlags() & Mailbox.Flag.DELETED) !=0;
+ case SEEN: return (it.getFlags() & Mailbox.Flag.SEEN)!=0;
+ case FLAGGED: return (it.getFlags() & Mailbox.Flag.FLAGGED)!=0;
+ case DRAFT: return (it.getFlags() & Mailbox.Flag.DRAFT)!=0;
+ case ANSWERED: return (it.getFlags() & Mailbox.Flag.ANSWERED)!=0;
+ case RECENT: return (it.getFlags() & Mailbox.Flag.RECENT)!=0;
// FIXME: super inefficient
case BODY: throw new RuntimeException("BODY searches are not supported because they are slow");
default: throw new Error("this should not happen");
}
}
+
+
+ // FIXME: normalize multiple-range queries using AND/OR?
+
+ private static String range(int[] set, int min, int max, String name) {
+ if (set != null && set.length==1) { min = set[0]; max = set[1]; set = null; }
+ if (set == null) {
+ if (min==max) return "name=="+min;
+ return min+"<="+name+"<="+max;
+ } else {
+ StringBuffer sb = new StringBuffer();
+ for(int i=0; i<set.length; i+=2) {
+ if (i>0) sb.append(" || ");
+ sb.append(set[i]+"<="+name+"<="+set[i+1]);
+ }
+ return sb.toString();
+ }
+ }
+
+ private static String range(Date earliest, Date latest, String name) {
+ StringBuffer sb = new StringBuffer();
+ if (earliest != null) sb.append(earliest + "<=");
+ sb.append(name);
+ if (latest != null) sb.append("<="+latest);
+ return sb.toString();
+ }
+
+ public String toString() {
+ switch(type) {
+ case ALL: return "ALL";
+ case NOT: return "NOT " + q[0];
+ case OR: return StringUtil.join(q, " || ");
+ case AND: return StringUtil.join(q, " && ");
+ case UID: return range(set, min, max, "uid");
+ case IMAPNUM: return range(set, min, max, "imapnum");
+ case NNTPNUM: return range(set, min, max, "nntpnum");
+ case SENT: return range(earliest, latest, "sent");
+ case ARRIVAL: return range(earliest, latest, "arrival");
+ case HEADER: return "headers["+key+"]=="+text;
+ case DELETED: return "deleted";
+ case SEEN: return "seen";
+ case FLAGGED: return "flagged";
+ case DRAFT: return "draft";
+ case ANSWERED: return "answered";
+ case RECENT: return "recent";
+ // FIXME: super inefficient
+ case BODY: return "<bodysearch>";
+ case FULL: return "<fullsearch>";
+ case SIZE: return "<sizesearch>";
+ default: throw new Error("this should not happen");
+ }
+ }
}