Example usage for org.apache.cassandra.cql3 CQL3Type isCollection

List of usage examples for org.apache.cassandra.cql3 CQL3Type isCollection

Introduction

In this page you can find the example usage for org.apache.cassandra.cql3 CQL3Type isCollection.

Prototype

default boolean isCollection() 

Source Link

Usage

From source file:com.tuplejump.stargate.cassandra.CassandraUtils.java

License:Apache License

public static Options getOptions(Properties mapping, ColumnFamilyStore baseCfs, String colName) {
    Properties primary = mapping;
    String defaultField = colName;
    Map<String, NumericConfig> numericFieldOptions = new HashMap<>();
    Map<String, FieldType> fieldDocValueTypes = new TreeMap<>();
    Map<String, FieldType> collectionFieldDocValueTypes = new TreeMap<>();

    Map<String, FieldType> fieldTypes = new TreeMap<>();
    Map<String, FieldType[]> collectionFieldTypes = new TreeMap<>();
    Map<String, AbstractType> validators = new TreeMap<>();
    Map<Integer, Pair<String, ByteBuffer>> clusteringKeysIndexed = new LinkedHashMap<>();
    Map<Integer, Pair<String, ByteBuffer>> partitionKeysIndexed = new LinkedHashMap<>();
    Map<String, Analyzer> perFieldAnalyzers;
    Set<String> indexedColumnNames;

    //getForRow all the fields options.
    indexedColumnNames = new TreeSet<>();
    indexedColumnNames.addAll(mapping.getFields().keySet());

    Set<String> added = new HashSet<>(indexedColumnNames.size());
    List<ColumnDefinition> partitionKeys = baseCfs.metadata.partitionKeyColumns();
    List<ColumnDefinition> clusteringKeys = baseCfs.metadata.clusteringKeyColumns();

    for (ColumnDefinition colDef : partitionKeys) {
        String columnName = CFDefinition.definitionType.getString(colDef.name);
        if (Options.logger.isDebugEnabled()) {
            Options.logger.debug("Partition key name is {} and index is {}", colName, colDef.componentIndex);
        }//from ww  w.  jav a  2  s .  c o m
        validators.put(columnName, colDef.getValidator());
        if (indexedColumnNames.contains(columnName)) {
            int componentIndex = colDef.componentIndex == null ? 0 : colDef.componentIndex;
            partitionKeysIndexed.put(componentIndex, Pair.create(columnName, colDef.name));
            Properties properties = mapping.getFields().get(columnName.toLowerCase());
            addFieldType(columnName, colDef.getValidator(), properties, numericFieldOptions, fieldDocValueTypes,
                    collectionFieldDocValueTypes, fieldTypes, collectionFieldTypes);
            added.add(columnName.toLowerCase());
        }
    }

    for (ColumnDefinition colDef : clusteringKeys) {
        String columnName = CFDefinition.definitionType.getString(colDef.name);
        if (Options.logger.isDebugEnabled()) {
            Options.logger.debug("Clustering key name is {} and index is {}", colName,
                    colDef.componentIndex + 1);
        }
        validators.put(columnName, colDef.getValidator());
        if (indexedColumnNames.contains(columnName)) {
            clusteringKeysIndexed.put(colDef.componentIndex + 1, Pair.create(columnName, colDef.name));
            Properties properties = mapping.getFields().get(columnName.toLowerCase());
            addFieldType(columnName, colDef.getValidator(), properties, numericFieldOptions, fieldDocValueTypes,
                    collectionFieldDocValueTypes, fieldTypes, collectionFieldTypes);
            added.add(columnName.toLowerCase());
        }
    }

    for (String columnName : indexedColumnNames) {
        if (added.add(columnName.toLowerCase())) {
            Properties options = mapping.getFields().get(columnName);
            ColumnDefinition colDef = getColumnDefinition(baseCfs, columnName);
            if (colDef != null) {
                validators.put(columnName, colDef.getValidator());
                addFieldType(columnName, colDef.getValidator(), options, numericFieldOptions,
                        fieldDocValueTypes, collectionFieldDocValueTypes, fieldTypes, collectionFieldTypes);
            } else {
                throw new IllegalArgumentException(
                        String.format("Column Definition for %s not found", columnName));
            }
            if (options.getType() == Properties.Type.object) {
                mapping.getFields().putAll(options.getFields());
            }
        }

    }
    Set<ColumnDefinition> otherColumns = baseCfs.metadata.regularColumns();
    for (ColumnDefinition colDef : otherColumns) {
        String columnName = CFDefinition.definitionType.getString(colDef.name);
        validators.put(columnName, colDef.getValidator());
    }

    numericFieldOptions.putAll(primary.getDynamicNumericConfig());

    Analyzer defaultAnalyzer = mapping.getLuceneAnalyzer();
    perFieldAnalyzers = mapping.perFieldAnalyzers();
    Analyzer analyzer = new PerFieldAnalyzerWrapper(defaultAnalyzer, perFieldAnalyzers);
    Map<String, Properties.Type> types = new TreeMap<>();
    Set<String> nestedFields = new TreeSet<>();
    for (Map.Entry<String, AbstractType> entry : validators.entrySet()) {
        CQL3Type cql3Type = entry.getValue().asCQL3Type();
        AbstractType inner = getValueValidator(cql3Type.getType());
        if (cql3Type.isCollection()) {
            types.put(entry.getKey(), fromAbstractType(inner.asCQL3Type()));
            nestedFields.add(entry.getKey());
        } else {
            types.put(entry.getKey(), fromAbstractType(cql3Type));
        }

    }

    return new Options(primary, numericFieldOptions, fieldDocValueTypes, collectionFieldDocValueTypes,
            fieldTypes, collectionFieldTypes, types, nestedFields, clusteringKeysIndexed, partitionKeysIndexed,
            perFieldAnalyzers, indexedColumnNames, analyzer, defaultField);
}

