aggregation.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. class Aggregation(Check):
  13. def initialize(self) -> Testdrive:
  14. return Testdrive(
  15. dedent(
  16. """
  17. > CREATE SCHEMA aggregation_schema
  18. > CREATE TABLE aggregation_schema.t1 (f1 INTEGER, f2 INTEGER, f3 INTEGER);
  19. > INSERT INTO aggregation_schema.t1 VALUES (1,1,1);
  20. """
  21. )
  22. )
  23. def manipulate(self) -> list[Testdrive]:
  24. return [
  25. Testdrive(dedent(s))
  26. for s in [
  27. """
  28. > SET search_path=aggregation_schema;
  29. > CREATE MATERIALIZED VIEW aggregation_schema.order_by1 AS SELECT * FROM t1 ORDER BY f3 DESC, f2 ASC , f1 DESC LIMIT 999999999;
  30. > CREATE MATERIALIZED VIEW aggregation_schema.limit_one1 AS SELECT * FROM t1 LIMIT 1;
  31. > CREATE MATERIALIZED VIEW aggregation_schema.limit_many1 AS SELECT * FROM t1 LIMIT 999999999;
  32. > CREATE MATERIALIZED VIEW aggregation_schema.top_level_distinct1 AS SELECT DISTINCT f1, f2 FROM t1;
  33. > CREATE MATERIALIZED VIEW aggregation_schema.global_count1 AS SELECT COUNT(*) FROM t1;
  34. > CREATE MATERIALIZED VIEW aggregation_schema.global_aggregation1 AS SELECT COUNT(f1), MIN(f1), MAX(f1), SUM(f1) FROM t1;
  35. > CREATE MATERIALIZED VIEW aggregation_schema.global_aggregation_distinct1 AS SELECT COUNT(DISTINCT f1), MIN(DISTINCT f1), MAX(DISTINCT f1), SUM(DISTINCT f1) FROM t1;
  36. > INSERT INTO aggregation_schema.t1 VALUES (2,2,2), (3,3,3), (NULL, NULL, NULL);
  37. """,
  38. """
  39. > SET search_path=aggregation_schema;
  40. > INSERT INTO aggregation_schema.t1 VALUES (3,3,3), (4,4,4), (NULL, NULL, NULL);
  41. > CREATE MATERIALIZED VIEW aggregation_schema.order_by2 AS SELECT * FROM t1 ORDER BY f3 DESC, f2 ASC , f1 DESC LIMIT 999999999;
  42. > CREATE MATERIALIZED VIEW aggregation_schema.limit_one2 AS SELECT * FROM t1 LIMIT 1;
  43. > CREATE MATERIALIZED VIEW aggregation_schema.limit_many2 AS SELECT * FROM t1 LIMIT 999999999;
  44. > CREATE MATERIALIZED VIEW aggregation_schema.top_level_distinct2 AS SELECT DISTINCT f1, f2 FROM t1;
  45. > CREATE MATERIALIZED VIEW aggregation_schema.global_count2 AS SELECT COUNT(*) FROM t1;
  46. > CREATE MATERIALIZED VIEW aggregation_schema.global_aggregation2 AS SELECT COUNT(f1), MIN(f1), MAX(f1), SUM(f1) FROM t1;
  47. > CREATE MATERIALIZED VIEW aggregation_schema.global_aggregation_distinct2 AS SELECT COUNT(DISTINCT f1), MIN(DISTINCT f1), MAX(DISTINCT f1), SUM(DISTINCT f1) FROM t1;
  48. > INSERT INTO aggregation_schema.t1 VALUES (5,5,5), (6,6,6), (NULL, NULL, NULL);
  49. """,
  50. ]
  51. ]
  52. def validate(self) -> Testdrive:
  53. return Testdrive(
  54. dedent(
  55. """
  56. > SET search_path=aggregation_schema;
  57. > SELECT * FROM order_by1;
  58. 1 1 1
  59. 2 2 2
  60. 3 3 3
  61. 3 3 3
  62. 4 4 4
  63. 5 5 5
  64. 6 6 6
  65. <null> <null> <null>
  66. <null> <null> <null>
  67. <null> <null> <null>
  68. > SELECT * FROM limit_one1;
  69. 1 1 1
  70. > SELECT * FROM limit_many1;
  71. 1 1 1
  72. 2 2 2
  73. 3 3 3
  74. 3 3 3
  75. 4 4 4
  76. 5 5 5
  77. 6 6 6
  78. <null> <null> <null>
  79. <null> <null> <null>
  80. <null> <null> <null>
  81. > SELECT * FROM top_level_distinct1;
  82. 1 1
  83. 2 2
  84. 3 3
  85. 4 4
  86. 5 5
  87. 6 6
  88. <null> <null>
  89. > SELECT * FROM global_count1;
  90. 10
  91. > SELECT * FROM global_aggregation1;
  92. 7 1 6 24
  93. > SELECT * FROM global_aggregation_distinct1;
  94. 6 1 6 21
  95. > SELECT * FROM order_by2;
  96. 1 1 1
  97. 2 2 2
  98. 3 3 3
  99. 3 3 3
  100. 4 4 4
  101. 5 5 5
  102. 6 6 6
  103. <null> <null> <null>
  104. <null> <null> <null>
  105. <null> <null> <null>
  106. > SELECT * FROM limit_one2;
  107. 1 1 1
  108. > SELECT * FROM limit_many2;
  109. 1 1 1
  110. 2 2 2
  111. 3 3 3
  112. 3 3 3
  113. 4 4 4
  114. 5 5 5
  115. 6 6 6
  116. <null> <null> <null>
  117. <null> <null> <null>
  118. <null> <null> <null>
  119. > SELECT * FROM top_level_distinct2;
  120. 1 1
  121. 2 2
  122. 3 3
  123. 4 4
  124. 5 5
  125. 6 6
  126. <null> <null>
  127. > SELECT * FROM global_count2;
  128. 10
  129. > SELECT * FROM global_aggregation2;
  130. 7 1 6 24
  131. > SELECT * FROM global_aggregation_distinct2;
  132. 6 1 6 21
  133. """
  134. )
  135. )