/** * jwestra: 3.x API change deserialize a single field in a UDTValue map * * @param dataType * @param udtValue * @param fieldname * @return */ public <T> T deserialize(DataType dataType, UDTValue udtValue, String fieldname) { final CodecRegistry codecRegistry = getCodecRegistry(); final TypeCodec<T> typeCodec = codecRegistry.codecFor(dataType); return typeCodec.deserialize(udtValue.getBytesUnsafe(fieldname), protocolVersion); }
/** * @param datatype the db datatype * @param udtValue the udt value * @param fieldtype1 the field 1 type * @param fieldtype2 the field 2 type * @param fieldname the fieldname * @return the mapped value or <code>null</code> */ public <T> Object fromUdtValue( DataType datatype, UDTValue udtValue, Class<?> fieldtype1, Class<?> fieldtype2, String fieldname) { final CodecRegistry codecRegistry = getCodecRegistry(); // build-in type if (isBuildInType(datatype)) { final TypeCodec<T> typeCodec = codecRegistry.codecFor(datatype); try { if (udtValue.isNull(fieldname)) return null; return typeCodec.deserialize(udtValue.getBytesUnsafe(fieldname), protocolVersion); } catch (IllegalArgumentException ex) { return null; } // udt collection } else if (datatype.isCollection()) { // set if (DataType.Name.SET == datatype.getName()) { return fromUdtValues( datatype.getTypeArguments().get(0), ImmutableSet.copyOf(udtValue.getSet(fieldname, UDTValue.class)), fieldtype2); // list } else if (DataType.Name.LIST == datatype.getName()) { return fromUdtValues( datatype.getTypeArguments().get(0), ImmutableList.copyOf(udtValue.getList(fieldname, UDTValue.class)), fieldtype2); // map } else { if (isBuildInType(datatype.getTypeArguments().get(0))) { return fromUdtValues( datatype.getTypeArguments().get(0), datatype.getTypeArguments().get(1), ImmutableMap.<Object, Object>copyOf( udtValue.getMap(fieldname, fieldtype1, UDTValue.class)), fieldtype1, fieldtype2); } else if (isBuildInType(datatype.getTypeArguments().get(1))) { return fromUdtValues( datatype.getTypeArguments().get(0), datatype.getTypeArguments().get(1), ImmutableMap.<Object, Object>copyOf( udtValue.getMap(fieldname, UDTValue.class, fieldtype2)), fieldtype1, fieldtype2); } else { return fromUdtValues( datatype.getTypeArguments().get(0), datatype.getTypeArguments().get(1), ImmutableMap.<Object, Object>copyOf( udtValue.getMap(fieldname, UDTValue.class, UDTValue.class)), fieldtype1, fieldtype2); } } // udt } else { return fromUdtValue(datatype, udtValue, fieldtype1); } }
@SuppressWarnings("unchecked") public Object toUdtValue( Tablename tablename, MetadataCatalog catalog, DataType datatype, Object value) { // build-in type (will not be converted) if (isBuildInType(datatype)) { return value; // udt collection } else if (datatype.isCollection()) { // set if (DataType.Name.SET == datatype.getName()) { final DataType elementDataType = datatype.getTypeArguments().get(0); final Set<Object> udt = Sets.newHashSet(); if (value != null) { for (Object element : (Set<Object>) value) { udt.add(toUdtValue(tablename, catalog, elementDataType, element)); } } return ImmutableSet.copyOf(udt); // list } else if (DataType.Name.LIST == datatype.getName()) { final DataType elementDataType = datatype.getTypeArguments().get(0); final List<Object> udt = Lists.newArrayList(); if (value != null) { for (Object element : (List<Object>) value) { udt.add(toUdtValue(tablename, catalog, elementDataType, element)); } } return ImmutableList.copyOf(udt); // map } else { final DataType keyDataType = datatype.getTypeArguments().get(0); final DataType valueDataType = datatype.getTypeArguments().get(1); final Map<Object, Object> udt = Maps.newHashMap(); if (value != null) { for (Entry<Object, Object> entry : ((Map<Object, Object>) value).entrySet()) { udt.put( toUdtValue(tablename, catalog, keyDataType, entry.getKey()), toUdtValue(tablename, catalog, valueDataType, entry.getValue())); } } return ImmutableMap.copyOf(udt); } // udt } else { if (value == null) { return value; } else { final UserType usertype = catalog.getUserType(tablename, ((UserType) datatype).getTypeName()); final UDTValue udtValue = usertype.newValue(); for (Entry<String, Optional<Object>> entry : beanMapper.toValues(value, ImmutableSet.<String>of()).entrySet()) { if (!entry.getValue().isPresent()) { // return null; udtValue.setToNull(entry.getKey()); continue; } final DataType fieldType = usertype.getFieldType(entry.getKey()); Object vl = entry.getValue().get(); if (!isBuildInType(usertype.getFieldType(entry.getKey()))) { vl = toUdtValue(tablename, catalog, fieldType, vl); } final String key = entry.getKey(); udtValue.setBytesUnsafe(key, serialize(fieldType, vl)); } return udtValue; } } }