Haifei Zhu

97 papers A* 4A 5Journal 28Unranked 60
YearRankTypeTitle / Venue / Authors
2026 J jnl
Trans. Inst. Meas. Control
Shichao Gu, Shangbiao Wei, Yisheng Guan, Xiaoguang Liu, Ming Nie, Xuefeng Zhou, Haifei Zhu
2026 J jnl
CoRR
Yufan Liu, Rixi Yu, Junjie Li, Yishuai Zeng, Zhenting Wen, Cheng Li, Haifei Zhu, Shikang Lian, Wei Meng, Fumin Zhang
2025 conf
ROBIO
Mingyan Ma, Shixin Mao, Weinan Chen, Yisheng Guan, Haifei Zhu
2025 conf
ROBIO
Jintyi Mo, Yongzhong Bu, Haochen Li, Rixi Yu, Xuefeng Zhou, Haifei Zhu
2025 J jnl
Robotics Auton. Syst.
Haifei Zhu, Pengcheng Ye, Jiongyu Tan, Weinan Chen, Tao Zhang, Yisheng Guan
2025 conf
ROBIO
Haochen Li, Lide Dun, Jingyi Mo, Haoran Li, Yongtao Deng, Haifei Zhu
2025 conf
ROBIO
Shiyao Qi, Yongjian Bu, Lide Dun, Haifei Zhu
2025 conf
ROBIO
Yongtao Deng, Qi Zhang, Shiquan Yi, Zhuohao Guo, Haifei Zhu
2025 J jnl
Int. J. Soc. Robotics
Yihui Li, Jiajun Wu, Wangcheng Chen, Yisheng Guan, Haifei Zhu
2025 J jnl
J. Field Robotics
Xubin Lin, Zerong Su, Zhihan Zhu, Pengfei Yuan, Haifei Zhu, Xuefeng Zhou
2025 conf
ROBIO
Fengmin Chen, Kuiyu Li, Zhaoyang Liao, Yisheng Guan, Haifei Zhu
2025 J jnl
Robotica
Shichao Gu, Ziyang Fu, Weinan Chen, Yisheng Guan, Hongmin Wu, Xuefeng Zhou, Haifei Zhu
2025 J jnl
Robotica
Shichao Gu, Ziyang Fu, Weinan Chen, Yisheng Guan, Hongmin Wu, Xuefeng Zhou, Haifei Zhu
2025 conf
ROBIO
Lide Dun, Shiyao Qi, Xiang Zhang, Haifei Zhu
2025 J jnl
IEEE Robotics Autom. Lett.
Weinan Chen, Sehua Ji, Xubin Lin, Zhi-Xin Yang, Wenzheng Chi, Yisheng Guan, Haifei Zhu, Hong Zhang
2025 conf
ICRCA
Weixin Zhang, Zhengxin Yu, Shixin Mao, Xuefeng Zhou, Jia Pan, Haifei Zhu
2025 conf
ROBIO
Yuhua Zhou, Kezheng Sun, Zhaoyang Liao, Yisheng Guan, Haifei Zhu
2025 J jnl
J. Field Robotics
Jiabin Liu, Minhui Ye, Haifei Zhu, Yisheng Guan, Tao Zhang
2025 A conf
IROS
Xiang Huo, Shilang Chen, Lei Zhu, Haifei Zhu, Yisheng Guan, Hong Zhang, Weinan Chen
2025 conf
ICIRA (1)
FuYong Zhang, Zhihao Xu, Yuming Li, Haifei Zhu, Zhaoyang Liao, Hongmin Wu, Xubin Lin, Xuefeng Zhou
2025 J jnl
IEEE Robotics Autom. Lett.
Jiajun Wu, Yihui Li, Haifei Zhu, Yisheng Guan
2024 A* conf
ICRA
Sehua Ji, Weinan Chen, Zerong Su, Yisheng Guan, Jiehao Li, Hong Zhang, Haifei Zhu
2024 J jnl
Robotics Auton. Syst.
Haifei Zhu, Jianhong Xu, Jingheng Chen, Shilang Chen, Yisheng Guan, Weinan Chen
2024 J jnl
IEEE Trans. Veh. Technol.
Weinan Chen, Zhenchao Lin, Lei Zhu, Shilang Chen, Haifei Zhu, Yisheng Guan, Hong Zhang
2024 conf
ICIT
Jinxun Tang, Xuanyu Chen, Weinan Chen, Shengxi Zhou, Xiao Li, Haifei Zhu, Jiehao Li
2024 conf
ICIRA (1)
Qianqian Chen, Jiawei Dong, Wei Wang, Lin Zhong, Huan Peng, Xiongqian Wu, Haifei Zhu, Yisheng Guan, Tao Zhang
2024 J jnl
IEEE Robotics Autom. Lett.
Haoran Li, Yongzhong Bu, Yongjian Bu, Shixin Mao, Yisheng Guan, Haifei Zhu
2024 conf
ICIRA (1)
Zhiwei Long, Riyue Wu, Mingcong Wang, Guangfei Zhang, Haifei Zhu, Yisheng Guan, Tao Zhang
2024 J jnl
IEEE Robotics Autom. Lett.
Jiawei Dong, Lin Zhong, Qianqian Chen, Riyue Wu, Xueqin Zheng, Haifei Zhu, Shuqi Wang, Tao Zhang
2024 conf
ROBIO
Kunquan Zheng, Zibiao Chen, Hongmin Zheng, Zhaofeng Liang, Haifei Zhu, Yisheng Guan, Kun Xu, Tao Zhang
2024 J jnl
Adv. Intell. Syst.
Tao Zhang, Hongyu Wei, Hongmin Zheng, Zhaofeng Liang, Haotian Yang, Yinliang Zhang, Haifei Zhu, Yisheng Guan, Xilun Ding, Kunyang Wang, Kun Xu
2024 J jnl
Adv. Intell. Syst.
Tao Zhang, Hongyu Wei, Hongmin Zheng, Zhaofeng Liang, Haotian Yang, Yinliang Zhang, Haifei Zhu, Yisheng Guan, Xilun Ding, Kunyang Wang, Kun Xu
2024 conf
ICIRA (4)
Yuan Hu, Yisheng Guan, Haifei Zhu
2024 J jnl
IEEE Trans. Ind. Electron.
Manjia Su, Dongyu Huang, Yisheng Guan, Chaoqun Xiang, Haifei Zhu, Zhi Liu
2024 J jnl
J. Real Time Image Process.
Ruitao Zheng, Haifei Zhu, Xinghua Wu, Wei Meng
2024 J jnl
Eng. Appl. Artif. Intell.
Shuangfei Yu, Yisheng Guan, Jiacheng Hu, Jie Hong, Haifei Zhu, Tao Zhang
2023 conf
ROBIO
Pengcheng Ye, Yisheng Guan, Shixin Mao, Ping Wang, Haifei Zhu
2023 conf
ICIRA (8)
Shanwei Liu, Qiang Fu, Yisheng Guan, Haifei Zhu
2023 conf
RCAR
Pengfei Yuan, Hongmin Wu, Zhihan Zhu, Shixin Mao, Xuefeng Zhou, Haifei Zhu
2023 conf
ICARM
Zhaofeng Liang, Hongmin Zheng, Hongyu Wei, Shuangfei Yu, Kun Xu, Chaoqun Xiang, Haifei Zhu, Kunyang Wang, Tao Zhang
2023 conf
ICARM
Jiabin Liu, Jiashu Feng, Jinchang Xu, Hongyu Wei, Haifei Zhu, Tao Zhang
2023 conf
ROBIO
Shenhao Chen, Haifei Zhu, Yisheng Guan, Shixin Mao
2023 conf
ICIRA (3)
Wenfei Wei, Guanghua Hu, Fengmin Chen, Haifei Zhu
2023 conf
ROBIO
Runming Cai, Yisheng Guan, Haifei Zhu, Wangcheng Chen, Shixin Mao
2023 conf
ROBIO
Yuhan Hou, Pengcheng Ye, Wenda Ye, Shixin Mao, Yisheng Guan, Haifei Zhu
2023 J jnl
Robotics Auton. Syst.
Yihui Li, Jiajun Wu, Xiaohan Chen, Yisheng Guan, Haifei Zhu
2022 A conf
IROS
Qiang Fu, Yisheng Guan, Haifei Zhu
2022 J jnl
Robotics Auton. Syst.
Haifei Zhu, Zidong Lin, Jingyu Yan, Pengcheng Ye, Weixin Zhang, Shixin Mao, Yisheng Guan
2022 conf
ROBIO
Yongzhong Bu, Yongjian Bu, Haoran Li, Shixin Mao, Haifei Zhu
2022 conf
ROBIO
Zhihan Zhu, Xubin Lin, Zerong Su, Shixin Mao, Haifei Zhu, Xuefeng Zhou
2022 conf
ROBIO
Shaobin Zhuang, Shichao Gu, Pengcheng Ye, Shixin Mao, Yisheng Guan, Haifei Zhu
2021 A* conf
ICRA
Junfa Liu, Juan Rojas, Yihui Li, Zhijun Liang, Yisheng Guan, Ning Xi, Haifei Zhu
2021 conf
ROBIO
Qiang Fu, Yisheng Guan, Shanwei Liu, Haifei Zhu
2021 A conf
IROS
Manjia Su, Yu Qiu, Yisheng Guan, Haifei Zhu, Zhi Liu
2021 conf
RCAR
Jingheng Chen, Shaobin Zhuang, Shichao Gu, Yisheng Guan, Haifei Zhu
2021 conf
ROBIO
Jie Wang, Haifei Zhu, Yisheng Guan, Yaowei Song
2021 conf
ICIRA (2)
Jie Wang, Yisheng Guan, Haifei Zhu, Ning Xi
2020 conf
ICIRA
Wenju Ye, Jingheng Chen, Yisheng Guan, Haifei Zhu
2019 conf
ROBIO
Rongzhen Xie, Manjia Su, Haifei Zhu, Yisheng Guan
2019 conf
ROBIO
Yu Zhong, Ziyang Fu, Manjia Su, Yisheng Guan, Haifei Zhu, Liqiang Zhong
2019 conf
ROBIO
Xiaopan Kang, Manjia Su, Yihong Zhang, Haifei Zhu, Yisheng Guan
2019 conf
ICIRA (1)
Yu Qiu, Chongming Xu, Manjia Su, Hongkai Chen, Yisheng Guan, Haifei Zhu
2019 conf
RCAR
Weiyang Liao, Shichao Gu, Yan Huang, Yisheng Guan, Jianyu Yang, Haifei Zhu
2019 conf
ROBIO
Guozhen Cai, Weilin Lin, Shangbiao Wei, Shichao Gu, Haifei Zhu, Yisheng Guan
2019 conf
ROBIO
Weilin Lin, Guozhen Cai, Shangbiao Wei, Shichao Gu, Haifei Zhu, Yisheng Guan
2019 conf
ROBIO
Junhao Li, Haifei Zhu, Qi Zhang, Yisheng Guan, Xiaoming Jiang
2018 conf
ROBIO
Yihui Li, Haifei Zhu, Yan Huang, Yijiong Lin, Xubin Lin, Yisheng Guan
2018 conf
ROBIO
Yihong Zhang, Manjia Su, Yisheng Guan, Haifei Zhu, Shixin Mao
2018 conf
ROBIO
Yijiong Lin, Yihui Li, Yan Huang, Kaifu Zhang, Haifei Zhu, Yansui Liu, Yisheng Guan
2018 conf
ROBIO
Bo Zhao, Haifei Zhu, Yu Zhong, Yisheng Guan
2018 conf
ROBIO
Huanle Chen, Jietao Chen, Jian Luo, Hao Zhang, Yisheng Guan, Haifei Zhu
2018 conf
ROBIO
Xiang Chen, Yisheng Guan, Wenju Ye, Yufeng Yang, Shichao Gu, Haifei Zhu
2018 J jnl
Ind. Robot
Xuefeng Zhou, Li Jiang, Yisheng Guan, Haifei Zhu, Dan Huang, Taobo Cheng, Hong Zhang
2018 conf
ROBIO
Shichao Gu, Haifei Zhu, Yisheng Guan, Hong Zhang
2018 A* conf
ICRA
Rongzhen Xie, Manjia Su, Yihong Zhang, Mingjun Li, Haifei Zhu, Yisheng Guan
2018 J jnl
Entropy
Li He, Haifei Zhu, Tao Zhang, Honghong Yang, Yisheng Guan
2018 J jnl
Robotics Auton. Syst.
Weinan Chen, Shichao Gu, Lei Zhu, Hong Zhang, Haifei Zhu, Yisheng Guan
2018 J jnl
IEEE Access
Li He, Chuangbin Chen, Tao Zhang, Haifei Zhu, Shaohua Wan
2017 conf
ROBIO
Mingjun Li, Manjia Su, Rongzhen Xie, Yihong Zhang, Haifei Zhu, Tao Zhang, Yisheng Guan
2017 conf
ROBIO
Shichao Gu, Manjia Su, Haifei Zhu, Yisheng Guan, Juan Rojas, Hong Zhang
2017 conf
ROBIO
Jihui Chen, Haifei Zhu, Zhaoheng Zeng, Jinglun Liang, Yisheng Guan
2017 conf
ROBIO
Yajun Liao, Haifei Zhu, Hongmin Wu, Guoying Zhang, Yisheng Guan
2016 A conf
IROS
Haifei Zhu, Yuan Yik Kok, Albert J. Causo, Keai Jiang Chee, Yuhua Zou, Sayyed Omar Kamal Al-Jufry, Conghui Liang, I-Ming Chen, Chien Chern Cheah, Huat Kin Low
2014 J jnl
Adv. Robotics
Haifei Zhu, Yisheng Guan, Wenqiang Wu, Xin Chen, Xuefeng Zhou, Hong Zhang
2014 J jnl
Int. J. Humanoid Robotics
Xuefeng Zhou, Yisheng Guan, Haifei Zhu, Wenqiang Wu, Xin Chen, Hong Zhang, Yuli Fu
2014 conf
ROBIO
Haifei Zhu, Yisheng Guan, Manjia Su, Chuanwu Cai, Huat Kin Low, Hong Zhang
2013 conf
ROBIO
Shengjun Chen, Haifei Zhu, Yisheng Guan, Pinhong Wu, Jie Hu, Xin Chen, Hong Zhang
2013 J jnl
Robotica
Xuefeng Zhou, Yisheng Guan, Li Jiang, Haifei Zhu, Chuanwu Cai, Wenqiang Wu, Hong Zhang
2013 conf
AIM
Wenqiang Wu, Yisheng Guan, Huaizhu Li, Manjia Su, Haifei Zhu, Xuefeng Zhou, Hong Zhang
2012 conf
ROBIO
Zhiqiang Bi, Yisheng Guan, Shizhong Chen, Haifei Zhu, Hong Zhang
2012 conf
ROBIO
Zhiguang Xiao, Wenqiang Wu, Junjun Wu, Haifei Zhu, Manjia Su, Huaizhu Li, Yisheng Guan
2012 conf
ROBIO
Wenqiang Wu, Yisheng Guan, Huaizhu Li, Haifei Zhu, Hong Zhang
2011 A* conf
ICRA
Yisheng Guan, Xuefeng Zhou, Haifei Zhu, Li Jiang, Chuanwu Cai, Xianmin Zhang, Hong Zhang
2011 A conf
IROS
Yisheng Guan, Li Jiang, Haifei Zhu, Xuefeng Zhou, Chuanwu Cai, Wenqiang Wu, Zhanchu Li, Hong Zhang, Xianmin Zhang
2011 conf
ROBIO
Haifei Zhu, Yisheng Guan, Wenqiang Wu, Xuefeng Zhou, Lianmeng Zhang, Xianmin Zhang, Hong Zhang
2011 conf
ROBIO
Haifei Zhu, Yisheng Guan, Wenqiang Wu, Xuefeng Zhou, Lianmeng Zhang, Xianmin Zhang, Hong Zhang
2010 conf
ROBIO
Xuefeng Zhou, Yisheng Guan, Chuanwu Cai, Li Jiang, Haifei Zhu, Xianmin Zhang
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