| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you 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. | |
| # | |
| import numpy as np | |
| from iotdb.utils.BitMap import BitMap | |
| from iotdb.utils.IoTDBConstants import TSDataType | |
| from iotdb.utils.NumpyTablet import NumpyTablet | |
| from iotdb.utils.SessionUtils import filter_null_columns | |
| from iotdb.utils.Tablet import ColumnType, Tablet | |
| def test_filter_null_columns_tablet(): | |
| measurements = ["s1", "s2", "s3", "s4", "s5"] | |
| data_types = [ | |
| TSDataType.INT32, | |
| TSDataType.INT64, | |
| TSDataType.FLOAT, | |
| TSDataType.DOUBLE, | |
| TSDataType.BOOLEAN, | |
| ] | |
| values = [[1, None, 1.5, None, None]] | |
| timestamps = [1000] | |
| tablet = Tablet("root.sg.d1", measurements, data_types, values, timestamps) | |
| filtered = filter_null_columns(tablet) | |
| assert filtered is not None | |
| assert filtered is not tablet | |
| assert filtered.get_measurements() == ["s1", "s3"] | |
| assert filtered.get_values()[0] == [1, 1.5] | |
| # nothing to drop | |
| dense = Tablet( | |
| "root.sg.d1", | |
| ["s1"], | |
| [TSDataType.INT32], | |
| [[1]], | |
| [1], | |
| ) | |
| assert filter_null_columns(dense) is dense | |
| # all null | |
| all_null = Tablet( | |
| "root.sg.d1", | |
| measurements, | |
| data_types, | |
| [[None, None, None, None, None]], | |
| [2000], | |
| ) | |
| assert filter_null_columns(all_null) is None | |
| def test_filter_null_columns_table_model_keeps_tag(): | |
| tablet = Tablet( | |
| "table1", | |
| ["tag1", "s1", "s2"], | |
| [TSDataType.STRING, TSDataType.INT32, TSDataType.INT32], | |
| [["d1", None, None]], | |
| [3000], | |
| column_types=[ColumnType.TAG, ColumnType.FIELD, ColumnType.FIELD], | |
| ) | |
| filtered = filter_null_columns(tablet) | |
| assert filtered is not None | |
| assert filtered is not tablet | |
| assert filtered.get_measurements() == ["tag1"] | |
| assert filtered.get_column_categories() == [ColumnType.TAG] | |
| def test_filter_null_columns_numpy_tablet(): | |
| measurements = ["s1", "s2", "s3"] | |
| data_types = [TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT] | |
| values = [ | |
| np.array([1], dtype=np.dtype(">i4")), | |
| np.array([0], dtype=np.dtype(">i8")), | |
| np.array([1.5], dtype=np.dtype(">f4")), | |
| ] | |
| timestamps = np.array([1000], dtype=np.dtype(">i8")) | |
| bitmaps = [BitMap(1), BitMap(1), BitMap(1)] | |
| bitmaps[1].mark(0) | |
| np_tablet = NumpyTablet( | |
| "root.sg.d1", | |
| measurements, | |
| data_types, | |
| values, | |
| timestamps, | |
| bitmaps=bitmaps, | |
| ) | |
| filtered = filter_null_columns(np_tablet) | |
| assert filtered is not None | |
| assert filtered is not np_tablet | |
| assert filtered.get_measurements() == ["s1", "s3"] | |
| def test_filter_null_columns_numpy_tablet_active_rows(): | |
| measurements = ["s1", "s2"] | |
| data_types = [TSDataType.INT32, TSDataType.INT64] | |
| values = [ | |
| np.array([1], dtype=np.dtype(">i4")), | |
| np.array([0], dtype=np.dtype(">i8")), | |
| ] | |
| timestamps = np.array([1000], dtype=np.dtype(">i8")) | |
| bitmaps = [BitMap(10), BitMap(10)] | |
| bitmaps[1].mark(0) | |
| np_tablet = NumpyTablet( | |
| "root.sg.d1", | |
| measurements, | |
| data_types, | |
| values, | |
| timestamps, | |
| bitmaps=bitmaps, | |
| ) | |
| filtered = filter_null_columns(np_tablet) | |
| assert filtered is not None | |
| assert filtered is not np_tablet | |
| assert filtered.get_measurements() == ["s1"] | |
| def test_bitmap_is_range_all_marked(): | |
| bit_map = BitMap(20) | |
| for i in range(20): | |
| if i % 4 != 2: | |
| bit_map.mark(i) | |
| for start in range(21): | |
| for length in range(21 - start): | |
| all_marked = all(bit_map.is_marked(i) for i in range(start, start + length)) | |
| assert bit_map.is_range_all_marked(start, length) is all_marked | |
| assert bit_map.is_range_all_marked(0, 0) is True | |
| assert bit_map.is_range_all_marked(0, 21) is False | |
| assert bit_map.is_range_all_marked(21, 0) is False | |
| assert bit_map.is_range_all_marked(-1, 1) is False | |
| assert bit_map.is_range_all_marked(0, -1) is False | |
| empty = BitMap(0) | |
| assert empty.is_all_marked() is True | |
| full = BitMap(8) | |
| for i in range(8): | |
| full.mark(i) | |
| assert full.is_all_marked() is True | |
| partial = BitMap(8) | |
| for i in range(7): | |
| partial.mark(i) | |
| assert partial.is_all_marked() is False | |
| assert partial.is_range_all_marked(0, 7) is True |