mirror of https://github.com/apache/cassandra
Merge branch 'cassandra-5.0' into trunk
* cassandra-5.0: Fix CQLSSTableWriter serialization of vector of date and time patch by Lukasz Antoniak; reviewed by Andres de la Pena, Yifan Cai for CASSANDRA-20979
This commit is contained in:
commit
25c7c71b19
|
|
@ -271,6 +271,7 @@
|
|||
* Add the ability to disable bulk loading of SSTables (CASSANDRA-18781)
|
||||
* Clean up obsolete functions and simplify cql_version handling in cqlsh (CASSANDRA-18787)
|
||||
Merged from 5.0:
|
||||
* Fix CQLSSTableWriter serialization of vector of date and time (CASSANDRA-20979)
|
||||
* Correctly calculate default for FailureDetector max interval (CASSANDRA-21025)
|
||||
* Adding missing configs in system_views.settings to be backward compatible (CASSANDRA-20863)
|
||||
* Heap dump should not be generated on handled exceptions (CASSANDRA-20974)
|
||||
|
|
|
|||
|
|
@ -1787,12 +1787,6 @@ public abstract class TypeCodec<T>
|
|||
super(DataType.date(), LocalDate.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int serializedSize()
|
||||
{
|
||||
return 8;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalDate parse(String value)
|
||||
{
|
||||
|
|
@ -1876,6 +1870,13 @@ public abstract class TypeCodec<T>
|
|||
super(DataType.time());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int serializedSize()
|
||||
{
|
||||
// matching behavior of TimeType, which is not declared as fixed length
|
||||
return VARIABLE_LENGTH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long parse(String value)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -35,7 +35,9 @@ import java.util.UUID;
|
|||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
|
@ -50,6 +52,7 @@ import org.junit.rules.TemporaryFolder;
|
|||
|
||||
import com.datastax.driver.core.utils.UUIDs;
|
||||
import org.apache.cassandra.Util;
|
||||
import org.apache.cassandra.cql3.CQL3Type;
|
||||
import org.apache.cassandra.cql3.QueryProcessor;
|
||||
import org.apache.cassandra.cql3.UntypedResultSet;
|
||||
import org.apache.cassandra.cql3.constraints.ConstraintViolationException;
|
||||
|
|
@ -61,7 +64,10 @@ import org.apache.cassandra.cql3.functions.types.UserType;
|
|||
import org.apache.cassandra.db.compression.CompressionDictionary;
|
||||
import org.apache.cassandra.db.compression.CompressionDictionary.DictId;
|
||||
import org.apache.cassandra.db.compression.ZstdCompressionDictionary;
|
||||
import org.apache.cassandra.db.marshal.AbstractType;
|
||||
import org.apache.cassandra.db.marshal.FloatType;
|
||||
import org.apache.cassandra.db.marshal.SimpleDateType;
|
||||
import org.apache.cassandra.db.marshal.TimeType;
|
||||
import org.apache.cassandra.db.marshal.UTF8Type;
|
||||
import org.apache.cassandra.dht.ByteOrderedPartitioner;
|
||||
import org.apache.cassandra.dht.Murmur3Partitioner;
|
||||
|
|
@ -1621,9 +1627,36 @@ public abstract class CQLSSTableWriterTest
|
|||
@Test
|
||||
public void testWritingVectorData() throws Exception
|
||||
{
|
||||
testWritingVectorData(CQL3Type.Native.FLOAT, FloatType.instance, (i) -> (float) i, (i, vector) -> {
|
||||
assertThat(vector).allMatch(val -> val instanceof Float);
|
||||
assertThat(vector).allMatch(val -> (float) val == (float) i);
|
||||
});
|
||||
|
||||
perTestSetup();
|
||||
|
||||
testWritingVectorData(CQL3Type.Native.DATE, SimpleDateType.instance, LocalDate::fromDaysSinceEpoch, (i, vector) -> {
|
||||
assertThat(vector).allMatch(val -> val instanceof Integer);
|
||||
assertThat(vector).allMatch(val -> {
|
||||
int days = (int) val - Integer.MIN_VALUE; // signed to unsigned conversion
|
||||
return days == i;
|
||||
});
|
||||
});
|
||||
|
||||
perTestSetup();
|
||||
|
||||
testWritingVectorData(CQL3Type.Native.TIME, TimeType.instance, (i) -> (long) i, (i, vector) -> {
|
||||
assertThat(vector).allMatch(val -> val instanceof Long);
|
||||
assertThat(vector).allMatch(val -> (long) val == (long) i);
|
||||
});
|
||||
}
|
||||
|
||||
private void testWritingVectorData(CQL3Type.Native cqlType, AbstractType<?> subType, Function<Integer, ?> valueFactory,
|
||||
BiConsumer<Integer, List<?>> checkFunction) throws Exception
|
||||
{
|
||||
final int dimensions = 5;
|
||||
final String schema = "CREATE TABLE " + qualifiedTable + " ("
|
||||
+ " k int,"
|
||||
+ " v1 VECTOR<FLOAT, 5>,"
|
||||
+ " v1 VECTOR<" + cqlType.name() + ", " + dimensions + ">,"
|
||||
+ " PRIMARY KEY (k)"
|
||||
+ ")";
|
||||
|
||||
|
|
@ -1635,7 +1668,12 @@ public abstract class CQLSSTableWriterTest
|
|||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
writer.addRow(i, List.of( (float)i, (float)i, (float)i, (float)i, (float)i));
|
||||
List<Object> vector = new ArrayList<>(dimensions);
|
||||
for (int j = 0; j < dimensions; j++)
|
||||
{
|
||||
vector.add(valueFactory.apply(i));
|
||||
}
|
||||
writer.addRow(i, vector);
|
||||
}
|
||||
|
||||
writer.close();
|
||||
|
|
@ -1650,10 +1688,9 @@ public abstract class CQLSSTableWriterTest
|
|||
for (UntypedResultSet.Row row : resultSet)
|
||||
{
|
||||
assertEquals(cnt, row.getInt("k"));
|
||||
List<Float> vector = row.getVector("v1", FloatType.instance, 5);
|
||||
assertThat(vector).hasSize(5);
|
||||
final float floatCount = (float)cnt;
|
||||
assertThat(vector).allMatch(val -> val == floatCount);
|
||||
List<?> vector = row.getVector("v1", subType, dimensions);
|
||||
assertThat(vector).hasSize(dimensions);
|
||||
checkFunction.accept(cnt, vector);
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue