Skip to content

Commit f356cf6

Browse files
Backport to branch(3) : Move BigInt range validation from BigIntColumn to Cosmos DB and Object Storage OperationCheckers (#3506)
Co-authored-by: Toshihiro Suzuki <brfrn169@gmail.com>
1 parent 60b8503 commit f356cf6

49 files changed

Lines changed: 1110 additions & 212 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosColumnValueIntegrationTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package com.scalar.db.storage.cosmos;
22

3+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
4+
35
import com.scalar.db.api.DistributedStorageColumnValueIntegrationTestBase;
6+
import com.scalar.db.api.Put;
7+
import com.scalar.db.io.BigIntColumn;
8+
import com.scalar.db.io.Column;
9+
import com.scalar.db.io.DataType;
10+
import com.scalar.db.io.Key;
411
import java.util.Map;
512
import java.util.Properties;
13+
import java.util.Random;
614
import java.util.stream.Stream;
15+
import org.junit.jupiter.api.Test;
716
import org.junit.jupiter.params.provider.Arguments;
817

918
public class CosmosColumnValueIntegrationTest
1019
extends DistributedStorageColumnValueIntegrationTestBase {
20+
1121
@Override
1222
protected Properties getProperties(String testName) {
1323
return CosmosEnv.getProperties(testName);
@@ -24,4 +34,64 @@ protected Stream<Arguments> provideLargeBlobSizes() {
2434
// full record is serialized to JSON with UTF8 encoding, its approximate size is 2MB.
2535
return Stream.of(Arguments.of(1_500_000, "1.5 MB"));
2636
}
37+
38+
@Override
39+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
40+
if (dataType == DataType.BIGINT) {
41+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
42+
}
43+
return super.getColumnWithMaxValue(columnName, dataType);
44+
}
45+
46+
@Override
47+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
48+
if (dataType == DataType.BIGINT) {
49+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
50+
}
51+
return super.getColumnWithMinValue(columnName, dataType);
52+
}
53+
54+
@Override
55+
protected Column<?> getColumnWithRandomValue(
56+
Random random, String columnName, DataType dataType) {
57+
if (dataType == DataType.BIGINT) {
58+
long value =
59+
random
60+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
61+
.findFirst()
62+
.orElse(0);
63+
return BigIntColumn.of(columnName, value);
64+
}
65+
return super.getColumnWithRandomValue(random, columnName, dataType);
66+
}
67+
68+
@Test
69+
public void put_WithBigIntValueGreaterThanUpperLimit_ShouldThrowIllegalArgumentException() {
70+
// Arrange
71+
Put put =
72+
Put.newBuilder()
73+
.namespace(namespace)
74+
.table(TABLE)
75+
.partitionKey(Key.ofInt(PARTITION_KEY, 1))
76+
.value(BigIntColumn.of(COL_NAME3, CosmosTestUtils.BIGINT_MAX_VALUE + 1))
77+
.build();
78+
79+
// Act Assert
80+
assertThatThrownBy(() -> storage.put(put)).isInstanceOf(IllegalArgumentException.class);
81+
}
82+
83+
@Test
84+
public void put_WithBigIntValueLessThanLowerLimit_ShouldThrowIllegalArgumentException() {
85+
// Arrange
86+
Put put =
87+
Put.newBuilder()
88+
.namespace(namespace)
89+
.table(TABLE)
90+
.partitionKey(Key.ofInt(PARTITION_KEY, 1))
91+
.value(BigIntColumn.of(COL_NAME3, CosmosTestUtils.BIGINT_MIN_VALUE - 1))
92+
.build();
93+
94+
// Act Assert
95+
assertThatThrownBy(() -> storage.put(put)).isInstanceOf(IllegalArgumentException.class);
96+
}
2797
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosConditionalMutationIntegrationTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import com.scalar.db.api.ConditionalExpression.Operator;
44
import com.scalar.db.api.DistributedStorageConditionalMutationIntegrationTestBase;
5+
import com.scalar.db.io.BigIntColumn;
6+
import com.scalar.db.io.Column;
57
import com.scalar.db.io.DataType;
68
import java.util.List;
79
import java.util.Map;
810
import java.util.Properties;
11+
import java.util.Random;
912
import java.util.stream.Collectors;
1013

1114
public class CosmosConditionalMutationIntegrationTest
@@ -42,4 +45,18 @@ protected List<OperatorAndDataType> getOperatorAndDataTypeListForTest() {
4245
})
4346
.collect(Collectors.toList());
4447
}
48+
49+
@Override
50+
protected Column<?> getColumnWithRandomValue(
51+
Random random, String columnName, DataType dataType) {
52+
if (dataType == DataType.BIGINT) {
53+
long value =
54+
random
55+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
56+
.findFirst()
57+
.orElse(0);
58+
return BigIntColumn.of(columnName, value);
59+
}
60+
return super.getColumnWithRandomValue(random, columnName, dataType);
61+
}
4562
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosCrossPartitionScanIntegrationTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageCrossPartitionScanIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
6+
import com.scalar.db.io.DataType;
47
import java.util.Map;
58
import java.util.Properties;
9+
import java.util.Random;
610
import org.junit.jupiter.api.Disabled;
711
import org.junit.jupiter.api.Test;
812

