package org.apache.cassandra.cql3.statements; import java.util.*; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.*; import org.apache.cassandra.cql3.CFDefinition; import org.apache.cassandra.cql3.ColumnSpecification; public class SelectionColumnMapping implements SelectionColumns { // Uses LinkedHashMultimap because ordering of keys must be maintained private final LinkedHashMultimap<ColumnSpecification, CFDefinition.Name> columnMappings; private SelectionColumnMapping() { this.columnMappings = LinkedHashMultimap.create(); } protected static SelectionColumnMapping newMapping() { return new SelectionColumnMapping(); } protected static SelectionColumnMapping simpleMapping(List<CFDefinition.Name> columnDefinitions) { SelectionColumnMapping mapping = new SelectionColumnMapping(); for (CFDefinition.Name def: columnDefinitions) mapping.addMapping(def, def); return mapping; } protected SelectionColumnMapping addMapping(ColumnSpecification colSpec, CFDefinition.Name column) { columnMappings.put(colSpec, column); return this; } protected SelectionColumnMapping addMapping(ColumnSpecification colSpec, Iterable<CFDefinition.Name> columns) { columnMappings.putAll(colSpec, columns); return this; } public List<ColumnSpecification> getColumnSpecifications() { // return a mutable copy as we may add extra columns // for ordering (CASSANDRA-4911 & CASSANDRA-8286) return new ArrayList(columnMappings.keySet()); } public Multimap<ColumnSpecification, CFDefinition.Name> getMappings() { return Multimaps.unmodifiableMultimap(columnMappings); } public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof SelectionColumns)) return false; return Objects.equals(columnMappings, ((SelectionColumns) obj).getMappings()); } public int hashCode() { return Objects.hashCode(columnMappings); } public String toString() { final Function<CFDefinition.Name, String> getDefName = new Function<CFDefinition.Name, String>() { public String apply(CFDefinition.Name name) { return name.toString(); } }; Function<Map.Entry<ColumnSpecification, Collection<CFDefinition.Name>>, String> mappingEntryToString = new Function<Map.Entry<ColumnSpecification, Collection<CFDefinition.Name>>, String>(){ public String apply(Map.Entry<ColumnSpecification, Collection<CFDefinition.Name>> entry) { StringBuilder builder = new StringBuilder(); builder.append(entry.getKey().name.toString()); builder.append(":["); builder.append(Joiner.on(',').join(Iterables.transform(entry.getValue(), getDefName))); builder.append("]"); return builder.toString(); } }; StringBuilder builder = new StringBuilder(); builder.append("{ "); builder.append(Joiner.on(", ") .join(Iterables.transform(columnMappings.asMap().entrySet(), mappingEntryToString))); builder.append(" }"); return builder.toString(); } }