anchor.diff:    | Take of int
     | Skip of int
     
  +type FilterOperator = And | Or
  +
   type Transformation = 
     | DropColumns of string list
     | SortBy of (string * SortDirection) list
     | GroupBy of string list * Aggregation list
  -  | FilterBy of (string * bool * string) list
  +  | FilterBy of FilterOperator * (string * bool * string) list
     | Paging of Paging list
     | Empty
   
  
positive.code:         if col.EndsWith(" asc") then trimIdent (col.Substring(0, col.Length-4)), Ascending
          elif col.EndsWith(" desc") then trimIdent (col.Substring(0, col.Length-5)), Descending
          else trimIdent col, Ascending))
      | "filter", conds -> FilterBy(List.map parseCondition conds)
      | "groupby", ops ->
          let keys = ops |> List.takeWhile (fun s -> s.StartsWith "by ") |> List.map (fun s -> trimIdent (s.Substring(3)))
          let aggs = ops |> List.skipWhile (fun s -> s.StartsWith "by ") |> List.map parseAggOp
  
negative.code:       let chunks = List.ofArray (if explicit then chunks.[0 .. chunks.Length - 2] else chunks)
        { Transformations = List.map parseTransform chunks; Action = action }    
  
  // ----------------------------------------------------------------------------
  // Evaluate query
  // ----------------------------------------------------------------------------
  