List of usage examples for org.apache.cassandra.cql3 CQL3Type isCollection
default boolean isCollection()
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; }