class TableDefine {

    private final Map<HugeKeys, String> columns;
    private final List<HugeKeys> keys;
    private final Map<String, String> typesMapping;

    public TableDefine() {
        this.columns = InsertionOrderUtil.newMap();
        this.keys = InsertionOrderUtil.newList();
        this.typesMapping = ImmutableMap.of();
    }

    public TableDefine(Map<String, String> typesMapping) {
        this.columns = InsertionOrderUtil.newMap();
        this.keys = InsertionOrderUtil.newList();
        this.typesMapping = typesMapping;
    }

    public TableDefine column(HugeKeys key, String... desc) {<FILL_FUNCTION_BODY>}

    public Map<HugeKeys, String> columns() {
        return Collections.unmodifiableMap(this.columns);
    }

    public Set<HugeKeys> columnNames() {
        return this.columns.keySet();
    }

    public Collection<String> columnTypes() {
        return this.columns.values();
    }

    public void keys(HugeKeys... keys) {
        this.keys.addAll(Arrays.asList(keys));
    }

    public List<HugeKeys> keys() {
        return Collections.unmodifiableList(this.keys);
    }
}

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < desc.length; i++) {
            String type = desc[i];
            // The first element of 'desc' is column data type, which may be
            // mapped to actual data type supported by backend store
            if (i == 0 && this.typesMapping.containsKey(type)) {
                type = this.typesMapping.get(type);
            }
            assert type != null;
            sb.append(type);
            if (i != desc.length - 1) {
                sb.append(" ");
            }
        }
        this.columns.put(key, sb.toString());
        return this;
    
<no_super_class>