From source file:org.elassandra.cluster.InternalCassandraClusterService.java

License:Apache License

@Override
public Object[] rowAsArray(final String index, final String type, UntypedResultSet.Row row,
        boolean valueForSearch) throws IOException {
    final Object values[] = new Object[row.getColumns().size()];
    final List<ColumnSpecification> columnSpecs = row.getColumns();

    final IndexService indexService = indexServiceSafe(index);
    final DocumentMapper documentMapper = indexService.mapperService().documentMapper(type);
    final DocumentFieldMappers docFieldMappers = documentMapper.mappers();

    for (int columnIndex = 0; columnIndex < columnSpecs.size(); columnIndex++) {
        if (!row.has(columnIndex) || ByteBufferUtil.EMPTY_BYTE_BUFFER.equals(row.getBlob(columnIndex))) {
            values[columnIndex] = null;/*from  w w w.j a  va2  s. c  om*/
            continue;
        }

        ColumnSpecification colSpec = columnSpecs.get(columnIndex);
        String columnName = colSpec.name.toString();
        CQL3Type cql3Type = colSpec.type.asCQL3Type();

        if (cql3Type instanceof CQL3Type.Native) {
            final FieldMapper fieldMapper = docFieldMappers.smartNameFieldMapper(columnName);
            switch ((CQL3Type.Native) cql3Type) {
            case ASCII:
            case TEXT:
            case VARCHAR:
                values[columnIndex] = row.getString(columnIndex);
                break;
            case TIMEUUID:
            case UUID:
                values[columnIndex] = row.getUUID(columnIndex).toString();
                break;
            case TIMESTAMP:
                values[columnIndex] = value(fieldMapper, row.getTimestamp(columnIndex).getTime(),
                        valueForSearch);
                break;
            case INT:
                values[columnIndex] = value(fieldMapper, row.getInt(columnIndex), valueForSearch);
                break;
            case SMALLINT:
                values[columnIndex] = value(fieldMapper, row.getShort(columnIndex), valueForSearch);
                break;
            case TINYINT:
                values[columnIndex] = value(fieldMapper, row.getByte(columnIndex), valueForSearch);
                break;
            case BIGINT:
                values[columnIndex] = value(fieldMapper, row.getLong(columnIndex), valueForSearch);
                break;
            case DOUBLE:
                values[columnIndex] = value(fieldMapper, row.getDouble(columnIndex), valueForSearch);
                break;
            case FLOAT:
                values[columnIndex] = value(fieldMapper, row.getFloat(columnIndex), valueForSearch);
                break;
            case BLOB:
                values[columnIndex] = value(fieldMapper, row.getBytes(columnIndex).array(), valueForSearch);
                break;
            case BOOLEAN:
                values[columnIndex] = value(fieldMapper, row.getBoolean(columnIndex), valueForSearch);
                break;
            case COUNTER:
                logger.warn("Ignoring unsupported counter {} for column {}", cql3Type, columnName);
                break;
            case INET:
                values[columnIndex] = value(fieldMapper, NetworkAddress.format(row.getInetAddress(columnIndex)),
                        valueForSearch);
                break;
            default:
                logger.error("Ignoring unsupported type {} for column {}", cql3Type, columnName);
            }
        } else if (cql3Type.isCollection()) {
            AbstractType<?> elementType;
            switch (((CollectionType<?>) colSpec.type).kind) {
            case LIST:
                List list;
                elementType = ((ListType<?>) colSpec.type).getElementsType();
                if (elementType instanceof UserType) {
                    final ObjectMapper objectMapper = documentMapper.objectMappers().get(columnName);
                    final List<ByteBuffer> lbb = row.getList(columnIndex, BytesType.instance);
                    list = new ArrayList(lbb.size());
                    for (ByteBuffer bb : lbb) {
                        list.add(deserialize(elementType, bb, objectMapper));
                    }
                } else {
                    final FieldMapper fieldMapper = docFieldMappers.smartNameFieldMapper(columnName);
                    final List list2 = row.getList(colSpec.name.toString(), elementType);
                    list = new ArrayList(list2.size());
                    for (Object v : list2) {
                        list.add(value(fieldMapper, v, valueForSearch));
                    }
                }
                values[columnIndex] = (list.size() == 1) ? list.get(0) : list;
                break;
            case SET:
                Set set;
                elementType = ((SetType<?>) colSpec.type).getElementsType();
                if (elementType instanceof UserType) {
                    final ObjectMapper objectMapper = documentMapper.objectMappers().get(columnName);
                    final Set<ByteBuffer> lbb = row.getSet(columnIndex, BytesType.instance);
                    set = new HashSet(lbb.size());
                    for (ByteBuffer bb : lbb) {
                        set.add(deserialize(elementType, bb, objectMapper));
                    }
                } else {
                    final FieldMapper fieldMapper = docFieldMappers.smartNameFieldMapper(columnName);
                    final Set set2 = row.getSet(columnIndex, elementType);
                    set = new HashSet(set2.size());
                    for (Object v : set2) {
                        set.add(value(fieldMapper, v, valueForSearch));
                    }
                }
                values[columnIndex] = (set.size() == 1) ? set.iterator().next() : set;
                break;
            case MAP:
                Map map;
                if (((MapType<?, ?>) colSpec.type).getKeysType().asCQL3Type() != CQL3Type.Native.TEXT) {
                    throw new IOException("Only support map<text,?>, bad type for column " + columnName);
                }
                UTF8Type keyType = (UTF8Type) ((MapType<?, ?>) colSpec.type).getKeysType();
                elementType = ((MapType<?, ?>) colSpec.type).getValuesType();
                final ObjectMapper objectMapper = documentMapper.objectMappers().get(columnName);
                if (elementType instanceof UserType) {
                    final Map<String, ByteBuffer> lbb = row.getMap(columnIndex, keyType, BytesType.instance);
                    map = new HashMap<String, Map<String, Object>>(lbb.size());
                    for (String key : lbb.keySet()) {
                        map.put(key, deserialize(elementType, lbb.get(key), objectMapper.getMapper(key)));
                    }
                } else {
                    Map<String, Object> map2 = (Map<String, Object>) row.getMap(columnIndex, keyType,
                            elementType);
                    map = new HashMap<String, Object>(map2.size());
                    for (String key : map2.keySet()) {
                        FieldMapper subMapper = (FieldMapper) objectMapper.getMapper(key);
                        map.put(key, value(subMapper, map2.get(key), valueForSearch));
                    }
                }
                values[columnIndex] = map;
                break;
            }
        } else if (colSpec.type instanceof UserType) {
            ByteBuffer bb = row.getBytes(columnIndex);
            values[columnIndex] = deserialize(colSpec.type, bb, documentMapper.objectMappers().get(columnName));
        } else if (cql3Type instanceof CQL3Type.Custom) {
            logger.warn("CQL3.Custum type not supported for column " + columnName);
        }
    }
    return values;
}