@@ -29,6 +33,19 @@ protected boolean isParallelDdlSupported() {
2933
return false;
3034
}
3135

36+
@Override
37+
protected Column<?> getRandomColumn(Random random, String columnName, DataType dataType) {
38+
if (dataType == DataType.BIGINT) {
39+
long value =
40+
random
41+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
42+
.findFirst()
43+
.orElse(0);
44+
return BigIntColumn.of(columnName, value);
45+
}
46+
return super.getRandomColumn(random, columnName, dataType);
47+
}
48+
3249
@Test
3350
@Override
3451
@Disabled("Cross partition scan with ordering is not supported in Cosmos DB")

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosMultipleClusteringKeyScanIntegrationTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageMultipleClusteringKeyScanIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
46
import com.scalar.db.io.DataType;
57
import java.util.List;
68
import java.util.Map;
79
import java.util.Properties;
10+
import java.util.Random;
811
import java.util.stream.Collectors;
912

1013
public class CosmosMultipleClusteringKeyScanIntegrationTest
@@ -37,4 +40,34 @@ protected boolean isParallelDdlSupported() {
3740
protected Map<String, String> getCreationOptions() {
3841
return CosmosEnv.getCreationOptions();
3942
}
43+
44+
@Override
45+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
46+
if (dataType == DataType.BIGINT) {
47+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
48+
}
49+
return super.getColumnWithMaxValue(columnName, dataType);
50+
}
51+
52+
@Override
53+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
54+
if (dataType == DataType.BIGINT) {
55+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
56+
}
57+
return super.getColumnWithMinValue(columnName, dataType);
58+
}
59+
60+
@Override
61+
protected Column<?> getColumnWithRandomValue(
62+
Random random, String columnName, DataType dataType) {
63+
if (dataType == DataType.BIGINT) {
64+
long value =
65+
random
66+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
67+
.findFirst()
68+
.orElse(0);
69+
return BigIntColumn.of(columnName, value);
70+
}
71+
return super.getColumnWithRandomValue(random, columnName, dataType);
72+
}
4073
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosMultiplePartitionKeyIntegrationTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageMultiplePartitionKeyIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
6+
import com.scalar.db.io.DataType;
47
import java.util.Map;
58
import java.util.Properties;
9+
import java.util.Random;
610

711
public class CosmosMultiplePartitionKeyIntegrationTest
812
extends DistributedStorageMultiplePartitionKeyIntegrationTestBase {
@@ -25,4 +29,34 @@ protected boolean isParallelDdlSupported() {
2529
protected Map<String, String> getCreationOptions() {
2630
return CosmosEnv.getCreationOptions();
2731
}
32+
33+
@Override
34+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
35+
if (dataType == DataType.BIGINT) {
36+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
37+
}
38+
return super.getColumnWithMaxValue(columnName, dataType);
39+
}
40+
41+
@Override
42+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
43+
if (dataType == DataType.BIGINT) {
44+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
45+
}
46+
return super.getColumnWithMinValue(columnName, dataType);
47+
}
48+
49+
@Override
50+
protected Column<?> getColumnWithRandomValue(
51+
Random random, String columnName, DataType dataType) {
52+
if (dataType == DataType.BIGINT) {
53+
long value =
54+
random
55+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
56+
.findFirst()
57+
.orElse(0);
58+
return BigIntColumn.of(columnName, value);
59+
}
60+
return super.getColumnWithRandomValue(random, columnName, dataType);
61+
}
2862
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosSecondaryIndexIntegrationTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageSecondaryIndexIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
6+
import com.scalar.db.io.DataType;
47
import java.util.Map;
58
import java.util.Properties;
9+
import java.util.Random;
610

