Skip to content

Commit

Permalink
add numpy bool dtype support (#332)
Browse files Browse the repository at this point in the history
* add numpy bool dtype support
  • Loading branch information
DylanModesitt committed Sep 2, 2022
1 parent 47dd88e commit e73f2d3
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 1 deletion.
8 changes: 8 additions & 0 deletions clickhouse_driver/columns/numpy/boolcolumn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import numpy as np

from .base import NumpyColumn


class NumpyBoolColumn(NumpyColumn):
dtype = np.dtype(np.bool_)
ch_type = 'Bool'
4 changes: 3 additions & 1 deletion clickhouse_driver/columns/numpy/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
NumpyInt8Column, NumpyInt16Column, NumpyInt32Column, NumpyInt64Column,
NumpyUInt8Column, NumpyUInt16Column, NumpyUInt32Column, NumpyUInt64Column
)
from .boolcolumn import NumpyBoolColumn
from .lowcardinalitycolumn import create_numpy_low_cardinality_column
from .stringcolumn import create_string_column
from .tuplecolumn import create_tuple_column
Expand All @@ -16,7 +17,8 @@
NumpyDateColumn,
NumpyFloat32Column, NumpyFloat64Column,
NumpyInt8Column, NumpyInt16Column, NumpyInt32Column, NumpyInt64Column,
NumpyUInt8Column, NumpyUInt16Column, NumpyUInt32Column, NumpyUInt64Column
NumpyUInt8Column, NumpyUInt16Column, NumpyUInt32Column, NumpyUInt64Column,
NumpyBoolColumn
]}


Expand Down
70 changes: 70 additions & 0 deletions tests/numpy/columns/test_bool.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
try:
import numpy as np
except ImportError:
np = None

from tests.numpy.testcase import NumpyBaseTestCase


class BoolTestCase(NumpyBaseTestCase):
n = 10
# https://clickhouse.com/docs/en/whats-new/changelog/2021
required_server_version = (21, 12, 0)

def check_result(self, rv, col_type):
data = (np.array(range(self.n)) % 2).astype(bool)
self.assertArraysEqual(rv[0], data)
self.assertEqual(rv[0].dtype, col_type)

def get_query(self, ch_type):
with self.create_table('a {}'.format(ch_type)):
data = [(np.array(range(self.n)) % 2).astype(bool)]
self.client.execute(
'INSERT INTO test (a) VALUES', data, columnar=True
)

query = 'SELECT * FROM test'
inserted = self.emit_cli(query)
self.assertEqual(
inserted, '\n'.join(str(x).lower() for x in data[0]) + '\n'
)
return self.client.execute(query, columnar=True)

def test_bool(self):
rv = self.get_query('Bool')
self.check_result(rv, np.bool_)

def test_insert_nan_into_non_nullable(self):
with self.create_table('a Bool'):
data = [
np.array([True, np.nan], dtype=object)
]
self.client.execute(
'INSERT INTO test (a) VALUES', data, columnar=True
)

query = 'SELECT * FROM test'
inserted = self.emit_cli(query)
self.assertEqual(
inserted,
'true\nfalse\n'
)

inserted = self.client.execute(query, columnar=True)
self.assertArraysEqual(inserted[0], np.array([True, 0]))
self.assertEqual(inserted[0].dtype, np.bool_)

def test_nullable(self):
with self.create_table('a Nullable(Bool)'):
data = [np.array([False, None, True, None, False])]
self.client.execute(
'INSERT INTO test (a) VALUES', data, columnar=True
)

query = 'SELECT * FROM test'
inserted = self.emit_cli(query)
self.assertEqual(inserted, 'false\n\\N\ntrue\n\\N\nfalse\n')

inserted = self.client.execute(query, columnar=True)
self.assertArraysEqual(inserted[0], data[0])
self.assertEqual(inserted[0].dtype, object)

0 comments on commit e73f2d3

Please sign in to comment.