formatting
[org.ibex.mail.git] / src / org / ibex / mail / Query.java
index 14f3e09..a260dee 100644 (file)
@@ -105,12 +105,12 @@ public class Query {
                                     (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.deleted();
-            case SEEN:       return it.seen();
-            case FLAGGED:    return it.flagged();
-            case DRAFT:      return it.draft();
-            case ANSWERED:   return it.answered();
-            case RECENT:     return it.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");
@@ -121,4 +121,56 @@ public class Query {
             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");
+        }
+    }
 }