private static ImmutableMap<String, int[]> mapByName(Collection<Field> fields) { ImmutableMap.Builder<String, int[]> builder = new ImmutableMap.Builder<String, int[]>(); int i = 0; for (Field field : fields) { builder.put(field.getName(), new int[] {i}); i += 1; } return builder.build(); }
@Override public String format(T value) { if (value == null) return "NULL"; StringBuilder sb = new StringBuilder("{"); int i = 0; for (UserType.Field field : definition) { if (i > 0) sb.append(","); sb.append(Metadata.quoteIfNecessary(field.getName())); sb.append(":"); sb.append(formatField(value, Metadata.quoteIfNecessary(field.getName()))); i += 1; } sb.append("}"); return sb.toString(); }
@Override public ByteBuffer serialize(T value, ProtocolVersion protocolVersion) { if (value == null) return null; int size = 0; int length = definition.size(); ByteBuffer[] elements = new ByteBuffer[length]; int i = 0; for (UserType.Field field : definition) { elements[i] = serializeField(value, Metadata.quoteIfNecessary(field.getName()), protocolVersion); size += 4 + (elements[i] == null ? 0 : elements[i].remaining()); i++; } ByteBuffer result = ByteBuffer.allocate(size); for (ByteBuffer bb : elements) { if (bb == null) { result.putInt(-1); } else { result.putInt(bb.remaining()); result.put(bb.duplicate()); } } return (ByteBuffer) result.flip(); }
@Override public T deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) { if (bytes == null) return null; // empty byte buffers will result in empty values try { ByteBuffer input = bytes.duplicate(); T value = newInstance(); for (UserType.Field field : definition) { if (!input.hasRemaining()) break; int n = input.getInt(); ByteBuffer element = n < 0 ? null : CodecUtils.readBytes(input, n); value = deserializeAndSetField(element, value, Metadata.quoteIfNecessary(field.getName()), protocolVersion); } return value; } catch (BufferUnderflowException e) { throw new InvalidTypeException("Not enough bytes to deserialize a UDT", e); } }
@Override public T deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) { if (bytes == null) return null; // empty byte buffers will result in empty values try { ByteBuffer input = bytes.duplicate(); T value = newInstance(); for (UserType.Field field : definition) { if (!input.hasRemaining()) break; int n = input.getInt(); ByteBuffer element = n < 0 ? null : CodecUtils.readBytes(input, n); value = deserializeAndSetField(element, value, Metadata.escapeId(field.getName()), protocolVersion); } return value; } catch (BufferUnderflowException e) { throw new InvalidTypeException("Not enough bytes to deserialize a UDT", e); } }
@Override public T deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) { if (bytes == null) return null; // empty byte buffers will result in empty values try { ByteBuffer input = bytes.duplicate(); T value = newInstance(); for (UserType.Field field : definition) { if (!input.hasRemaining()) break; int n = input.getInt(); ByteBuffer element = n < 0 ? null : CodecUtils.readBytes(input, n); value = deserializeAndSetField(element, value, Metadata.escapeId(field.getName()), protocolVersion); } return value; } catch (BufferUnderflowException e) { throw new InvalidTypeException("Not enough bytes to deserialize a UDT", e); } }
@Override public String format(T value) { if (value == null) return "NULL"; StringBuilder sb = new StringBuilder("{"); int i = 0; for (UserType.Field field : definition) { if (i > 0) sb.append(","); sb.append(Metadata.escapeId(field.getName())); sb.append(":"); sb.append(formatField(value, Metadata.escapeId(field.getName()))); i += 1; } sb.append("}"); return sb.toString(); }
@Override public String format(T value) { if (value == null) return "NULL"; StringBuilder sb = new StringBuilder("{"); int i = 0; for (UserType.Field field : definition) { if (i > 0) sb.append(","); sb.append(Metadata.escapeId(field.getName())); sb.append(":"); sb.append(formatField(value, Metadata.escapeId(field.getName()))); i += 1; } sb.append("}"); return sb.toString(); }
@Override public String format(T value) { if (value == null) return "NULL"; StringBuilder sb = new StringBuilder("{"); int i = 0; for (UserType.Field field : definition) { if (i > 0) sb.append(","); sb.append(Metadata.quoteIfNecessary(field.getName())); sb.append(":"); sb.append(formatField(value, Metadata.quoteIfNecessary(field.getName()))); i += 1; } sb.append("}"); return sb.toString(); }
UserType(String keyspace, String typeName, Collection<Field> fields, ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { super(DataType.Name.UDT); this.keyspace = keyspace; this.typeName = typeName; this.protocolVersion = protocolVersion; // codecRegistry can be null, if this object is being constructed from a response message // see Responses.Result.Rows.Metadata.decode() this.codecRegistry = codecRegistry; this.byIdx = fields.toArray(new Field[fields.size()]); ImmutableMap.Builder<String, int[]> builder = new ImmutableMap.Builder<String, int[]>(); for (int i = 0; i < byIdx.length; i++) builder.put(byIdx[i].getName(), new int[]{i}); this.byName = builder.build(); }
UserType(String keyspace, String typeName, Collection<Field> fields, ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { super(DataType.Name.UDT); this.keyspace = keyspace; this.typeName = typeName; this.protocolVersion = protocolVersion; // codecRegistry can be null, if this object is being constructed from a response message // see Responses.Result.Rows.Metadata.decode() this.codecRegistry = codecRegistry; this.byIdx = fields.toArray(new Field[fields.size()]); ImmutableMap.Builder<String, int[]> builder = new ImmutableMap.Builder<String, int[]>(); for (int i = 0; i < byIdx.length; i++) builder.put(byIdx[i].getName(), new int[]{i}); this.byName = builder.build(); }
@Override protected String getName(int i) { return definition.byIdx[i].getName(); }
public static <T> FieldMapper<T, SettableByIndexData> newUDTMapper(Type target, UserType tt, MapperConfig<DatastaxColumnKey, ?> config, ReflectionService reflectionService) { SettableDataMapperBuilder<T> builder = newFieldMapperBuilder(config, reflectionService, target); Iterator<UserType.Field> iterator = tt.iterator(); int i = 0; while(iterator.hasNext()) { UserType.Field f = iterator.next(); builder.addColumn(new DatastaxColumnKey(f.getName(), i, f.getType())); i++; } return builder.mapper(); }
private static ImmutableMap<String, int[]> mapByName(Collection<Field> fields) { ImmutableMap.Builder<String, int[]> builder = new ImmutableMap.Builder<String, int[]>(); int i = 0; for (Field field : fields) { builder.put(field.getName(), new int[]{i}); i += 1; } return builder.build(); }
@Override protected String getName(int i) { return definition.byIdx[i].getName(); }
public static <P> ContextualSourceMapper<GettableByIndexData, P> newUDTMapper(Type target, UserType tt, DatastaxMapperFactory factory) { ConstantSourceMapperBuilder<GettableByIndexData, P, DatastaxColumnKey> builder = newFieldMapperBuilder(factory, target); Iterator<UserType.Field> iterator = tt.iterator(); int i = 0; while(iterator.hasNext()) { UserType.Field f = iterator.next(); FieldMapperColumnDefinition<DatastaxColumnKey> identity = FieldMapperColumnDefinition.identity(); builder.addMapping(new DatastaxColumnKey(f.getName(), i, f.getType()), identity); i ++; } return builder.mapper(); }
@Override protected String getName(int i) { return definition.byIdx[i].getName(); }
@Test(groups = "unit") public void parseUserTypes() { String s = "org.apache.cassandra.db.marshal.UserType(foo,61646472657373,737472656574:org.apache.cassandra.db.marshal.UTF8Type,7a6970636f6465:org.apache.cassandra.db.marshal.Int32Type,70686f6e6573:org.apache.cassandra.db.marshal.SetType(org.apache.cassandra.db.marshal.UserType(foo,70686f6e65,6e616d65:org.apache.cassandra.db.marshal.UTF8Type,6e756d626572:org.apache.cassandra.db.marshal.UTF8Type)))"; UserType def = (UserType) DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry); assertEquals(def.getKeyspace(), "foo"); assertEquals(def.getTypeName(), "address"); Iterator<UserType.Field> iter = def.iterator(); UserType.Field field1 = iter.next(); assertEquals(field1.getName(), "street"); assertEquals(field1.getType(), DataType.text()); UserType.Field field2 = iter.next(); assertEquals(field2.getName(), "zipcode"); assertEquals(field2.getType(), DataType.cint()); UserType.Field field3 = iter.next(); assertEquals(field3.getName(), "phones"); DataType st = field3.getType(); assertEquals(st.getName(), DataType.Name.SET); UserType subDef = (UserType) st.getTypeArguments().get(0); assertEquals(subDef.getKeyspace(), "foo"); assertEquals(subDef.getTypeName(), "phone"); Iterator<UserType.Field> subIter = subDef.iterator(); UserType.Field subField1 = subIter.next(); assertEquals(subField1.getName(), "name"); assertEquals(subField1.getType(), DataType.text()); UserType.Field subField2 = subIter.next(); assertEquals(subField2.getName(), "number"); assertEquals(subField2.getType(), DataType.text()); }
@Override public T deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) { if (bytes == null) return null; // empty byte buffers will result in empty values try { ByteBuffer input = bytes.duplicate(); T value = newInstance(); for (UserType.Field field : definition) { if (!input.hasRemaining()) break; int n = input.getInt(); ByteBuffer element = n < 0 ? null : CodecUtils.readBytes(input, n); value = deserializeAndSetField( element, value, Metadata.quoteIfNecessary(field.getName()), protocolVersion); } return value; } catch (BufferUnderflowException e) { throw new InvalidTypeException("Not enough bytes to deserialize a UDT", e); } }
@Override protected String getName(int i) { return definition.byIdx[i].getName(); }