Jacek Ruminski

107 papers C 60Journal 15Unranked 32
YearRankTypeTitle / Venue / Authors
2025 C conf
HSI
Paulina Leszczelowska, Jacek Ruminski
2025 J jnl
CoRR
Daniel Cieslak, Miriam Reca, Olena Onyshchenko, Jacek Ruminski
2025 C conf
HSI
Dmytro Tkachenko, Jacek Ruminski
2025 C conf
HSI
Milena Sobotka, Kamil Kopryk, Jacek Ruminski
2025 C conf
HSI
Kamil Kopryk, Milena Sobotka, Jacek Ruminski
2025 conf
ICCVW
Maciej Szankin, Jacek Ruminski
2025 conf
IWIS
Tomasz Kocejko, Jacek Ruminski, Tomasz Neumann, Magdalena Mazur-Milecka, Natalia Kowalczyk, Dmytro Tkachenko, Antoni Górecki, Jakub Klopotek-Glowczewski, Milena Sobotka
2024 J jnl
Mach. Learn. Knowl. Extr.
Louise Pedersen, Magdalena Mazur-Milecka, Jacek Ruminski, Stefan Rahr Wagner
2024 C conf
HSI
Johan Carcamo, Ahmad Shehada, Arda Candas, Nirav Vaghasiya, Murad Abdullayev, Andrii Melnyk, Jacek Ruminski
2024 C conf
HSI
Lukasz Erimus, Aleksandra Borowska, Adrian Jaromin, Agnieszka Lewko, Jacek Ruminski
2024 C conf
HSI
Kamil Kopryk, Milena Sobotka, Jacek Ruminski, Paulina Leszczelowska
2024 C conf
HSI
S. Cichocka, Jacek Ruminski
2024 conf
IWIS
Tomasz Ludwisiak, Magdalena Mazur-Milecka, Tomasz Kocejko, Jacek Ruminski, Kang-Hyun Jo
2024 conf
IWIS
Tomasz Kocejko, Tomasz Neumann, Magdalena Mazur-Milecka, Natalia Kowalczyk, Jacek Ruminski, Kang-Hyun Jo, Milosz Kaszynski, Tomasz Ludwisiak
2023 conf
PCBBE
Jakub Konert, Adam Dradrach, Jacek Ruminski
2023 conf
IWANN (2)
Paulina Leszczelowska, Maria Bollin, Karol Lempkowski, Mateusz Zak, Jacek Ruminski
2023 conf
ICIT
Krystian Zielinski, Natalia Kowalczyk, Tomasz Kocejko, Magdalena Mazur-Milecka, Tomasz Neumann, Jacek Ruminski
2023 J jnl
IEEE Access
Natalia Kowalczyk, Milena Sobotka, Jacek Ruminski
2023 J jnl
CoRR
Natalia Kowalczyk, Jacek Ruminski
2023 conf
ICIT
Adam Dradrach, Jakub Konert, Jacek Ruminski
2023 conf
PCBBE
Magdalena Mazur-Milecka, Natalia Kowalczyk, Kinga Jaguszewska, Dorota Zamkowska, Dariusz Wójcik, Krzysztof Preis, Henriette Skov, Stefan Rahr Wagner, Puk Sandager, Milena Sobotka, Jacek Ruminski
2023 conf
CVPR Workshops
Natalia Kowalczyk, Jacek Ruminski
2023 conf
HealthyIoT / HealthWear
Jorge Miranda, Stefan Rahr Wagner, Magdalena Mazur-Milecka, Jacek Ruminski
2023 J jnl
J. Imaging
Maciej Szankin, Alicja Kwasniewska, Jacek Ruminski
2022 C conf
HSI
A. Górska, P. Guzal, I. Namiotko, Aleksandra Wedolowska, M. Wloszczynska, Jacek Ruminski
2022 C conf
HSI
Daswin De Silva, Rashmika Nawaratne, Jacek Ruminski, Aleksander Malinowski, Milos Manic
2022 conf
MICCAI (8)
Efklidis Katsaros, Piotr Kopa Ostrowski, Krzysztof Wlódarczak, Emilia Lewandowska, Jacek Ruminski, Damian Siupka-Mróz, Lukasz Lassmann, Anna Jezierska, Daniel Wesierski
2022 J jnl
CoRR
Efklidis Katsaros, Piotr Kopa Ostrowski, Krzysztof Wlódarczak, Emilia Lewandowska, Jacek Ruminski, Damian Siupka-Mróz, Lukasz Lassmann, Anna Jezierska, Daniel Wesierski
2022 C conf
HSI
Magdalena Madej, Jacek Ruminski
2022 C conf
HSI
A. Górska, P. Guzal, I. Namiotko, Aleksandra Wedolowska, M. Wloszczynska, Jacek Ruminski
2022 C conf
HSI
Alicja Kwasniewska, Sharath Raghava, Carlos Dávila, Mikael Sevenier, David Gamba, Jacek Ruminski
2022 conf
IWIS
Tomasz Kocejko, Jacek Ruminski, Kang-Hyun Jo
2022 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Tomasz Kocejko, Jacek Ruminski, Magdalena Mazur-Milecka, Marzena Romanowska-Kocejko, Krzysztof Chlebus, Kang-Hyun Jo
2021 J jnl
J. Ambient Intell. Humaniz. Comput.
Anna Drewek-Ossowicka, Mariusz Pietrolaj, Jacek Ruminski
2021 J jnl
Sensors
Natalia Glowacka, Jacek Ruminski
2021 C conf
HSI
Maciej Szankin, Alicja Kwasniewska, Natalia Glowacka, Jacek Ruminski, Rey Nicolas, David Gamba
2021 conf
CVPR Workshops
Alicja Kwasniewska, Maciej Szankin, Jacek Ruminski, Anthony Sarah, David Gamba
2021 C conf
HSI
Magdalena Mazur-Milecka, Natalia Glowacka, Mariusz Kaczmarek, Adam Bujnowski, Milosz Kaszynski, Jacek Ruminski
2021 J jnl
Informatica
Viktoras Bulavas, Virginijus Marcinkevicius, Jacek Ruminski
2020 C conf
HSI
Tomasz Kocejko, Radoslaw Weglerski, Tomasz Zubowicz, Jacek Ruminski, Jerzy Wtorek, Krzysztof Arminski
2020 C conf
HSI
Tomasz Kocejko, Filip Brzezinski, Artur Polinski, Jacek Ruminski, Jerzy Wtorek
2020 J jnl
Eng. Appl. Artif. Intell.
Alicja Kwasniewska, Jacek Ruminski, Maciej Szankin, Mariusz Kaczmarek
2019 C conf
IECON
Alicja Kwasniewska, Maciej Szankin, Mateusz Ozga, Jason Wolfe, Arun Das, Adam Zajac, Jacek Ruminski, Paul Rad
2019 C conf
HSI
Magdalena Mazur-Milecka, Emilia Kaczmarczyk, Lukasz Wróbel, Patryk Przybylski, Marika Trudnowska, Aleksandra Podwojcik, Monika Jagiello, Krzysztof Lukaszuk, Jacek Ruminski
2019 conf
EMBC
Alicja Kwasniewska, Maciej Szankin, Jacek Ruminski, Mariusz Kaczmarek
2019 conf
EMBC
Jacek Ruminski, Alicja Kwasniewska, Maciej Szankin, Tomasz Kocejko, Magdalena Mazur-Milecka
2019 C conf
HSI
Maciej Szankin, Alicja Kwasniewska, Jacek Ruminski
2019 C conf
HSI
Kamil Janczyk, Tomasz Neumann, Jacek Ruminski
2019 C conf
HSI
Tomasz Kocejko, Tomasz Gorycki, Artur Polinski, Adam Bujnowski, Mariusz Kaczmarek, Jacek Ruminski, Antoni Nowakowski, Jerzy Wtorek
2018 C ed.
HSI
Adam Bujnowski, Mariusz Kaczmarek, Jacek Ruminski
2018 conf
EMBC
Artur Polinski, Michal Pietrewicz, Tomasz Kocejko, Adam Bujnowski, Jacek Ruminski, Jerzy Wtorek
2018 C conf
HSI
K. Wasilewska, Jacek Ruminski
2018 C conf
HSI
Kamil Janczyk, Krzysztof Czuszynski, Jacek Ruminski
2018 conf
EMBC
Maciej Szankin, Alicja Kwasniewska, Tejaswini Sirlapu, Mingshan Wang, Jacek Ruminski, Rey Nicolas, Marko Bartscherer
2018 C conf
HSI
Krzysztof Czuszynski, Alicja Kwasniewska, Maciej Szankin, Jacek Ruminski
2018 conf
EMBC
Alicja Kwasniewska, Jacek Ruminski, Maciej Szankin, Krzysztof Czuszynski
2018 conf
EMBC
Alicja Kwasniewska, Jacek Ruminski, Maciej Szankin, Krzysztof Czuszynski
2018 C conf
IECON
Maciej Szankin, Alicja Kwasniewska, Jacek Ruminski, Rey Nicolas
2018 conf
EMBC
Magdalena Mazur-Milecka, Jacek Ruminski
2018 C conf
IECON
Krzysztof Czuszynski, Jacek Ruminski
2017 conf
EMBC
Magdalena Mazur-Milecka, Jacek Ruminski
2017 C conf
HSI
Alicja Kwasniewska, Jacek Ruminski, Paul Rad
2017 C conf
HSI
Tomasz Kocejko, Krzysztof Czuszynski, Jacek Ruminski, Adam Bujnowski, Artur Polinski, Jerzy Wtorek
2017 conf
GIoTS
Aliaksei Andrushevich, Martin Biallas, Rolf Kistler, Jacek Ruminski, Adam Bujnowski, Jerzy Wtorek
2017 C conf
HSI
Jerzy Dembski, Jacek Ruminski
2017 C conf
HSI
Krzysztof Czuszynski, Jacek Ruminski, Jerzy Wtorek
2017 conf
EMBC
Alicja Kwasniewska, Jacek Ruminski, Jerzy Wtorek
2017 J jnl
CoRR
Krzysztof Czuszynski, Jacek Ruminski, Jerzy Wtorek
2017 C conf
HSI
Tomasz Kocejko, Jacek Ruminski, Piotr Przystup, Artur Polinski, Jerzy Wtorek
2017 C conf
HSI
Jacek Lebiedz, Jerzy Redlarski, Jacek Ruminski
2017 C conf
HSI
Kang-Hyun Jo, Luís Gomes, Milos Manic, Jacek Ruminski, Young Soo Suh
2016 C conf
FedCSIS
Mariusz Kaczmarek, Jacek Ruminski, Adam Bujnowski
2016 C conf
FedCSIS
Adam Bujnowski, Jacek Ruminski, Mariusz Kaczmarek, Krzysztof Czuszynski, Piotr Przystup
2016 C conf
HSI
Tomasz Kocejko, Adam Bujnowski, Jacek Ruminski, Krzysztof Czuszynski, Michal Pietrewicz, Artur Polinski
2016 C conf
FedCSIS
Pawel Krzyzanowski, Tomasz Kocejko, Jacek Ruminski, Adam Bujnowski
2016 C conf
FedCSIS
Jacek Ruminski, Adam Bujnowski, Krzysztof Czuszynski, Tomasz Kocejko
2016 C conf
HSI
Krzysztof Czuszynski, Jacek Ruminski, Artur Polinski, Adam Bujnowski
2016 J jnl
Int. J. Distributed Sens. Networks
Jacek Ruminski, Adam Bujnowski, Tomasz Kocejko, Jerzy Wtorek, Aliaksei Andrushevich, Martin Biallas, Rolf Kistler
2016 C conf
HSI
Alicja Kwasniewska, Jacek Ruminski
2016 C conf
HSI
Adam Bujnowski, Jacek Ruminski, Piotr Przystup, Krzysztof Czuszynski, Tomasz Kocejko
2016 conf
UbiComp Adjunct
Krzysztof Czuszynski, Jacek Ruminski, Adam Bujnowski, Jerzy Wtorek
2016 C conf
HSI
Jacek Ruminski
2016 C conf
HSI
Jacek Ruminski, Adam Bujnowski, Tomasz Kocejko, Aliaksei Andrushevich, Martin Biallas, Rolf Kistler
2016 C conf
HSI
Tomasz Kocejko, Jacek Ruminski, Adam Bujnowski, Jerzy Wtorek
2015 conf
EMBC
Jacek Ruminski, Krzysztof Czuszynski
2015 C conf
HSI
Adam Bujnowski, Krzysztof Czuszynski, Jacek Ruminski, Jerzy Wtorek, Roderick McCall, Andrei Popleteev, Nicolas Louveton, Thomas Engel
2015 C conf
HSI
Tomasz Kocejko, Jacek Ruminski, Jerzy Wtorek, Benoît Martin
2015 C conf
HSI
Krzysztof Czuszynski, Jacek Ruminski, Jerzy Wtorek, Anita Vogl, Michael Haller
2015 C conf
HSI
Jacek Ruminski, Maciej Smiatacz, Adam Bujnowski, Aliaksei Andrushevich, Martin Biallas, Rolf Kistler
2015 conf
CORES
Maciej Smiatacz, Jacek Ruminski
2015 C conf
HSI
Alicja Kwasniewska, Joanna Klimiuk-Myszk, Jacek Ruminski, Jerome Forrier, Benoît Martin, Isabelle Pecci
2015 conf
EMBC
Krzysztof Czuszynski, Jacek Ruminski, Tomasz Kocejko, Jerzy Wtorek
2014 C conf
HSI
Tomasz Kocejko, Adam Bujnowski, Jacek Ruminski, Ewa Bylinska, Jerzy Wtorek
2014 C conf
HSI
Jacek Ruminski, Adam Bujnowski, Jerzy Wtorek
2014 C conf
HSI
Krzysztof Czuszynski, Jacek Ruminski
2014 C conf
HSI
Jacek Ruminski, Adam Bujnowski, Jerzy Wtorek, Aliaksei Andrushevich, Martin Biallas, Rolf Kistler
2013 C conf
HSI
Piotr Przystup, Adam Bujnowski, Jacek Ruminski, Jerzy Wtorek
2013 conf
PervasiveHealth
Adam Bujnowski, Jacek Ruminski, Arkadiusz Palinski, Jerzy Wtorek
2012 C conf
HSI
Adam Bujnowski, Arkadiusz Palinski, Jedrzej Nowak, Mariusz Kaczmarek, Jacek Ruminski, Jerzy Wtorek
2012 conf
ITIB
Mariusz Kaczmarek, Jedrzej Nowak, Jacek Ruminski, Jerzy Wtorek, Tomasz Kocejko
2011 J jnl
Bio Algorithms Med Syst.
Antoni Nowakowski, Maria Bochenska, Brygida Mielewska, Jacek Ruminski, Jerzy Wtorek
2011 C conf
FedCSIS
Magdalena Lewandowska, Jacek Ruminski, Tomasz Kocejko, Jedrzej Nowak
2011 C conf
FedCSIS
Mariusz Kaczmarek, Jacek Ruminski, Adam Bujnowski
2009 conf
PervasiveHealth
Jacek Ruminski, Tomasz Kocejko, Adam Bujnowski, Jerzy Wtorek
2007 J jnl
IEEE Trans. Biomed. Eng.
Jacek Ruminski, Mariusz Kaczmarek, Alicja Renkielska, Antoni Nowakowski
2005 conf
CORES
Jacek Ruminski, Bartosz Karczewski
2001 C conf
CAIP
Jacek Ruminski, Mariusz Kaczmarek, Antoni Nowakowski
redb/extractors/database_exporters.py
← Index redb/extractors/database_exporters.py python
from abc import ABC, abstractmethod
from datetime import datetime, timezone
from dataclasses import asdict
import hashlib
import json
import inspect
from typing import Any, Dict, List, Union
from redb import settings
import traceback
from contextlib import contextmanager

