anchor.diff:        objs |> Seq.sortWith (fun o1 o2 ->
           let optRes = flds |> List.map (compareFields o1 o2) |> List.skipWhile ((=) 0) |> List.tryHead
           defaultArg optRes 0)
  -  | FilterBy(conds) ->
  -      conds |> List.fold (fun objs (fld, eq, value) ->
  -        objs |> Seq.filter (fun o -> 
  +  | FilterBy(op, conds) ->
  +      objs |> Seq.filter (fun o ->
  +        let f = match op with And -> Seq.forall | Or -> Seq.exists
  +        conds |> f (fun (fld, eq, value) ->
             match pickField fld o with
  -          | String v -> v = value
  -          | Number n -> n = decimal value)) objs
  +          | String v -> if eq then v = value else v <> value
  +          | Number n -> if eq then n = decimal value else n <> decimal value))
     | GroupBy(flds, aggs) ->
         let aggs = List.rev aggs
         objs 
  
positive.code:       let chunks = List.ofArray (if explicit then chunks.[0 .. chunks.Length - 2] else chunks)
        { Transformations = List.map parseTransform chunks; Action = action }    
  
  
  // ----------------------------------------------------------------------------
  // Evaluate query
  // ----------------------------------------------------------------------------
  
negative.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", "and"::conds -> FilterBy(And, List.map parseCondition conds)
      | "filter", "or"::conds -> FilterBy(Or, List.map parseCondition conds)
      | "filter", conds -> FilterBy(And, 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
  