@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()); }
for (Map.Entry<String, String> entry : rawFields.entrySet()) fields.add( new UserType.Field( entry.getKey(), parseOne(entry.getValue(), protocolVersion, codecRegistry)));
ByteBuffer buf = value.slice(); buf.limit(size); AppendValueToChannel(field.getType(), buf, channel); value.position(value.position() + size);
List<UserType.Field> fields = new ArrayList<UserType.Field>(rawFields.size()); for (Map.Entry<String, String> entry : rawFields.entrySet()) fields.add(new UserType.Field(entry.getKey(), parseOne(entry.getValue(), protocolVersion, codecRegistry))); return new UserType(keyspace, typeName, fields, protocolVersion, codecRegistry);
List<UserType.Field> fields = new ArrayList<UserType.Field>(rawFields.size()); for (Map.Entry<String, String> entry : rawFields.entrySet()) fields.add(new UserType.Field(entry.getKey(), parseOne(entry.getValue(), protocolVersion, codecRegistry)));
List<UserType.Field> fields = new ArrayList<UserType.Field>(rawFields.size()); for (Map.Entry<String, String> entry : rawFields.entrySet()) fields.add(new UserType.Field(entry.getKey(), parseOne(entry.getValue(), protocolVersion, codecRegistry))); return new UserType(keyspace, typeName, fields, protocolVersion, codecRegistry);
String fieldName = CBUtil.readString(buffer); DataType fieldType = decode(buffer, protocolVersion, codecRegistry); fields.add(new UserType.Field(fieldName, fieldType));
"t", false, Arrays.asList(new UserType.Field("a", DataType.blob())), protocolVersion, codecRegistry); false, Arrays.asList( new UserType.Field("t", DataType.text()), new UserType.Field("i", DataType.cint()), new UserType.Field("L", DataType.list(DataType.text())), new UserType.Field("s", DataType.map(DataType.cint(), udt1))), protocolVersion, codecRegistry);
String fieldName = CBUtil.readString(buffer); DataType fieldType = decode(buffer, protocolVersion, codecRegistry); fields.add(new UserType.Field(fieldName, fieldType));
"table", false, newArrayList(new Field("f1", varchar()), new Field("f2", varchar())), V3, new CodecRegistry()); "table", false, newArrayList(new Field("f1", text()), new Field("f2", varchar())), V3, new CodecRegistry()); "table", false, newArrayList(new Field("f1", varchar()), new Field("f2", text())), V3, new CodecRegistry()); "table", false, newArrayList(new Field("f1", text()), new Field("f2", text())), V3, new CodecRegistry());
int weight = level; for (UserType.Field field : ((UserType) cqlType)) { weight += weigh(field.getType(), level + 1);
int weight = level; for (UserType.Field field : ((UserType) cqlType)) { weight += weigh(field.getType(), level + 1);
String fieldName = CBUtil.readString(buffer); DataType fieldType = decode(buffer, protocolVersion, codecRegistry); fields.add(new UserType.Field(fieldName, fieldType));
int weight = level; for (UserType.Field field : ((UserType) cqlType)) { weight += weigh(field.getType(), level + 1);
@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 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.escapeId(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 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(); }
/** * Visit a {@link UserType} and its fields. * * @param userType * @param typeFilter */ private void visitTypes(UserType userType, Predicate<CqlIdentifier> typeFilter) { CqlIdentifier typeName = CqlIdentifier.of(userType.getTypeName()); if (!typeFilter.test(typeName)) { return; } for (Field field : userType) { if (field.getType() instanceof UserType) { addDependency((UserType) field.getType(), typeName, typeFilter); return; } doWithTypeArguments(field.getType(), it -> { if (it instanceof UserType) { addDependency((UserType) it, typeName, typeFilter); } }); } }
@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.escapeId(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(); }
@Test(groups = "unit") public void should_deserialize_empty_buffer_as_udt_with_null_values() { CodecRegistry codecRegistry = new CodecRegistry(); UserType udt = new UserType( "ks", "t", false, Arrays.asList( new UserType.Field("t", DataType.text()), new UserType.Field("i", DataType.cint()), new UserType.Field("l", DataType.list(DataType.text()))), ProtocolVersion.NEWEST_SUPPORTED, codecRegistry); UDTValue expected = udt.newValue(); expected.setString("t", null); expected.setToNull("i"); expected.setList("l", null); UDTValue actual = codecRegistry .codecFor(udt, UDTValue.class) .deserialize(ByteBuffer.allocate(0), ProtocolVersion.NEWEST_SUPPORTED); assertThat(actual).isNotNull(); assertThat(actual).isEqualTo(expected); }