class DatabaseExporter(ABC):
    @abstractmethod
    def export(self, data: Any, **kwargs) -> bool:
        """Export data to the database"""
        pass

class ElasticsearchExporter(DatabaseExporter):
    def __init__(self, logger: Any, index_prefix: str):
        self.client = settings.get_elasticsearch_client()
        self.index_prefix = index_prefix
        self.log = logger

    def export(self, data: Any, **kwargs) -> bool:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not isinstance(data, list):
            data = [data]
            
        now_t = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
        index = kwargs.get('index')
        tag = kwargs.get('tag')
        hashes = kwargs.get('hashes')
        
        for dataclass_ in data:
            try:
                # Convert dataclass to dict and filter out None values
                document = {k: v for k, v in asdict(dataclass_).items() if v is not None}
                
                if tag:
                    document["tag"] = tag
                document |= hashes
                document["timestamp_utc"] = now_t
                document["known_benign"] = kwargs.get('known_benign', False)
                document["known_malicious"] = kwargs.get('known_malicious', False)

                if "_id" in document:
                    tmp_id = document.pop("_id") + document["sha256"]
                    _id = hashlib.sha256(tmp_id.encode()).hexdigest()
                else:
                    _id = document["sha256"]

                doc_dump = json.dumps(document)
                self.client.index(index=index, id=_id, document=doc_dump)
                
            except Exception as e:
                self.log.error(f"Failed to export to Elasticsearch: {e}")
                return False
                
        return True

