/**
 * Query entity is a description of {@link IgniteCache cache} entry (composed of key and value)
 * in a way of how it must be indexed and can be queried.
 */
public class QueryEntity {
    private String keyType;
    private String valType;
 
    // Map of field names to type names.
    private LinkedHashMap<String, String> flds;
 
    // Collection of indexes.
    private Collection<QueryIndex> idxs;
 
    // In addition to the obvious getters and setters, 
    // we should also have these convenience methods.
    // All these methods should throw an exception
    // in case if a duplicate field or index already exists.
    public void addField(String name, String type);
    public void addField(String name, Class<?> type);
    public void addIndex(QueryIndex idx);
}

// I only show constructors here, but we should also have
// corresponding setter methods.
public class QueryIndex {
    private LinkedHashMap<String, Boolean> fields;
    private QueryIndexType idxType;

    // Creates index for one field.
    //
    // If index is sorted, then ascending sorting is used by default.
    // To specify sort order, use the next method.
    //
    // This constructor should also have a corresponding setter method.
    public QueryIndex(String field, QueryIndexType type) {...}
 
    // Creates index for one field. The last boolean parameter
    // is ignored for non-sorted indexes.
    //
    // This constructor should also have a corresponding setter method.
    public QueryIndex(String field, QueryIndexType type, boolean asc) {...}
 
    // Creates index for multiple fields.
    //
    // If index is sorted, then ascending sorting is used by default.
    // To specify sort order, use the next method.
    //
    // This constructor should also have a corresponding setter method.
    public QueryIndex(Collection<String> fields, QueryIndexType type) {...}
 
    // Creates index for multiple fields.
    // Fields are passed in as a map, with field name as a key and sort order
    // as a value (true for ascending). The value is ignored for non-sorted indexes.
    //
    // This constructor is useful for sorted indexes, where it is necessary to specify
    // a separate sort order for each field.
    //
    // This constructor should also have a corresponding setter method.
    public QueryIndex(LinkedHashMap<String, Boolean> fields, QueryIndexType type) {...}
 
    // Basic getters.
    public LinkedHashMap<String, Boolean> getFields();
    public QueryIndexType getIndexType();
    public List<String> getFieldNames();
    public boolean hasField(String field);
 
    // Returns null if field does not exist.
    public Boolean getSortOrder(String field);
}
 
enum QueryIndexType {
    SORTED, FULLTEXT, GEOSPATIAL
}
  • No labels