/*
 * Copyright DataStax, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.datastax.oss.driver.api.core.type.codec;

import com.datastax.oss.driver.api.core.data.CqlDuration;
import com.datastax.oss.driver.api.core.data.TupleValue;
import com.datastax.oss.driver.api.core.data.UdtValue;
import com.datastax.oss.driver.api.core.type.CustomType;
import com.datastax.oss.driver.api.core.type.DataType;
import com.datastax.oss.driver.api.core.type.DataTypes;
import com.datastax.oss.driver.api.core.type.TupleType;
import com.datastax.oss.driver.api.core.type.UserDefinedType;
import com.datastax.oss.driver.internal.core.type.codec.BigIntCodec;
import com.datastax.oss.driver.internal.core.type.codec.BlobCodec;
import com.datastax.oss.driver.internal.core.type.codec.BooleanCodec;
import com.datastax.oss.driver.internal.core.type.codec.CounterCodec;
import com.datastax.oss.driver.internal.core.type.codec.CqlDurationCodec;
import com.datastax.oss.driver.internal.core.type.codec.CustomCodec;
import com.datastax.oss.driver.internal.core.type.codec.DateCodec;
import com.datastax.oss.driver.internal.core.type.codec.DecimalCodec;
import com.datastax.oss.driver.internal.core.type.codec.DoubleCodec;
import com.datastax.oss.driver.internal.core.type.codec.FloatCodec;
import com.datastax.oss.driver.internal.core.type.codec.InetCodec;
import com.datastax.oss.driver.internal.core.type.codec.IntCodec;
import com.datastax.oss.driver.internal.core.type.codec.ListCodec;
import com.datastax.oss.driver.internal.core.type.codec.MapCodec;
import com.datastax.oss.driver.internal.core.type.codec.SetCodec;
import com.datastax.oss.driver.internal.core.type.codec.SmallIntCodec;
import com.datastax.oss.driver.internal.core.type.codec.StringCodec;
import com.datastax.oss.driver.internal.core.type.codec.TimeCodec;
import com.datastax.oss.driver.internal.core.type.codec.TimeUuidCodec;
import com.datastax.oss.driver.internal.core.type.codec.TimestampCodec;
import com.datastax.oss.driver.internal.core.type.codec.TinyIntCodec;
import com.datastax.oss.driver.internal.core.type.codec.TupleCodec;
import com.datastax.oss.driver.internal.core.type.codec.UdtCodec;
import com.datastax.oss.driver.internal.core.type.codec.UuidCodec;
import com.datastax.oss.driver.internal.core.type.codec.VarIntCodec;
import com.datastax.oss.driver.shaded.guava.common.base.Charsets;
import com.datastax.oss.driver.shaded.guava.common.base.Preconditions;
import edu.umd.cs.findbugs.annotations.NonNull;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

Constants and factory methods to obtain instances of the driver's default type codecs.

See also ExtraTypeCodecs for additional codecs that you can register with your session to handle different type mappings.

/** * Constants and factory methods to obtain instances of the driver's default type codecs. * * <p>See also {@link ExtraTypeCodecs} for additional codecs that you can register with your session * to handle different type mappings. */
public class TypeCodecs {
The default codec that maps CQL type boolean to Java's boolean.
/** The default codec that maps CQL type {@code boolean} to Java's {@code boolean}. */
public static final PrimitiveBooleanCodec BOOLEAN = new BooleanCodec();
The default codec that maps CQL type tinyint to Java's byte.
/** The default codec that maps CQL type {@code tinyint} to Java's {@code byte}. */
public static final PrimitiveByteCodec TINYINT = new TinyIntCodec();
The default codec that maps CQL type double to Java's double.
/** The default codec that maps CQL type {@code double} to Java's {@code double}. */
public static final PrimitiveDoubleCodec DOUBLE = new DoubleCodec();
The default codec that maps CQL type counter to Java's long.
/** The default codec that maps CQL type {@code counter} to Java's {@code long}. */
public static final PrimitiveLongCodec COUNTER = new CounterCodec();
The default codec that maps CQL type float to Java's float.
/** The default codec that maps CQL type {@code float} to Java's {@code float}. */
public static final PrimitiveFloatCodec FLOAT = new FloatCodec();
The default codec that maps CQL type int to Java's int.
/** The default codec that maps CQL type {@code int} to Java's {@code int}. */
public static final PrimitiveIntCodec INT = new IntCodec();
The default codec that maps CQL type bigint to Java's long.
/** The default codec that maps CQL type {@code bigint} to Java's {@code long}. */
public static final PrimitiveLongCodec BIGINT = new BigIntCodec();
The default codec that maps CQL type smallint to Java's short.
/** The default codec that maps CQL type {@code smallint} to Java's {@code short}. */
public static final PrimitiveShortCodec SMALLINT = new SmallIntCodec();
The default codec that maps CQL type timestamp to Java's Instant, using the system's default time zone to parse and format CQL literals.

This codec uses the system's default time zone as its source of time zone information when formatting values as CQL literals, or parsing CQL literals that do not have any time zone indication. Note that this only applies to the TypeCodec.format(Object) and TypeCodec.parse(String) methods; regular encoding and decoding, like setting a value on a bound statement or reading a column from a row, are not affected by the time zone.

If you need a different time zone, consider other codecs in ExtraTypeCodecs, or call ExtraTypeCodecs.timestampAt(ZoneId) instead.

See Also:
/** * The default codec that maps CQL type {@code timestamp} to Java's {@link Instant}, using the * system's default time zone to parse and format CQL literals. * * <p>This codec uses the system's {@linkplain ZoneId#systemDefault() default time zone} as its * source of time zone information when formatting values as CQL literals, or parsing CQL literals * that do not have any time zone indication. Note that this only applies to the {@link * TypeCodec#format(Object)} and {@link TypeCodec#parse(String)} methods; regular encoding and * decoding, like setting a value on a bound statement or reading a column from a row, are not * affected by the time zone. * * <p>If you need a different time zone, consider other codecs in {@link ExtraTypeCodecs}, or call * {@link ExtraTypeCodecs#timestampAt(ZoneId)} instead. * * @see ExtraTypeCodecs#TIMESTAMP_UTC * @see ExtraTypeCodecs#timestampAt(ZoneId) */
public static final TypeCodec<Instant> TIMESTAMP = new TimestampCodec();
The default codec that maps CQL type date to Java's LocalDate.
/** The default codec that maps CQL type {@code date} to Java's {@link LocalDate}. */
public static final TypeCodec<LocalDate> DATE = new DateCodec();
The default codec that maps CQL type time to Java's LocalTime.
/** The default codec that maps CQL type {@code time} to Java's {@link LocalTime}. */
public static final TypeCodec<LocalTime> TIME = new TimeCodec();
The default codec that maps CQL type blob to Java's ByteBuffer.

If you are looking for a codec mapping CQL type blob to the Java type byte[], you should use ExtraTypeCodecs.BLOB_TO_ARRAY instead.

If you are looking for a codec mapping CQL type list<tinyint> to the Java type byte[], you should use ExtraTypeCodecs.BYTE_LIST_TO_ARRAY instead.

See Also:
/** * The default codec that maps CQL type {@code blob} to Java's {@link ByteBuffer}. * * <p>If you are looking for a codec mapping CQL type {@code blob} to the Java type {@code * byte[]}, you should use {@link ExtraTypeCodecs#BLOB_TO_ARRAY} instead. * * <p>If you are looking for a codec mapping CQL type {@code list<tinyint>} to the Java type * {@code byte[]}, you should use {@link ExtraTypeCodecs#BYTE_LIST_TO_ARRAY} instead. * * @see ExtraTypeCodecs#BLOB_TO_ARRAY * @see ExtraTypeCodecs#BYTE_LIST_TO_ARRAY */
public static final TypeCodec<ByteBuffer> BLOB = new BlobCodec();
The default codec that maps CQL type text to Java's String.
/** The default codec that maps CQL type {@code text} to Java's {@link String}. */
public static final TypeCodec<String> TEXT = new StringCodec(DataTypes.TEXT, Charsets.UTF_8);
The default codec that maps CQL type ascii to Java's String.
/** The default codec that maps CQL type {@code ascii} to Java's {@link String}. */
public static final TypeCodec<String> ASCII = new StringCodec(DataTypes.ASCII, Charsets.US_ASCII);
The default codec that maps CQL type varint to Java's BigInteger.
/** The default codec that maps CQL type {@code varint} to Java's {@link BigInteger}. */
public static final TypeCodec<BigInteger> VARINT = new VarIntCodec();
The default codec that maps CQL type decimal to Java's BigDecimal.
/** The default codec that maps CQL type {@code decimal} to Java's {@link BigDecimal}. */
public static final TypeCodec<BigDecimal> DECIMAL = new DecimalCodec();
The default codec that maps CQL type uuid to Java's UUID.
/** The default codec that maps CQL type {@code uuid} to Java's {@link UUID}. */
public static final TypeCodec<UUID> UUID = new UuidCodec();
The default codec that maps CQL type timeuuid to Java's UUID.
/** The default codec that maps CQL type {@code timeuuid} to Java's {@link UUID}. */
public static final TypeCodec<UUID> TIMEUUID = new TimeUuidCodec();
The default codec that maps CQL type inet to Java's InetAddress.
/** The default codec that maps CQL type {@code inet} to Java's {@link InetAddress}. */
public static final TypeCodec<InetAddress> INET = new InetCodec();
The default codec that maps CQL type duration to the driver's CqlDuration.
/** The default codec that maps CQL type {@code duration} to the driver's {@link CqlDuration}. */
public static final TypeCodec<CqlDuration> DURATION = new CqlDurationCodec();
Builds a new codec that maps a CQL custom type to Java's ByteBuffer.
Params:
  • cqlType – the fully-qualified name of the custom type.
/** * Builds a new codec that maps a CQL custom type to Java's {@link ByteBuffer}. * * @param cqlType the fully-qualified name of the custom type. */
@NonNull public static TypeCodec<ByteBuffer> custom(@NonNull DataType cqlType) { Preconditions.checkArgument(cqlType instanceof CustomType, "cqlType must be a custom type"); return new CustomCodec((CustomType) cqlType); }
Builds a new codec that maps a CQL list to a Java list, using the given codec to map each element.
/** * Builds a new codec that maps a CQL list to a Java list, using the given codec to map each * element. */
@NonNull public static <T> TypeCodec<List<T>> listOf(@NonNull TypeCodec<T> elementCodec) { return new ListCodec<>(DataTypes.listOf(elementCodec.getCqlType()), elementCodec); }
Builds a new codec that maps a CQL set to a Java set, using the given codec to map each element.
/** * Builds a new codec that maps a CQL set to a Java set, using the given codec to map each * element. */
@NonNull public static <T> TypeCodec<Set<T>> setOf(@NonNull TypeCodec<T> elementCodec) { return new SetCodec<>(DataTypes.setOf(elementCodec.getCqlType()), elementCodec); }
Builds a new codec that maps a CQL map to a Java map, using the given codecs to map each key and value.
/** * Builds a new codec that maps a CQL map to a Java map, using the given codecs to map each key * and value. */
@NonNull public static <K, V> TypeCodec<Map<K, V>> mapOf( @NonNull TypeCodec<K> keyCodec, @NonNull TypeCodec<V> valueCodec) { return new MapCodec<>( DataTypes.mapOf(keyCodec.getCqlType(), valueCodec.getCqlType()), keyCodec, valueCodec); }
Builds a new codec that maps a CQL tuple to the driver's TupleValue, for the given type definition.

Note that the components of a TupleValue are stored in their encoded form. They are encoded/decoded on the fly when you set or get them, using the codec registry.

/** * Builds a new codec that maps a CQL tuple to the driver's {@link TupleValue}, for the given type * definition. * * <p>Note that the components of a {@link TupleValue} are stored in their encoded form. They are * encoded/decoded on the fly when you set or get them, using the codec registry. */
@NonNull public static TypeCodec<TupleValue> tupleOf(@NonNull TupleType cqlType) { return new TupleCodec(cqlType); }
Builds a new codec that maps a CQL user defined type to the driver's UdtValue, for the given type definition.

Note that the fields of a UdtValue are stored in their encoded form. They are encoded/decoded on the fly when you set or get them, using the codec registry.

/** * Builds a new codec that maps a CQL user defined type to the driver's {@link UdtValue}, for the * given type definition. * * <p>Note that the fields of a {@link UdtValue} are stored in their encoded form. They are * encoded/decoded on the fly when you set or get them, using the codec registry. */
@NonNull public static TypeCodec<UdtValue> udtOf(@NonNull UserDefinedType cqlType) { return new UdtCodec(cqlType); }
An alias for ExtraTypeCodecs.ZONED_TIMESTAMP_SYSTEM.

This exists for historical reasons: the constant was originally defined in this class, but technically it belongs to ExtraTypeCodecs because this is not a built-in mapping.

/** * An alias for {@link ExtraTypeCodecs#ZONED_TIMESTAMP_SYSTEM}. * * <p>This exists for historical reasons: the constant was originally defined in this class, but * technically it belongs to {@link ExtraTypeCodecs} because this is not a built-in mapping. */
public static final TypeCodec<ZonedDateTime> ZONED_TIMESTAMP_SYSTEM = ExtraTypeCodecs.ZONED_TIMESTAMP_SYSTEM;
An alias for ExtraTypeCodecs.ZONED_TIMESTAMP_UTC.

This exists for historical reasons: the constant was originally defined in this class, but technically it belongs to ExtraTypeCodecs because this is not a built-in mapping.

/** * An alias for {@link ExtraTypeCodecs#ZONED_TIMESTAMP_UTC}. * * <p>This exists for historical reasons: the constant was originally defined in this class, but * technically it belongs to {@link ExtraTypeCodecs} because this is not a built-in mapping. */
public static final TypeCodec<ZonedDateTime> ZONED_TIMESTAMP_UTC = ExtraTypeCodecs.ZONED_TIMESTAMP_UTC;
An alias for ExtraTypeCodecs.zonedTimestampAt(ZoneId).

This exists for historical reasons: the method was originally defined in this class, but technically it belongs to ExtraTypeCodecs because this is not a built-in mapping.

/** * An alias for {@link ExtraTypeCodecs#zonedTimestampAt(ZoneId)}. * * <p>This exists for historical reasons: the method was originally defined in this class, but * technically it belongs to {@link ExtraTypeCodecs} because this is not a built-in mapping. */
@NonNull public static TypeCodec<ZonedDateTime> zonedTimestampAt(@NonNull ZoneId timeZone) { return ExtraTypeCodecs.zonedTimestampAt(timeZone); } }