class PrintExporter(DatabaseExporter):
    """Exporter that prints results instead of uploading to database (for dry-run mode)"""
    def __init__(self, logger: Any, index_prefix: str):
        self.index_prefix = index_prefix
        self.log = logger
        self.log.debug(f"PrintExporter initialized with index_prefix: {index_prefix}")

    def export(self, data: Any, **kwargs) -> bool:
        try:
            import json
            from dataclasses import asdict, is_dataclass

            self.log.debug(f"PrintExporter.export called with data type: {type(data)}")

            if data is None:
                self.log.debug("PrintExporter.export: data is None, returning True")
                return True

            if not isinstance(data, list):
                data = [data]

            for i, item in enumerate(data):
                if is_dataclass(item) and not isinstance(item, type):
                    # Convert dataclass instance to dict
                    try:
                        item_dict = asdict(item)
                        print(json.dumps(item_dict, indent=2, default=str))
                    except Exception as e:
                        self.log.error(f"PrintExporter.export: Error converting dataclass: {e}")
                        print(str(item))
                elif isinstance(item, dict):
                    # Already a dict, print as JSON
                    print(json.dumps(item, indent=2, default=str))
                else:
                    # Fallback for other types
                    print(json.dumps(item, indent=2, default=str) if not isinstance(item, str) else item)

            self.log.debug("PrintExporter.export: completed successfully")
            return True
        except Exception as e:
            self.log.error(f"PrintExporter.export: Failed to print data: {e}")
            return False