From source file:org.elasticsearch.cassandra.cluster.InternalCassandraClusterService.java

License:Apache License

@Override
public int rowAsMap(final String index, final String type, UntypedResultSet.Row row,
        Map<String, Object> mapObject) throws IOException {
    int putCount = 0;
    List<ColumnSpecification> columnSpecs = row.getColumns();

    IndexService indexService = indicesService.indexServiceSafe(index);
    DocumentMapper documentMapper = indexService.mapperService().documentMapper(type);

    for (int columnIndex = 0; columnIndex < columnSpecs.size(); columnIndex++) {
        ColumnSpecification colSpec = columnSpecs.get(columnIndex);
        String columnName = colSpec.name.toString();
        CQL3Type cql3Type = colSpec.type.asCQL3Type();

        FieldMapper fieldMapper = documentMapper.mappers().smartNameFieldMapper(columnName);
        if (fieldMapper == null && columnName.equals("_token")) {
            fieldMapper = documentMapper.tokenFieldMapper();
        }//from  w  w w . j  a v a2  s  .  com

        if (!row.has(colSpec.name.toString()))
            continue;

        if (cql3Type instanceof CQL3Type.Native) {
            switch ((CQL3Type.Native) cql3Type) {
            case ASCII:
            case TEXT:
            case VARCHAR:
                mapObject.put(columnName, row.getString(colSpec.name.toString()));
                putCount++;
                break;
            case TIMEUUID:
            case UUID:
                mapObject.put(columnName, row.getUUID(colSpec.name.toString()).toString());
                putCount++;
                break;
            case TIMESTAMP:
                mapObject.put(columnName, fieldMapper.fieldType()
                        .valueForSearch(row.getTimestamp(colSpec.name.toString()).getTime()));
                putCount++;
                break;
            case INT:
                mapObject.put(columnName,
                        fieldMapper.fieldType().valueForSearch(row.getInt(colSpec.name.toString())));
                putCount++;
                break;
            case BIGINT:
                mapObject.put(columnName,
                        fieldMapper.fieldType().valueForSearch(row.getLong(colSpec.name.toString())));
                putCount++;
                break;
            case DECIMAL:
            case DOUBLE:
                mapObject.put(columnName,
                        fieldMapper.fieldType().valueForSearch(row.getDouble(colSpec.name.toString())));
                putCount++;
                break;
            case BLOB:
                mapObject.put(columnName,
                        fieldMapper.fieldType().valueForSearch(row.getBytes(colSpec.name.toString())));
                putCount++;
                break;
            case BOOLEAN:
                mapObject.put(columnName,
                        fieldMapper.fieldType().valueForSearch(row.getBoolean(colSpec.name.toString())));
                putCount++;
                break;
            case COUNTER:
                break;
            case INET:
                mapObject.put(columnName, fieldMapper.fieldType()
                        .valueForSearch(row.getInetAddress(colSpec.name.toString()).getHostAddress()));
                putCount++;
                break;
            default:
                logger.warn("Ignoring unsupported type {}", cql3Type);
            }
        } else if (cql3Type.isCollection()) {
            AbstractType<?> elementType;
            switch (((CollectionType<?>) colSpec.type).kind) {
            case LIST:
                List list;
                elementType = ((ListType<?>) colSpec.type).getElementsType();
                if (elementType instanceof UserType) {
                    List<ByteBuffer> lbb = row.getList(colSpec.name.toString(), BytesType.instance);
                    list = new ArrayList<Map<String, Object>>(lbb.size());
                    for (ByteBuffer bb : lbb) {
                        list.add(ElasticSecondaryIndex.deserialize(elementType, bb));
                    }
                } else {
                    list = row.getList(colSpec.name.toString(), elementType);
                }
                mapObject.put(columnName, (list.size() == 1) ? list.get(0) : list);
                putCount++;
                break;
            case SET:
                Set set;
                elementType = ((SetType<?>) colSpec.type).getElementsType();
                if (elementType instanceof UserType) {
                    Set<ByteBuffer> lbb = row.getSet(colSpec.name.toString(), BytesType.instance);
                    set = new HashSet<Map<String, Object>>(lbb.size());
                    for (ByteBuffer bb : lbb) {
                        set.add(ElasticSecondaryIndex.deserialize(elementType, bb));
                    }
                } else {
                    set = row.getSet(colSpec.name.toString(), elementType);
                }
                mapObject.put(columnName, (set.size() == 1) ? set.iterator().next() : set);
                putCount++;
                break;
            case MAP:
                Map map;
                if (((MapType<?, ?>) colSpec.type).getKeysType().asCQL3Type() != CQL3Type.Native.TEXT) {
                    throw new IOException("Only support map<text,?>, bad type for column " + columnName);
                }
                UTF8Type keyType = (UTF8Type) ((MapType<?, ?>) colSpec.type).getKeysType();
                elementType = ((MapType<?, ?>) colSpec.type).getValuesType();
                if (elementType instanceof UserType) {
                    Map<String, ByteBuffer> lbb = row.getMap(colSpec.name.toString(), keyType,
                            BytesType.instance);
                    map = new HashMap<String, Map<String, Object>>(lbb.size());
                    for (String key : lbb.keySet()) {
                        map.put(key, ElasticSecondaryIndex.deserialize(elementType, lbb.get(key)));
                    }
                } else {
                    map = row.getMap(colSpec.name.toString(), keyType, elementType);
                }
                mapObject.put(columnName, map);
                putCount++;
                break;
            }
        } else if (colSpec.type instanceof UserType) {
            ByteBuffer bb = row.getBytes(colSpec.name.toString());
            mapObject.put(columnName, ElasticSecondaryIndex.deserialize(colSpec.type, bb));
            putCount++;
        } else if (cql3Type instanceof CQL3Type.Custom) {
            logger.warn("CQL3.Custum type not supported for column " + columnName);
        }
    }
    return putCount;
}