711
public class CosmosSecondaryIndexIntegrationTest
812
extends DistributedStorageSecondaryIndexIntegrationTestBase {
@@ -15,4 +19,34 @@ protected Properties getProperties(String testName) {
1519
protected Map<String, String> getCreationOptions() {
1620
return CosmosEnv.getCreationOptions();
1721
}
22+
23+
@Override
24+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
25+
if (dataType == DataType.BIGINT) {
26+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
27+
}
28+
return super.getColumnWithMaxValue(columnName, dataType);
29+
}
30+
31+
@Override
32+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
33+
if (dataType == DataType.BIGINT) {
34+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
35+
}
36+
return super.getColumnWithMinValue(columnName, dataType);
37+
}
38+
39+
@Override
40+
protected Column<?> getColumnWithRandomValue(
41+
Random random, String columnName, DataType dataType) {
42+
if (dataType == DataType.BIGINT) {
43+
long value =
44+
random
45+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
46+
.findFirst()
47+
.orElse(0);
48+
return BigIntColumn.of(columnName, value);
49+
}
50+
return super.getColumnWithRandomValue(random, columnName, dataType);
51+
}
1852
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosSingleClusteringKeyScanIntegrationTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageSingleClusteringKeyScanIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
46
import com.scalar.db.io.DataType;
57
import java.util.ArrayList;
68
import java.util.List;
79
import java.util.Map;
810
import java.util.Properties;
11+
import java.util.Random;
912

1013
public class CosmosSingleClusteringKeyScanIntegrationTest
1114
extends DistributedStorageSingleClusteringKeyScanIntegrationTestBase {
@@ -31,4 +34,34 @@ protected List<DataType> getClusteringKeyTypes() {
3134
protected Map<String, String> getCreationOptions() {
3235
return CosmosEnv.getCreationOptions();
3336
}
37+
38+
@Override
39+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
40+
if (dataType == DataType.BIGINT) {
41+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
42+
}
43+
return super.getColumnWithMaxValue(columnName, dataType);
44+
}
45+
46+
@Override
47+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
48+
if (dataType == DataType.BIGINT) {
49+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
50+
}
51+
return super.getColumnWithMinValue(columnName, dataType);
52+
}
53+
54+
@Override
55+
protected Column<?> getColumnWithRandomValue(
56+
Random random, String columnName, DataType dataType) {
57+
if (dataType == DataType.BIGINT) {
58+
long value =
59+
random
60+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
61+
.findFirst()
62+
.orElse(0);
63+
return BigIntColumn.of(columnName, value);
64+
}
65+
return super.getColumnWithRandomValue(random, columnName, dataType);
66+
}
3467
}

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosSinglePartitionKeyIntegrationTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.scalar.db.storage.cosmos;
22

33
import com.scalar.db.api.DistributedStorageSinglePartitionKeyIntegrationTestBase;
4+
import com.scalar.db.io.BigIntColumn;
5+
import com.scalar.db.io.Column;
6+
import com.scalar.db.io.DataType;
47
import java.util.Map;
58
import java.util.Properties;
9+
import java.util.Random;
610

711
public class CosmosSinglePartitionKeyIntegrationTest
812
extends DistributedStorageSinglePartitionKeyIntegrationTestBase {
@@ -15,4 +19,34 @@ protected Properties getProperties(String testName) {
1519
protected Map<String, String> getCreationOptions() {
1620
return CosmosEnv.getCreationOptions();
1721
}
22+
23+
@Override
24+
protected Column<?> getColumnWithMaxValue(String columnName, DataType dataType) {
25+
if (dataType == DataType.BIGINT) {
26+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MAX_VALUE);
27+
}
28+
return super.getColumnWithMaxValue(columnName, dataType);
29+
}
30+
31+
@Override
32+
protected Column<?> getColumnWithMinValue(String columnName, DataType dataType) {
33+
if (dataType == DataType.BIGINT) {
34+
return BigIntColumn.of(columnName, CosmosTestUtils.BIGINT_MIN_VALUE);
35+
}
36+
return super.getColumnWithMinValue(columnName, dataType);
37+
}
38+
39+
@Override
40+
protected Column<?> getColumnWithRandomValue(
41+
Random random, String columnName, DataType dataType) {
42+
if (dataType == DataType.BIGINT) {
43+
long value =
44+
random
45+
.longs(1, CosmosTestUtils.BIGINT_MIN_VALUE, CosmosTestUtils.BIGINT_MAX_VALUE + 1)
46+
.findFirst()
47+
.orElse(0);
48+
return BigIntColumn.of(columnName, value);
49+
}
50+
return super.getColumnWithRandomValue(random, columnName, dataType);
51+
}
1852
}

0 commit comments

Comments
 (0)