class ClickHouseExporter(DatabaseExporter):
    def __init__(self, logger: Any, index_prefix: str, client=None):
        self.index_prefix = index_prefix
        self.log = logger
        self.client = client

    @contextmanager
    def clickhouse_connection(self):
        client = settings.create_clickhouse_client()
        try:
            yield client
        finally:
            try:
                client.close()
            except:
                pass
    # def export(self, data: Any, **kwargs) -> bool:
    #     try:
    #         # Handle multi-table export case
    #         # if isinstance(data, dict) and 'multi_table' in data:
    #         #     for table_name, table_data in data.items():
    #         #         if table_name != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
    #         #             self.log.debug(f"Exporting to table: {table_data['table']}")
    #         #             self.log.debug(f"Column names: {table_data['column_names']}")
    #         #             self.log.debug(f"Column types: {table_data['column_type_names']}")
    #         #             self.log.debug(f"Data sample: {table_data['data'][0] if table_data['data'] else 'No data'}")
                        
    #         #             try:
    #         #                 result = self.client.insert(
    #         #                     table_data['table'],
    #         #                     table_data['data'],
    #         #                     column_names=table_data['column_names'],
    #         #                     column_type_names=table_data['column_type_names']
    #         #                 )
    #         #                 if not result:
    #         #                     self.log.error(f"Failed to insert into table {table_data['table']}")
    #         #                     return False
    #         #             except Exception as e:
    #         #                 self.log.error(f"Error inserting into table {table_data['table']}: {e}")
    #         #                 self.log.error(f"Data that caused error: {table_data['data']}")
    #         #                 return False
    #         #     return True

    #         if isinstance(data, dict) and 'multi_table' in data:
    #             for table_name, table_data in data.items():
    #                 if table_name != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
    #                     self.log.debug(f"Exporting to table: {table_data['table']}")
                        
    #                     # Validate each row before insert
    #                     for row in table_data['data']:
    #                         for val, col_name, col_type in zip(row, table_data['column_names'], 
    #                                                         table_data['column_type_names']):
    #                             # Check for empty strings
    #                             if isinstance(val, str) and not val:
    #                                 self.log.error(f"Empty string found for column {col_name}")
    #                                 raise ValueError(f"Empty string not allowed for column {col_name}")
                                
    #                             # Log all string values for certificate_serial_number
    #                             if col_name == 'certificate_serial_number':
    #                                 self.log.debug(f"Serial number value: '{val}', type: {type(val)}, "
    #                                             f"repr: {repr(val)}")
                        
    #                     try:
    #                         result = self.client.insert(
    #                             table_data['table'],
    #                             table_data['data'],
    #                             column_names=table_data['column_names'],
    #                             column_type_names=table_data['column_type_names']
    #                         )
    #                         if not result:
    #                             self.log.error(f"Failed to insert into table {table_data['table']}")
    #                             return False
    #                     except Exception as e:
    #                         self.log.error(f"Error inserting into table {table_data['table']}: {e}")
    #                         self.log.error(f"Data that caused error: {table_data['data']}")
    #                         return False
    #             return True

    #         # Handle single table case
    #         table = kwargs.get('table')
    #         if not table:
    #             raise ValueError("Table name must be provided for ClickHouse export")
            
    #         # Unpack the tuple returned by prepare_export_data
    #         if isinstance(data, tuple):
    #             if len(data) != 3:
    #                 raise ValueError("Data tuple must contain exactly 3 elements: (data, column_names, column_type_names)")
    #             insert_data, column_names, column_type_names = data
    #         else:
    #             # Use provided column names and types from kwargs
    #             insert_data = data
    #             column_names = kwargs.get('column_names')
    #             column_type_names = kwargs.get('column_type_names')
                
    #         if not (column_names and column_type_names):
    #             raise ValueError("column_names and column_type_names must be provided")

    #         # Ensure data is in list format for batch insert
    #         if not isinstance(insert_data, list):
    #             insert_data = [insert_data]
                
    #         self.client.insert(
    #             table,
    #             insert_data,
    #             column_names=column_names,
    #             column_type_names=column_type_names
    #         )
    #         return True
            
    #     except Exception as e:
    #         self.log.error(f"Failed to export to ClickHouse: {e}")
    #         return False

    def get_client(self):
        """Get existing client or create new one if needed"""
        if self.client:
            return self.client
        try:
            return settings.create_clickhouse_client() 
        except Exception as e:
            self.log.error(f"Failed to create ClickHouse client: {e}")
            return None
            
    # WORKING SIMPLE VERSION
    def export(self, data: Any, **kwargs) -> bool:
        try:
            # # Handle multi-table export case
            # # if isinstance(data, dict) and 'multi_table' in data:
            # #     for table_data in data.values():
            # #         if isinstance(table_data, dict) and 'table' in table_data:
            # #             result = self.client.insert(
            # #                 table_data['table'],
            # #                 table_data['data'],
            # #                 column_names=table_data['column_names'],
            # #                 column_type_names=table_data['column_type_names']
            # #             )
            # #             if not result:  # If any insert fails, return False
            # #                 return False
            # #     return True
            # if isinstance(data, dict) and 'multi_table' in data:
            #     for key, table_data in data.items():
            #         if key != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
            #             # Add type hints
            #             typed_data = []
            #             for row in table_data['data']:
            #                 typed_row = []
            #                 for val, type_name in zip(row, table_data['column_type_names']):
            #                     if isinstance(val, str) and not val:
            #                         val = 'UNKNOWN'
            #                     if type_name == 'String' or 'LowCardinality(String)' in type_name:
            #                         val = str(val) if val is not None else 'UNKNOWN'
            #                     typed_row.append(val)
            #                 typed_data.append(typed_row)
                        
            #             table_data['data'] = typed_data
                        
            #             result = self.client.insert(
            #                 table_data['table'],
            #                 table_data['data'],
            #                 column_names=table_data['column_names'],
            #                 column_type_names=table_data['column_type_names'],
            #                 settings={'input_format_values_interpret_expressions': 0}  # Disable type inference
            #             )
            #             if not result:
            #                 return False
            #         return True

            # Get a new client connection for this export operation
            with self.clickhouse_connection() as client:
                if not client:
                    return False

                # LAST WORKING VERSION
                if isinstance(data, dict) and 'multi_table' in data:
                    for key, table_data in data.items():
                        if key != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
                            # Debug logging
                            self.log.debug(f"Processing table: {table_data['table']}")
                            self.log.debug(f"Column names: {table_data['column_names']}")
                            self.log.debug(f"Column types: {table_data['column_type_names']}")
                            
                            typed_data = []
                            for row_idx, row in enumerate(table_data['data']):
                                typed_row = []
                                for val_idx, (val, type_name, col_name) in enumerate(
                                    zip(row, table_data['column_type_names'], table_data['column_names'])
                                ):
                                    try:
                                        # Handle different types
                                        if val is None:
                                            if 'Nullable' in type_name:
                                                val = None  # Keep None for Nullable columns
                                            elif 'Array' in type_name:
                                                val = []
                                            elif 'Int' in type_name or 'UInt' in type_name:
                                                val = 0
                                            elif 'FixedString(16)' in type_name:
                                                val = b'\x00' * 16  # Binary FixedString
                                            elif 'String' in type_name or 'LowCardinality' in type_name:
                                                val = 'UNKNOWN'
                                            elif 'DateTime' in type_name:
                                                val = datetime.now(timezone.utc)
                                            elif 'Boolean' in type_name:
                                                val = False
                                            else:
                                                self.log.error(f"Unhandled type {type_name} for null value")
                                                val = 'UNKNOWN'
                                        
                                        # Log problematic values
                                        if isinstance(val, str) and not val.strip():
                                            self.log.warning(f"Empty string found in table {table_data['table']}, "
                                                        f"column {col_name}, row {row_idx}")
                                        
                                        # Ensure array types are always lists
                                        if 'Array' in type_name and not isinstance(val, list):
                                            val = [val]
                                        
                                        typed_row.append(val)
                                    except Exception as e:
                                        self.log.error(f"Error processing value in table {table_data['table']}, "
                                                    f"column {col_name} ({type_name}), "
                                                    f"row {row_idx}, value: {repr(val)}")
                                        raise
                                        
                                typed_data.append(typed_row)
                            
                            table_data['data'] = typed_data

                            # Skip insert if there is nothing to insert
                            if not typed_data:
                                self.log.debug(f"No data to insert for table {table_data['table']}, skipping.")
                                continue

                            # Debug log the first row of data
                            self.log.debug(f"Sample row for {table_data['table']}: {typed_data[0]}")

                            result = client.insert(
                                table_data['table'],
                                table_data['data'],
                                column_names=table_data['column_names'],
                                column_type_names=table_data['column_type_names'],
                                settings={'input_format_values_interpret_expressions': 0}
                            )
                            if not result:
                                self.log.error(f"Insert failed for table {table_data['table']}")
                                return False
                    return True

                # Handle single table case
                table = kwargs.get('table')
                if not table:
                    raise ValueError("Table name must be provided for ClickHouse export")
                
                # Unpack the tuple returned by prepare_export_data
                if isinstance(data, tuple):
                    if len(data) != 3:
                        raise ValueError("Data tuple must contain exactly 3 elements: (data, column_names, column_type_names)")
                    insert_data, column_names, column_type_names = data
                else:
                    # Use provided column names and types from kwargs
                    insert_data = data
                    column_names = kwargs.get('column_names')
                    column_type_names = kwargs.get('column_type_names')
                    
                if not (column_names and column_type_names):
                    raise ValueError("column_names and column_type_names must be provided")

                # Ensure data is in list format for batch insert
                if not isinstance(insert_data, list):
                    insert_data = [insert_data]

                # Skip insert if there is nothing to insert
                if not insert_data:
                    self.log.debug(f"No data to insert for table {table}, skipping.")
                    return True

                client.insert(
                    table,
                    insert_data,
                    column_names=column_names,
                    column_type_names=column_type_names,
                    settings={'input_format_values_interpret_expressions': 0}  # Disable type inference
                )
                return True

        except TypeError as e:
            # Get the actual value causing the error from the exception traceback
            import sys
            exc_type, exc_value, exc_traceback = sys.exc_info()
            
            # Walk through the traceback to find the frame with the problematic value
            current = exc_traceback
            while current:
                if 'string.py' in current.tb_frame.f_code.co_filename and '_data_size' in current.tb_frame.f_code.co_name:
                    locals_dict = current.tb_frame.f_locals
                    problematic_value = locals_dict.get('x')
                    self.log.error(f"TypeError with value: {problematic_value} (type: {type(problematic_value)})")
                    self.log.error(f"Full locals at error: {locals_dict}")
                    break
                current = current.tb_next
            
            self.log.error(f"Failed to export to ClickHouse: {e}")
            self.log.error("Full traceback:")
            self.log.error(traceback.format_exc())
            return False
        except Exception as e:
            self.log.error(f"Failed to export to ClickHouse: {e}")
            self.log.error(traceback.format_exc())
            return False
        finally:
            # Only close if we created a new client
            if client and client != self.client:
                # Close the client connection
                try:
                    client.close()
                except:
                    pass