public KeyRecordEnumerator Select(Statement stmt, bool metaOnly, params Qualifier[] qualifiers)
        {
            KeyRecordEnumerator results = null;
            /*
             * no filters
             */
            if (qualifiers == null || qualifiers.Length == 0)  {
                RecordSet recordSet = this.client.Query(null, stmt);
                results = new KeyRecordEnumerator(stmt.Namespace, recordSet);
                return results;
            }
            /*
             * singleton using primary key
             */
            if (qualifiers != null && qualifiers.Length == 1 && qualifiers[0] is KeyQualifier)  {
                KeyQualifier kq = (KeyQualifier)qualifiers[0];
                Key key = kq.MakeKey(stmt.Namespace, stmt.SetName);
                //System.out.println(key);
                Record record = null;
                if (metaOnly)
                    record = this.client.GetHeader(null, key);
                else
                    record = this.client.Get(null, key, stmt.BinNames);
                if (record == null){
                    results = new KeyRecordEnumerator(stmt.Namespace);
                } else {
                    KeyRecord keyRecord = new KeyRecord(key, record);
                    results = new KeyRecordEnumerator(stmt.Namespace, keyRecord);
                }
                return results;
            }
            /*
             *  query with filters
             */
            Dictionary<String, Object> originArgs = new Dictionary<String, Object>();
            originArgs["includeAllFields"] = 1;

            for (int i = 0; i < qualifiers.Length; i++){
                Qualifier qualifier = qualifiers[i];
                if (isIndexedBin(qualifier)){
                    Filter filter = qualifier.AsFilter();
                    if (filter != null){
                        stmt.Filters = new Filter[] { filter };
                        qualifiers[i] = null;
                        break;
                    }
                }
            }

            String filterFuncStr = buildFilterFunction(qualifiers);
            originArgs["filterFuncStr"] = filterFuncStr;
            Value argValue = Value.Get (originArgs);
            String fnName = "";

            if (metaOnly)
                fnName = "query_meta";
            else
                fnName = "select_records";

            stmt.SetAggregateFunction(
                Assembly.GetExecutingAssembly(),
                "Aerospike.Helper.udf."+ QUERY_MODULE + ".lua",
                QUERY_MODULE,
                fnName,
                argValue);

            ResultSet resultSet = this.client.QueryAggregate(null, stmt);
            results = new KeyRecordEnumerator(stmt.Namespace, resultSet);
            return results;
        }
        private IDictionary<String, long> Update(KeyRecordEnumerator results, List<Bin> bins)
        {
            long readCount = 0;
            long updateCount = 0;
            while (results.MoveNext()){
                KeyRecord keyRecord = (KeyRecord) results.Current;
                readCount++;
                WritePolicy up = new WritePolicy(updatePolicy);
                up.generation = keyRecord.record.generation;
                try {
                    client.Put(up, keyRecord.key, bins.ToArray());
                    updateCount++;
                } catch (AerospikeException e){
                    log.Error("Unexpected exception "+ keyRecord.key, e);

                }
            }
            IDictionary<String, long> map = new Dictionary<String, long>();
            map["read"] = readCount;
            map["write"] = updateCount;
            return map;
        }
        public KeyRecordEnumerator Select(Statement stmt, IDictionary<String, String> sortMap, params Qualifier[] qualifiers)
        {
            KeyRecordEnumerator results = null;

            if (qualifiers != null && qualifiers.Length > 0) {
                IDictionary<String, Object> originArgs = new Dictionary<String, Object>();
                originArgs["includeAllFields"] = 1;
                string filterFuncStr = buildFilterFunction(qualifiers);
                originArgs["filterFuncStr"] = filterFuncStr;
                string sortFuncStr = buildSortFunction(sortMap);
                originArgs["sortFuncStr"] = sortFuncStr;
                stmt.SetAggregateFunction(QUERY_MODULE, "select_records", Value.Get(originArgs));
                ResultSet resultSet = this.client.QueryAggregate(null, stmt);
                results = new KeyRecordEnumerator(stmt.Namespace, resultSet);
            } else {
                RecordSet recordSet = this.client.Query(null, stmt);
                results = new KeyRecordEnumerator(stmt.Namespace, recordSet);
            }
            return results;
        }