http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/7137006b/blur-thrift/src/main/java/org/apache/blur/thrift/generated/Metric.java
----------------------------------------------------------------------
diff --git 
a/blur-thrift/src/main/java/org/apache/blur/thrift/generated/Metric.java 
b/blur-thrift/src/main/java/org/apache/blur/thrift/generated/Metric.java
new file mode 100644
index 0000000..91043a6
--- /dev/null
+++ b/blur-thrift/src/main/java/org/apache/blur/thrift/generated/Metric.java
@@ -0,0 +1,894 @@
+/**
+ * Autogenerated by Thrift Compiler (0.9.0)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.blur.thrift.generated;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+import org.apache.blur.thirdparty.thrift_0_9_0.scheme.IScheme;
+import org.apache.blur.thirdparty.thrift_0_9_0.scheme.SchemeFactory;
+import org.apache.blur.thirdparty.thrift_0_9_0.scheme.StandardScheme;
+
+import org.apache.blur.thirdparty.thrift_0_9_0.scheme.TupleScheme;
+import org.apache.blur.thirdparty.thrift_0_9_0.protocol.TTupleProtocol;
+import org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolException;
+import org.apache.blur.thirdparty.thrift_0_9_0.EncodingUtils;
+import org.apache.blur.thirdparty.thrift_0_9_0.TException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+
+public class Metric implements 
org.apache.blur.thirdparty.thrift_0_9_0.TBase<Metric, Metric._Fields>, 
java.io.Serializable, Cloneable {
+  private static final 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TStruct STRUCT_DESC = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TStruct("Metric");
+
+  private static final org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField 
NAME_FIELD_DESC = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField("name", 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING, (short)1);
+  private static final org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField 
STR_MAP_FIELD_DESC = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField("strMap", 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP, (short)2);
+  private static final org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField 
LONG_MAP_FIELD_DESC = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField("longMap", 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP, (short)3);
+  private static final org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField 
DOUBLE_MAP_FIELD_DESC = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField("doubleMap", 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP, (short)4);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = 
new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new MetricStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new MetricTupleSchemeFactory());
+  }
+
+  public String name; // required
+  public Map<String,String> strMap; // required
+  public Map<String,Long> longMap; // required
+  public Map<String,Double> doubleMap; // required
+
+  /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
+  public enum _Fields implements 
org.apache.blur.thirdparty.thrift_0_9_0.TFieldIdEnum {
+    NAME((short)1, "name"),
+    STR_MAP((short)2, "strMap"),
+    LONG_MAP((short)3, "longMap"),
+    DOUBLE_MAP((short)4, "doubleMap");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, 
_Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not 
found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // NAME
+          return NAME;
+        case 2: // STR_MAP
+          return STR_MAP;
+        case 3: // LONG_MAP
+          return LONG_MAP;
+        case 4: // DOUBLE_MAP
+          return DOUBLE_MAP;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + 
fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  public static final Map<_Fields, 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData> metaDataMap;
+  static {
+    Map<_Fields, 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData> tmpMap = new 
EnumMap<_Fields, 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.NAME, new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData("name", 
org.apache.blur.thirdparty.thrift_0_9_0.TFieldRequirementType.DEFAULT, 
+        new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STR_MAP, new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData("strMap", 
org.apache.blur.thirdparty.thrift_0_9_0.TFieldRequirementType.DEFAULT, 
+        new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.MapMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP,
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING),
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING))));
+    tmpMap.put(_Fields.LONG_MAP, new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData("longMap", 
org.apache.blur.thirdparty.thrift_0_9_0.TFieldRequirementType.DEFAULT, 
+        new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.MapMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP,
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING),
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.I64))));
+    tmpMap.put(_Fields.DOUBLE_MAP, new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData("doubleMap", 
org.apache.blur.thirdparty.thrift_0_9_0.TFieldRequirementType.DEFAULT, 
+        new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.MapMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP,
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING),
 
+            new 
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldValueMetaData(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.DOUBLE))));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    
org.apache.blur.thirdparty.thrift_0_9_0.meta_data.FieldMetaData.addStructMetaDataMap(Metric.class,
 metaDataMap);
+  }
+
+  public Metric() {
+  }
+
+  public Metric(
+    String name,
+    Map<String,String> strMap,
+    Map<String,Long> longMap,
+    Map<String,Double> doubleMap)
+  {
+    this();
+    this.name = name;
+    this.strMap = strMap;
+    this.longMap = longMap;
+    this.doubleMap = doubleMap;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public Metric(Metric other) {
+    if (other.isSetName()) {
+      this.name = other.name;
+    }
+    if (other.isSetStrMap()) {
+      Map<String,String> __this__strMap = new HashMap<String,String>();
+      for (Map.Entry<String, String> other_element : other.strMap.entrySet()) {
+
+        String other_element_key = other_element.getKey();
+        String other_element_value = other_element.getValue();
+
+        String __this__strMap_copy_key = other_element_key;
+
+        String __this__strMap_copy_value = other_element_value;
+
+        __this__strMap.put(__this__strMap_copy_key, __this__strMap_copy_value);
+      }
+      this.strMap = __this__strMap;
+    }
+    if (other.isSetLongMap()) {
+      Map<String,Long> __this__longMap = new HashMap<String,Long>();
+      for (Map.Entry<String, Long> other_element : other.longMap.entrySet()) {
+
+        String other_element_key = other_element.getKey();
+        Long other_element_value = other_element.getValue();
+
+        String __this__longMap_copy_key = other_element_key;
+
+        Long __this__longMap_copy_value = other_element_value;
+
+        __this__longMap.put(__this__longMap_copy_key, 
__this__longMap_copy_value);
+      }
+      this.longMap = __this__longMap;
+    }
+    if (other.isSetDoubleMap()) {
+      Map<String,Double> __this__doubleMap = new HashMap<String,Double>();
+      for (Map.Entry<String, Double> other_element : 
other.doubleMap.entrySet()) {
+
+        String other_element_key = other_element.getKey();
+        Double other_element_value = other_element.getValue();
+
+        String __this__doubleMap_copy_key = other_element_key;
+
+        Double __this__doubleMap_copy_value = other_element_value;
+
+        __this__doubleMap.put(__this__doubleMap_copy_key, 
__this__doubleMap_copy_value);
+      }
+      this.doubleMap = __this__doubleMap;
+    }
+  }
+
+  public Metric deepCopy() {
+    return new Metric(this);
+  }
+
+  @Override
+  public void clear() {
+    this.name = null;
+    this.strMap = null;
+    this.longMap = null;
+    this.doubleMap = null;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+
+  public Metric setName(String name) {
+    this.name = name;
+    return this;
+  }
+
+  public void unsetName() {
+    this.name = null;
+  }
+
+  /** Returns true if field name is set (has been assigned a value) and false 
otherwise */
+  public boolean isSetName() {
+    return this.name != null;
+  }
+
+  public void setNameIsSet(boolean value) {
+    if (!value) {
+      this.name = null;
+    }
+  }
+
+  public int getStrMapSize() {
+    return (this.strMap == null) ? 0 : this.strMap.size();
+  }
+
+  public void putToStrMap(String key, String val) {
+    if (this.strMap == null) {
+      this.strMap = new HashMap<String,String>();
+    }
+    this.strMap.put(key, val);
+  }
+
+  public Map<String,String> getStrMap() {
+    return this.strMap;
+  }
+
+  public Metric setStrMap(Map<String,String> strMap) {
+    this.strMap = strMap;
+    return this;
+  }
+
+  public void unsetStrMap() {
+    this.strMap = null;
+  }
+
+  /** Returns true if field strMap is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetStrMap() {
+    return this.strMap != null;
+  }
+
+  public void setStrMapIsSet(boolean value) {
+    if (!value) {
+      this.strMap = null;
+    }
+  }
+
+  public int getLongMapSize() {
+    return (this.longMap == null) ? 0 : this.longMap.size();
+  }
+
+  public void putToLongMap(String key, long val) {
+    if (this.longMap == null) {
+      this.longMap = new HashMap<String,Long>();
+    }
+    this.longMap.put(key, val);
+  }
+
+  public Map<String,Long> getLongMap() {
+    return this.longMap;
+  }
+
+  public Metric setLongMap(Map<String,Long> longMap) {
+    this.longMap = longMap;
+    return this;
+  }
+
+  public void unsetLongMap() {
+    this.longMap = null;
+  }
+
+  /** Returns true if field longMap is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetLongMap() {
+    return this.longMap != null;
+  }
+
+  public void setLongMapIsSet(boolean value) {
+    if (!value) {
+      this.longMap = null;
+    }
+  }
+
+  public int getDoubleMapSize() {
+    return (this.doubleMap == null) ? 0 : this.doubleMap.size();
+  }
+
+  public void putToDoubleMap(String key, double val) {
+    if (this.doubleMap == null) {
+      this.doubleMap = new HashMap<String,Double>();
+    }
+    this.doubleMap.put(key, val);
+  }
+
+  public Map<String,Double> getDoubleMap() {
+    return this.doubleMap;
+  }
+
+  public Metric setDoubleMap(Map<String,Double> doubleMap) {
+    this.doubleMap = doubleMap;
+    return this;
+  }
+
+  public void unsetDoubleMap() {
+    this.doubleMap = null;
+  }
+
+  /** Returns true if field doubleMap is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetDoubleMap() {
+    return this.doubleMap != null;
+  }
+
+  public void setDoubleMapIsSet(boolean value) {
+    if (!value) {
+      this.doubleMap = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case NAME:
+      if (value == null) {
+        unsetName();
+      } else {
+        setName((String)value);
+      }
+      break;
+
+    case STR_MAP:
+      if (value == null) {
+        unsetStrMap();
+      } else {
+        setStrMap((Map<String,String>)value);
+      }
+      break;
+
+    case LONG_MAP:
+      if (value == null) {
+        unsetLongMap();
+      } else {
+        setLongMap((Map<String,Long>)value);
+      }
+      break;
+
+    case DOUBLE_MAP:
+      if (value == null) {
+        unsetDoubleMap();
+      } else {
+        setDoubleMap((Map<String,Double>)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case NAME:
+      return getName();
+
+    case STR_MAP:
+      return getStrMap();
+
+    case LONG_MAP:
+      return getLongMap();
+
+    case DOUBLE_MAP:
+      return getDoubleMap();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned 
a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case NAME:
+      return isSetName();
+    case STR_MAP:
+      return isSetStrMap();
+    case LONG_MAP:
+      return isSetLongMap();
+    case DOUBLE_MAP:
+      return isSetDoubleMap();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof Metric)
+      return this.equals((Metric)that);
+    return false;
+  }
+
+  public boolean equals(Metric that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_name = true && this.isSetName();
+    boolean that_present_name = true && that.isSetName();
+    if (this_present_name || that_present_name) {
+      if (!(this_present_name && that_present_name))
+        return false;
+      if (!this.name.equals(that.name))
+        return false;
+    }
+
+    boolean this_present_strMap = true && this.isSetStrMap();
+    boolean that_present_strMap = true && that.isSetStrMap();
+    if (this_present_strMap || that_present_strMap) {
+      if (!(this_present_strMap && that_present_strMap))
+        return false;
+      if (!this.strMap.equals(that.strMap))
+        return false;
+    }
+
+    boolean this_present_longMap = true && this.isSetLongMap();
+    boolean that_present_longMap = true && that.isSetLongMap();
+    if (this_present_longMap || that_present_longMap) {
+      if (!(this_present_longMap && that_present_longMap))
+        return false;
+      if (!this.longMap.equals(that.longMap))
+        return false;
+    }
+
+    boolean this_present_doubleMap = true && this.isSetDoubleMap();
+    boolean that_present_doubleMap = true && that.isSetDoubleMap();
+    if (this_present_doubleMap || that_present_doubleMap) {
+      if (!(this_present_doubleMap && that_present_doubleMap))
+        return false;
+      if (!this.doubleMap.equals(that.doubleMap))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return 0;
+  }
+
+  public int compareTo(Metric other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+    Metric typedOther = (Metric)other;
+
+    lastComparison = 
Boolean.valueOf(isSetName()).compareTo(typedOther.isSetName());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetName()) {
+      lastComparison = 
org.apache.blur.thirdparty.thrift_0_9_0.TBaseHelper.compareTo(this.name, 
typedOther.name);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetStrMap()).compareTo(typedOther.isSetStrMap());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStrMap()) {
+      lastComparison = 
org.apache.blur.thirdparty.thrift_0_9_0.TBaseHelper.compareTo(this.strMap, 
typedOther.strMap);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetLongMap()).compareTo(typedOther.isSetLongMap());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetLongMap()) {
+      lastComparison = 
org.apache.blur.thirdparty.thrift_0_9_0.TBaseHelper.compareTo(this.longMap, 
typedOther.longMap);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetDoubleMap()).compareTo(typedOther.isSetDoubleMap());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetDoubleMap()) {
+      lastComparison = 
org.apache.blur.thirdparty.thrift_0_9_0.TBaseHelper.compareTo(this.doubleMap, 
typedOther.doubleMap);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol 
iprot) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol 
oprot) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("Metric(");
+    boolean first = true;
+
+    sb.append("name:");
+    if (this.name == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.name);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("strMap:");
+    if (this.strMap == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.strMap);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("longMap:");
+    if (this.longMap == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.longMap);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("doubleMap:");
+    if (this.doubleMap == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.doubleMap);
+    }
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws 
org.apache.blur.thirdparty.thrift_0_9_0.TException {
+    // check for required fields
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws 
java.io.IOException {
+    try {
+      write(new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TCompactProtocol(new 
org.apache.blur.thirdparty.thrift_0_9_0.transport.TIOStreamTransport(out)));
+    } catch (org.apache.blur.thirdparty.thrift_0_9_0.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws 
java.io.IOException, ClassNotFoundException {
+    try {
+      read(new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TCompactProtocol(new 
org.apache.blur.thirdparty.thrift_0_9_0.transport.TIOStreamTransport(in)));
+    } catch (org.apache.blur.thirdparty.thrift_0_9_0.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class MetricStandardSchemeFactory implements SchemeFactory {
+    public MetricStandardScheme getScheme() {
+      return new MetricStandardScheme();
+    }
+  }
+
+  private static class MetricStandardScheme extends StandardScheme<Metric> {
+
+    public void 
read(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol iprot, Metric 
struct) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+      org.apache.blur.thirdparty.thrift_0_9_0.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // NAME
+            if (schemeField.type == 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING) {
+              struct.name = iprot.readString();
+              struct.setNameIsSet(true);
+            } else { 
+              
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 2: // STR_MAP
+            if (schemeField.type == 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP) {
+              {
+                org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map176 
= iprot.readMapBegin();
+                struct.strMap = new HashMap<String,String>(2*_map176.size);
+                for (int _i177 = 0; _i177 < _map176.size; ++_i177)
+                {
+                  String _key178; // required
+                  String _val179; // optional
+                  _key178 = iprot.readString();
+                  _val179 = iprot.readString();
+                  struct.strMap.put(_key178, _val179);
+                }
+                iprot.readMapEnd();
+              }
+              struct.setStrMapIsSet(true);
+            } else { 
+              
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 3: // LONG_MAP
+            if (schemeField.type == 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP) {
+              {
+                org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map180 
= iprot.readMapBegin();
+                struct.longMap = new HashMap<String,Long>(2*_map180.size);
+                for (int _i181 = 0; _i181 < _map180.size; ++_i181)
+                {
+                  String _key182; // required
+                  long _val183; // optional
+                  _key182 = iprot.readString();
+                  _val183 = iprot.readI64();
+                  struct.longMap.put(_key182, _val183);
+                }
+                iprot.readMapEnd();
+              }
+              struct.setLongMapIsSet(true);
+            } else { 
+              
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 4: // DOUBLE_MAP
+            if (schemeField.type == 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.MAP) {
+              {
+                org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map184 
= iprot.readMapBegin();
+                struct.doubleMap = new HashMap<String,Double>(2*_map184.size);
+                for (int _i185 = 0; _i185 < _map184.size; ++_i185)
+                {
+                  String _key186; // required
+                  double _val187; // optional
+                  _key186 = iprot.readString();
+                  _val187 = iprot.readDouble();
+                  struct.doubleMap.put(_key186, _val187);
+                }
+                iprot.readMapEnd();
+              }
+              struct.setDoubleMapIsSet(true);
+            } else { 
+              
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          default:
+            
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+
+      // check for required fields of primitive type, which can't be checked 
in the validate method
+      struct.validate();
+    }
+
+    public void 
write(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol oprot, Metric 
struct) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.name != null) {
+        oprot.writeFieldBegin(NAME_FIELD_DESC);
+        oprot.writeString(struct.name);
+        oprot.writeFieldEnd();
+      }
+      if (struct.strMap != null) {
+        oprot.writeFieldBegin(STR_MAP_FIELD_DESC);
+        {
+          oprot.writeMapBegin(new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING, 
struct.strMap.size()));
+          for (Map.Entry<String, String> _iter188 : struct.strMap.entrySet())
+          {
+            oprot.writeString(_iter188.getKey());
+            oprot.writeString(_iter188.getValue());
+          }
+          oprot.writeMapEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      if (struct.longMap != null) {
+        oprot.writeFieldBegin(LONG_MAP_FIELD_DESC);
+        {
+          oprot.writeMapBegin(new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.I64, 
struct.longMap.size()));
+          for (Map.Entry<String, Long> _iter189 : struct.longMap.entrySet())
+          {
+            oprot.writeString(_iter189.getKey());
+            oprot.writeI64(_iter189.getValue());
+          }
+          oprot.writeMapEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      if (struct.doubleMap != null) {
+        oprot.writeFieldBegin(DOUBLE_MAP_FIELD_DESC);
+        {
+          oprot.writeMapBegin(new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.DOUBLE, 
struct.doubleMap.size()));
+          for (Map.Entry<String, Double> _iter190 : 
struct.doubleMap.entrySet())
+          {
+            oprot.writeString(_iter190.getKey());
+            oprot.writeDouble(_iter190.getValue());
+          }
+          oprot.writeMapEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class MetricTupleSchemeFactory implements SchemeFactory {
+    public MetricTupleScheme getScheme() {
+      return new MetricTupleScheme();
+    }
+  }
+
+  private static class MetricTupleScheme extends TupleScheme<Metric> {
+
+    @Override
+    public void 
write(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol prot, Metric 
struct) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      BitSet optionals = new BitSet();
+      if (struct.isSetName()) {
+        optionals.set(0);
+      }
+      if (struct.isSetStrMap()) {
+        optionals.set(1);
+      }
+      if (struct.isSetLongMap()) {
+        optionals.set(2);
+      }
+      if (struct.isSetDoubleMap()) {
+        optionals.set(3);
+      }
+      oprot.writeBitSet(optionals, 4);
+      if (struct.isSetName()) {
+        oprot.writeString(struct.name);
+      }
+      if (struct.isSetStrMap()) {
+        {
+          oprot.writeI32(struct.strMap.size());
+          for (Map.Entry<String, String> _iter191 : struct.strMap.entrySet())
+          {
+            oprot.writeString(_iter191.getKey());
+            oprot.writeString(_iter191.getValue());
+          }
+        }
+      }
+      if (struct.isSetLongMap()) {
+        {
+          oprot.writeI32(struct.longMap.size());
+          for (Map.Entry<String, Long> _iter192 : struct.longMap.entrySet())
+          {
+            oprot.writeString(_iter192.getKey());
+            oprot.writeI64(_iter192.getValue());
+          }
+        }
+      }
+      if (struct.isSetDoubleMap()) {
+        {
+          oprot.writeI32(struct.doubleMap.size());
+          for (Map.Entry<String, Double> _iter193 : 
struct.doubleMap.entrySet())
+          {
+            oprot.writeString(_iter193.getKey());
+            oprot.writeDouble(_iter193.getValue());
+          }
+        }
+      }
+    }
+
+    @Override
+    public void 
read(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TProtocol prot, Metric 
struct) throws org.apache.blur.thirdparty.thrift_0_9_0.TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      BitSet incoming = iprot.readBitSet(4);
+      if (incoming.get(0)) {
+        struct.name = iprot.readString();
+        struct.setNameIsSet(true);
+      }
+      if (incoming.get(1)) {
+        {
+          org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map194 = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING, 
iprot.readI32());
+          struct.strMap = new HashMap<String,String>(2*_map194.size);
+          for (int _i195 = 0; _i195 < _map194.size; ++_i195)
+          {
+            String _key196; // required
+            String _val197; // optional
+            _key196 = iprot.readString();
+            _val197 = iprot.readString();
+            struct.strMap.put(_key196, _val197);
+          }
+        }
+        struct.setStrMapIsSet(true);
+      }
+      if (incoming.get(2)) {
+        {
+          org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map198 = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.I64, iprot.readI32());
+          struct.longMap = new HashMap<String,Long>(2*_map198.size);
+          for (int _i199 = 0; _i199 < _map198.size; ++_i199)
+          {
+            String _key200; // required
+            long _val201; // optional
+            _key200 = iprot.readString();
+            _val201 = iprot.readI64();
+            struct.longMap.put(_key200, _val201);
+          }
+        }
+        struct.setLongMapIsSet(true);
+      }
+      if (incoming.get(3)) {
+        {
+          org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap _map202 = new 
org.apache.blur.thirdparty.thrift_0_9_0.protocol.TMap(org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.STRING,
 org.apache.blur.thirdparty.thrift_0_9_0.protocol.TType.DOUBLE, 
iprot.readI32());
+          struct.doubleMap = new HashMap<String,Double>(2*_map202.size);
+          for (int _i203 = 0; _i203 < _map202.size; ++_i203)
+          {
+            String _key204; // required
+            double _val205; // optional
+            _key204 = iprot.readString();
+            _val205 = iprot.readDouble();
+            struct.doubleMap.put(_key204, _val205);
+          }
+        }
+        struct.setDoubleMapIsSet(true);
+      }
+    }
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/7137006b/blur-thrift/src/main/java/org/apache/blur/thrift/util/QueryMetrics.java
----------------------------------------------------------------------
diff --git 
a/blur-thrift/src/main/java/org/apache/blur/thrift/util/QueryMetrics.java 
b/blur-thrift/src/main/java/org/apache/blur/thrift/util/QueryMetrics.java
new file mode 100644
index 0000000..27d0077
--- /dev/null
+++ b/blur-thrift/src/main/java/org/apache/blur/thrift/util/QueryMetrics.java
@@ -0,0 +1,43 @@
+package org.apache.blur.thrift.util;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.blur.thirdparty.thrift_0_9_0.TException;
+import org.apache.blur.thrift.BlurClient;
+import org.apache.blur.thrift.generated.Blur.Iface;
+import org.apache.blur.thrift.generated.BlurException;
+import org.apache.blur.thrift.generated.Metric;
+
+public class QueryMetrics {
+
+  public static void main(String[] args) throws BlurException, TException, 
IOException {
+    String connectionStr = args[0];
+
+    Iface client = BlurClient.getClient(connectionStr);
+    Map<String, Metric> metrics = new TreeMap<String, 
Metric>(client.metrics(null));
+    for (Metric m : metrics.values()) {
+      System.out.println(m.getName());
+      System.out.println("\t" + m.getDoubleMap());
+      System.out.println("\t" + m.getLongMap());
+      System.out.println("\t" + m.getStrMap());
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/7137006b/distribution/src/main/scripts/interface/Blur.thrift
----------------------------------------------------------------------
diff --git a/distribution/src/main/scripts/interface/Blur.thrift 
b/distribution/src/main/scripts/interface/Blur.thrift
index a0f5c87..0c8fff1 100644
--- a/distribution/src/main/scripts/interface/Blur.thrift
+++ b/distribution/src/main/scripts/interface/Blur.thrift
@@ -694,7 +694,12 @@ struct TableDescriptor {
   14:map<string,string> tableProperties
 }
 
-
+struct Metric {
+  1:string name,
+  2:map<string,string> strMap,
+  3:map<string,i64> longMap,
+  4:map<string,double> doubleMap
+}
 
 /**
  *
@@ -765,6 +770,13 @@ service Blur {
   BlurResults query(1:string table, 2:BlurQuery blurQuery) throws 
(1:BlurException ex)
 
   /**
+   * Parses the given query and return the string represents the query.
+   * @param table the table name.
+   * @param simpleQuery the query to parse.
+   */
+  string parseQuery(1:string table, 2:SimpleQuery simpleQuery) throws 
(1:BlurException ex)
+
+  /**
    * Cancels a query that is executing against the given table with the given 
uuid.  Note, the cancel call maybe take some time for the query actually stops 
executing.
    * @param table the table name.
    * @param uuid the uuid of the query.
@@ -810,6 +822,9 @@ service Blur {
   bool isInSafeMode(1:string cluster) throws (1:BlurException ex)
 
   map<string,string> configuration() throws (1:BlurException ex)
+
+  map<string,Metric> metrics(1:set<string> metrics) throws (1:BlurException ex)
+
 }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/7137006b/distribution/src/main/scripts/interface/gen-html/Blur.html
----------------------------------------------------------------------
diff --git a/distribution/src/main/scripts/interface/gen-html/Blur.html 
b/distribution/src/main/scripts/interface/gen-html/Blur.html
index 063415b..f91ed0d 100644
--- a/distribution/src/main/scripts/interface/gen-html/Blur.html
+++ b/distribution/src/main/scripts/interface/gen-html/Blur.html
@@ -22,9 +22,11 @@
 <li><a href="Blur.html#Fn_Blur_fetchRow">fetchRow</a></li>
 <li><a href="Blur.html#Fn_Blur_getTableStats">getTableStats</a></li>
 <li><a href="Blur.html#Fn_Blur_isInSafeMode">isInSafeMode</a></li>
+<li><a href="Blur.html#Fn_Blur_metrics">metrics</a></li>
 <li><a href="Blur.html#Fn_Blur_mutate">mutate</a></li>
 <li><a href="Blur.html#Fn_Blur_mutateBatch">mutateBatch</a></li>
 <li><a href="Blur.html#Fn_Blur_optimize">optimize</a></li>
+<li><a href="Blur.html#Fn_Blur_parseQuery">parseQuery</a></li>
 <li><a href="Blur.html#Fn_Blur_query">query</a></li>
 <li><a href="Blur.html#Fn_Blur_queryStatusById">queryStatusById</a></li>
 <li><a href="Blur.html#Fn_Blur_queryStatusIdList">queryStatusIdList</a></li>
@@ -59,6 +61,7 @@
 <a href="Blur.html#Struct_FetchResult">FetchResult</a><br/>
 <a href="Blur.html#Struct_FetchRowResult">FetchRowResult</a><br/>
 <a href="Blur.html#Struct_HighlightOptions">HighlightOptions</a><br/>
+<a href="Blur.html#Struct_Metric">Metric</a><br/>
 <a href="Blur.html#Enum_QueryState">QueryState</a><br/>
 <a href="Blur.html#Struct_Record">Record</a><br/>
 <a href="Blur.html#Struct_RecordMutation">RecordMutation</a><br/>
@@ -448,7 +451,13 @@ updates through MapReduce are allowed and in fact they are 
only allowed if the t
 </td><td>default</td><td></td></tr>
 <tr><td>14</td><td>tableProperties</td><td><code>map&lt;<code>string</code>, 
<code>string</code>&gt;</code></td><td></td><td>default</td><td></td></tr>
 </table><br/><p/>
-<br/></div><hr/><h2 id="Services">Services</h2>
+<br/></div><div class="definition"><h3 id="Struct_Metric">Struct: Metric</h3>
+<table class="table-bordered table-striped 
table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default
 value</th></thead>
+<tr><td>1</td><td>name</td><td><code>string</code></td><td></td><td>default</td><td></td></tr>
+<tr><td>2</td><td>strMap</td><td><code>map&lt;<code>string</code>, 
<code>string</code>&gt;</code></td><td></td><td>default</td><td></td></tr>
+<tr><td>3</td><td>longMap</td><td><code>map&lt;<code>string</code>, 
<code>i64</code>&gt;</code></td><td></td><td>default</td><td></td></tr>
+<tr><td>4</td><td>doubleMap</td><td><code>map&lt;<code>string</code>, 
<code>double</code>&gt;</code></td><td></td><td>default</td><td></td></tr>
+</table><br/></div><hr/><h2 id="Services">Services</h2>
 <h3 id="Svc_Blur">Service: Blur</h3>
 <p/>
 <br/><div class="definition"><h4 id="Fn_Blur_shardClusterList">Function: 
Blur.shardClusterList</h4>
@@ -512,6 +521,13 @@ the shard given the same situation.
 </pre>Executes a query against a the given table and returns the results.  If 
this method is executed against a controller the results will contain the 
aggregated results from all the shards.  If this method is executed against a 
shard server the results will only contain aggregated results from the shards 
of the given table that are being served on the shard server, if any.
 @param table the table name.
 @param blurQuery the query to execute.
+<br/></div><div class="definition"><h4 id="Fn_Blur_parseQuery">Function: 
Blur.parseQuery</h4>
+<pre><code>string</code> parseQuery(<code>string</code> table,
+                  <code><a 
href="Blur.html#Struct_SimpleQuery">SimpleQuery</a></code> simpleQuery)
+    throws <code><a 
href="Blur.html#Struct_BlurException">BlurException</a></code>
+</pre>Parses the given query and return the string represents the query.
+@param table the table name.
+@param simpleQuery the query to parse.
 <br/></div><div class="definition"><h4 id="Fn_Blur_cancelQuery">Function: 
Blur.cancelQuery</h4>
 <pre><code>void</code> cancelQuery(<code>string</code> table,
                  <code>i64</code> uuid)
@@ -591,4 +607,7 @@ the shard given the same situation.
 </pre></div><div class="definition"><h4 id="Fn_Blur_configuration">Function: 
Blur.configuration</h4>
 <pre><code>map&lt;<code>string</code>, <code>string</code>&gt;</code> 
configuration()
     throws <code><a 
href="Blur.html#Struct_BlurException">BlurException</a></code>
+</pre></div><div class="definition"><h4 id="Fn_Blur_metrics">Function: 
Blur.metrics</h4>
+<pre><code>map&lt;<code>string</code>, <code><a 
href="Blur.html#Struct_Metric">Metric</a></code>&gt;</code> 
metrics(<code>set&lt;<code>string</code>&gt;</code> metrics)
+    throws <code><a 
href="Blur.html#Struct_BlurException">BlurException</a></code>
 </pre></div></div></body></html>

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/7137006b/distribution/src/main/scripts/interface/gen-html/index.html
----------------------------------------------------------------------
diff --git a/distribution/src/main/scripts/interface/gen-html/index.html 
b/distribution/src/main/scripts/interface/gen-html/index.html
index a1b554a..f5836f7 100644
--- a/distribution/src/main/scripts/interface/gen-html/index.html
+++ b/distribution/src/main/scripts/interface/gen-html/index.html
@@ -18,9 +18,11 @@
 <li><a href="Blur.html#Fn_Blur_fetchRow">fetchRow</a></li>
 <li><a href="Blur.html#Fn_Blur_getTableStats">getTableStats</a></li>
 <li><a href="Blur.html#Fn_Blur_isInSafeMode">isInSafeMode</a></li>
+<li><a href="Blur.html#Fn_Blur_metrics">metrics</a></li>
 <li><a href="Blur.html#Fn_Blur_mutate">mutate</a></li>
 <li><a href="Blur.html#Fn_Blur_mutateBatch">mutateBatch</a></li>
 <li><a href="Blur.html#Fn_Blur_optimize">optimize</a></li>
+<li><a href="Blur.html#Fn_Blur_parseQuery">parseQuery</a></li>
 <li><a href="Blur.html#Fn_Blur_query">query</a></li>
 <li><a href="Blur.html#Fn_Blur_queryStatusById">queryStatusById</a></li>
 <li><a href="Blur.html#Fn_Blur_queryStatusIdList">queryStatusIdList</a></li>
@@ -55,6 +57,7 @@
 <a href="Blur.html#Struct_FetchResult">FetchResult</a><br/>
 <a href="Blur.html#Struct_FetchRowResult">FetchRowResult</a><br/>
 <a href="Blur.html#Struct_HighlightOptions">HighlightOptions</a><br/>
+<a href="Blur.html#Struct_Metric">Metric</a><br/>
 <a href="Blur.html#Enum_QueryState">QueryState</a><br/>
 <a href="Blur.html#Struct_Record">Record</a><br/>
 <a href="Blur.html#Struct_RecordMutation">RecordMutation</a><br/>

Reply via email to