add decent Query.toString()
authoradam <adam@megacz.com>
Sat, 1 Mar 2008 05:59:40 +0000 (05:59 +0000)
committeradam <adam@megacz.com>
Sat, 1 Mar 2008 05:59:40 +0000 (05:59 +0000)
darcs-hash:20080301055940-5007d-a1ff694c52a60b9fef7931e44aeb51f515c90161.gz

src/org/ibex/mail/Query.java

index 4fded9d..a260dee 100644 (file)
@@ -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");
+        }
+    }
 }