@Override
 public int hashCode() {
   int result = keys.hashCode();
   result = 31 * result + measures.hashCode();
   result = 31 * result + predicate.hashCode();
   return result;
 }
  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    AggregationQuery query = (AggregationQuery) o;

    if (!keys.equals(query.keys)) return false;
    if (!measures.equals(query.measures)) return false;
    if (!predicate.equals(query.predicate)) return false;

    return true;
  }
 public Set<String> getAllKeys() {
   LinkedHashSet<String> result = new LinkedHashSet<>();
   result.addAll(keys);
   result.addAll(predicate.getDimensions());
   return result;
 }