new IndexCapabilities<Attribute>("Hash",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.QZ},
attr -> HashIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute>("Unique",
new IndexFeature[]{IndexFeature.UNIQUE, IndexFeature.EQ, IndexFeature.IN},
attr -> UniqueIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute[]>("Compound",
new IndexFeature[]{IndexFeature.COMPOUND, IndexFeature.EQ, IndexFeature.IN, IndexFeature.QZ},
attrs -> {
Attribute[] attributes = (Attribute[]) Arrays.stream(attrs)
.map(attr -> compatibleAttribute(attr))
.toArray();
return CompoundIndex.onAttributes(attributes);
new IndexCapabilities<Attribute>("Navigable",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.QZ, IndexFeature.LT, IndexFeature.GT, IndexFeature.BT},
attr -> NavigableIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute>("RadixTree",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.SW},
attr -> RadixTreeIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute>("ReversedRadixTree",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.EW},
attr -> ReversedRadixTreeIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute>("InvertedRadixTree",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.CI},
attr -> InvertedRadixTreeIndex.onAttribute(compatibleAttribute(attr))),
new IndexCapabilities<Attribute>("SuffixTree",
new IndexFeature[]{IndexFeature.EQ, IndexFeature.IN, IndexFeature.EW, IndexFeature.SC},
attr -> SuffixTreeIndex.onAttribute(compatibleAttribute(attr)))