ranges.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. from textwrap import dedent
  10. from materialize.checks.actions import Testdrive
  11. from materialize.checks.checks import Check
  12. from materialize.checks.common import KAFKA_SCHEMA_WITH_SINGLE_STRING_FIELD
  13. def schema() -> str:
  14. return dedent(KAFKA_SCHEMA_WITH_SINGLE_STRING_FIELD)
  15. class Range(Check):
  16. def initialize(self) -> Testdrive:
  17. return Testdrive(
  18. schema()
  19. + dedent(
  20. """
  21. > CREATE TABLE range_table (
  22. index INT,
  23. i4_range INT4RANGE,
  24. i8_range INT8RANGE,
  25. num_range NUMRANGE,
  26. ts_range TSRANGE,
  27. tstz_range TSTZRANGE,
  28. d_range DATERANGE
  29. );
  30. > INSERT INTO range_table VALUES (
  31. 1,
  32. '[2,8]'::INT4RANGE,
  33. '[2,100]'::INT8RANGE,
  34. '[400,600]'::NUMRANGE,
  35. '[2023-01-01,2023-03-01)'::TSRANGE,
  36. '[2023-01-01,2023-03-01)'::TSTZRANGE,
  37. '[2023-01-01,2023-03-01)'::DATERANGE
  38. );
  39. > INSERT INTO range_table VALUES (
  40. 2,
  41. NULL,
  42. NULL,
  43. NULL,
  44. NULL,
  45. NULL,
  46. NULL
  47. );
  48. $ kafka-create-topic topic=ranges
  49. $ kafka-ingest format=avro topic=ranges schema=${schema} repeat=10
  50. {"f1": "A${kafka-ingest.iteration}"}
  51. > CREATE SOURCE range_source
  52. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-ranges-${testdrive.seed}')
  53. > CREATE TABLE range_source_tbl FROM SOURCE range_source (REFERENCE "testdrive-ranges-${testdrive.seed}")
  54. FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION csr_conn
  55. ENVELOPE NONE
  56. """
  57. )
  58. )
  59. def manipulate(self) -> list[Testdrive]:
  60. manipulation = """
  61. > CREATE MATERIALIZED VIEW $view_name$ AS
  62. SELECT
  63. index,
  64. i4_range,
  65. i8_range,
  66. num_range,
  67. ts_range,
  68. tstz_range,
  69. d_range,
  70. '[2,5]'::INT8RANGE AS i8_range2,
  71. INT8RANGE(2,4) AS i8_range3,
  72. GREATEST(i8_range, '[2,5]'::INT8RANGE) AS i8_greatest,
  73. LEAST(i8_range, '[2,5]'::INT8RANGE) AS i8_least,
  74. NULLIF(i8_range, '[2,17)'::INT8RANGE) AS i8_nif,
  75. LOWER(i8_range) AS i8_low,
  76. UPPER(i8_range) AS i8_up,
  77. ISEMPTY(i8_range) AS i8_empty,
  78. LOWER_INC(i8_range) AS i8_lowinc,
  79. UPPER_INC(i8_range) AS i8_upinc,
  80. LOWER_INF(i8_range) AS i8_lowinf,
  81. UPPER_INF(i8_range) AS i8_upinf,
  82. i8_range < '[2,16]'::INT8RANGE AS i8_lt,
  83. i8_range <= '[2,16]'::INT8RANGE AS i8_le,
  84. i8_range = '[2,16]'::INT8RANGE AS i8_eq,
  85. i8_range >= '[2,16]'::INT8RANGE AS i8_ge,
  86. i8_range > '[2,16]'::INT8RANGE AS i8_gt,
  87. i8_range @> INT8RANGE(2,3) AS i8_containsrange,
  88. i8_range @> 16::INT8 as i8_containselem,
  89. i8_range <@ INT8RANGE(2,3) AS i8_inrange,
  90. 16::INT8 <@ i8_range as i8_inelem,
  91. i8_range && INT8RANGE(4,12) AS i8_overlap,
  92. i8_range << INT8RANGE(400, 500) AS i8_leftof,
  93. i8_range >> INT8RANGE(0, 1) AS i8_rightof,
  94. i8_range &< INT8RANGE(0, 1) AS i8_notextright,
  95. i8_range &> INT8RANGE(0, 1) AS i8_notextleft,
  96. i8_range -|- INT8RANGE(100, 150) AS i8_adjacent,
  97. i8_range + '[3,20]'::INT8RANGE AS i8_merge,
  98. i8_range * '[8,20]'::INT8RANGE AS i8_intersec,
  99. i8_range - '[8,120]'::INT8RANGE AS i8_diff,
  100. (SELECT partition FROM range_source_progress LIMIT 1) AS progress_range
  101. FROM range_table;
  102. > INSERT INTO range_table SELECT * FROM range_table WHERE index = 1;
  103. """
  104. return [
  105. Testdrive(dedent(s))
  106. for s in [
  107. manipulation.replace("$view_name$", "range_view1"),
  108. manipulation.replace("$view_name$", "range_view2"),
  109. ]
  110. ]
  111. def validate(self) -> Testdrive:
  112. return Testdrive(
  113. dedent(
  114. """
  115. > SELECT * FROM range_table ORDER BY index ASC;
  116. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01)
  117. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01)
  118. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01)
  119. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01)
  120. 2 <null> <null> <null> <null> <null> <null>
  121. > SELECT * FROM range_view1 ORDER BY index ASC;
  122. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  123. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  124. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  125. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  126. 2 <null> <null> <null> <null> <null> <null> [2,6) [2,4) [2,6) [2,6) <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> [0,0]
  127. > SELECT * FROM range_view2 ORDER BY index ASC;
  128. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  129. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  130. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  131. 1 [2,9) [2,101) [400,600] "[2023-01-01 00:00:00,2023-03-01 00:00:00)" "[2023-01-01 00:00:00 UTC,2023-03-01 00:00:00 UTC)" [2023-01-01,2023-03-01) [2,6) [2,4) [2,101) [2,6) [2,101) 2 101 false true false false false false false false true true true true false true true true true false true false [2,101) [8,21) [2,8) [0,0]
  132. 2 <null> <null> <null> <null> <null> <null> [2,6) [2,4) [2,6) [2,6) <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> <null> [0,0]
  133. """
  134. )
  135. )