Odette Scharenborg

147 papers A 57B 2C 5Misc 12Journal 56Unranked 15
YearRankTypeTitle / Venue / Authors
2025 A ed.
INTERSPEECH
Odette Scharenborg, Catharine Oertel, Khiet Truong
2025 A conf
INTERSPEECH
Zhengjun Yue, Mara Barberis, Tanvina Patel, Judith Dineley, Willemijn Doedens, Lottie Stipdonk, Yuanyuan Zhang, Elke De Witte, Erfan Loweimi, Hugo Van hamme, Djaina Satoer, Marina B. Ruiter, Laureano Moro-Velázquez, Nicholas Cummins, Odette Scharenborg
2025 J jnl
CoRR
Tanvina Patel, Wiebke Hutiri, Aaron Yi Ding, Odette Scharenborg
2025 Misc conf
ICASSP
Dimme de Groot, Baturalp Karslioglu, Odette Scharenborg, J. Martinez
2025 J jnl
CoRR
Dimme de Groot, Baturalp Karslioglu, Odette Scharenborg, Jorge Martinez
2025 A conf
INTERSPEECH
Dimme de Groot, Tanvina Patel, Devendra Kayande, Odette Scharenborg, Zhengjun Yue
2025 J jnl
CoRR
Dimme de Groot, Tanvina Patel, Devendra Kayande, Odette Scharenborg, Zhengjun Yue
2025 A conf
INTERSPEECH
Ming Gao, Shilong Wu, Hang Chen, Jun Du, Chin-Hui Lee, Shinji Watanabe, Jingdong Chen, Sabato Marco Siniscalchi, Odette Scharenborg
2025 J jnl
CoRR
Ming Gao, Shilong Wu, Hang Chen, Jun Du, Chin-Hui Lee, Shinji Watanabe, Jingdong Chen, Sabato Marco Siniscalchi, Odette Scharenborg
2024 A conf
INTERSPEECH
Wiebke Hutiri, Tanvina Patel, Aaron Yi Ding, Odette Scharenborg
2024 J jnl
CoRR
Wiebke Hutiri, Tanvina Patel, Aaron Yi Ding, Odette Scharenborg
2024 conf
LREC/COLING
Maliha Jahan, Helin Wang, Thomas Thebaud, Yinglun Sun, Giang Ha Le, Zsuzsanna Fagyal, Odette Scharenborg, Mark Hasegawa-Johnson, Laureano Moro-Velázquez, Najim Dehak
2024 J jnl
CoRR
Luciana Ferrer, Odette Scharenborg, Tom Bäckström
2024 A conf
INTERSPEECH
Yuanyuan Zhang, Zhengjun Yue, Tanvina Patel, Odette Scharenborg
2024 J jnl
CoRR
Yuanyuan Zhang, Zhengjun Yue, Tanvina Patel, Odette Scharenborg
2024 A conf
INTERSPEECH
Kalvin Chang, Yi-Hui Chou, Jiatong Shi, Hsuan-Ming Chen, Nicole Holliday, Odette Scharenborg, David R. Mortensen
2024 J jnl
CoRR
Kalvin Chang, Yi-Hui Chou, Jiatong Shi, Hsuan-Ming Chen, Nicole Holliday, Odette Scharenborg, David R. Mortensen
2024 conf
ICASSP Workshops
Hang Chen, Shilong Wu, Chenxi Wang, Jun Du, Chin-Hui Lee, Sabato Marco Siniscalchi, Shinji Watanabe, Jingdong Chen, Odette Scharenborg, Zhong-Qiu Wang, Bao-Cai Yin, Jia Pan
2024 Misc conf
ICASSP
Shilong Wu, Chenxi Wang, Hang Chen, Yusheng Dai, Chenyue Zhang, Ruoyu Wang, Hongbo Lan, Jun Du, Chin-Hui Lee, Jingdong Chen, Sabato Marco Siniscalchi, Odette Scharenborg, Zhong-Qiu Wang, Jia Pan, Jianqing Gao
2024 J jnl
Comput. Speech Lang.
Siyuan Feng, Bence Mark Halpern, Olya Kudina, Odette Scharenborg
2024 A conf
INTERSPEECH
Chris Bras, Tanvina Patel, Odette Scharenborg
2023 J jnl
IEEE Trans. Multim.
Xinsheng Wang, Qicong Xie, Jihua Zhu, Lei Xie, Odette Scharenborg
2023 J jnl
Speech Commun.
Bence Mark Halpern, Siyuan Feng, Rob van Son, Michiel W. M. van den Brekel, Odette Scharenborg
2023 Misc conf
ICASSP
Bo Dekker, Alfred C. Schouten, Odette Scharenborg
2023 C conf
ASRU
Yuanyuan Zhang, Aaricia Herygers, Tanvina Patel, Zhengjun Yue, Odette Scharenborg
2023 A conf
AIED
Thomas Wilschut, Florian Sense, Odette Scharenborg, Hedderik van Rijn
2023 C conf
ASRU
Zhaofeng Lin, Tanvina Patel, Odette Scharenborg
2023 J jnl
CoRR
Zhaofeng Lin, Tanvina Patel, Odette Scharenborg
2023 J jnl
Cogn. Comput.
Danny Merkx, Sebastiaan Scholten, Stefan L. Frank, Mirjam Ernestus, Odette Scharenborg
2023 Misc conf
ICASSP
Hang Chen, Shilong Wu, Yusheng Dai, Zhe Wang, Jun Du, Chin-Hui Lee, Jingdong Chen, Shinji Watanabe, Sabato Marco Siniscalchi, Odette Scharenborg, Diyuan Liu, Bao-Cai Yin, Jia Pan, Jianqing Gao, Cong Liu
2023 J jnl
CoRR
Shilong Wu, Chenxi Wang, Hang Chen, Yusheng Dai, Chenyue Zhang, Ruoyu Wang, Hongbo Lan, Jun Du, Chin-Hui Lee, Jingdong Chen, Shinji Watanabe, Sabato Marco Siniscalchi, Odette Scharenborg, Zhong-Qiu Wang, Jia Pan, Jianqing Gao
2023 Misc conf
ICASSP
Zhe Wang, Shilong Wu, Hang Chen, Mao-Kui He, Jun Du, Chin-Hui Lee, Jingdong Chen, Shinji Watanabe, Sabato Marco Siniscalchi, Odette Scharenborg, Diyuan Liu, Baocai Yin, Jia Pan, Jianqing Gao, Cong Liu
2023 J jnl
CoRR
Zhe Wang, Shilong Wu, Hang Chen, Mao-Kui He, Jun Du, Chin-Hui Lee, Jingdong Chen, Shinji Watanabe, Sabato Marco Siniscalchi, Odette Scharenborg, Diyuan Liu, Baocai Yin, Jia Pan, Jianqing Gao, Cong Liu
2023 J jnl
CoRR
Tanvina Patel, Odette Scharenborg
2022 A conf
INTERSPEECH
Hang Chen, Jun Du, Yusheng Dai, Chin-Hui Lee, Sabato Marco Siniscalchi, Shinji Watanabe, Odette Scharenborg, Jingdong Chen, Baocai Yin, Jia Pan
2022 A conf
INTERSPEECH
Hengshun Zhou, Jun Du, Gongzhen Zou, Zhaoxu Nian, Chin-Hui Lee, Sabato Marco Siniscalchi, Shinji Watanabe, Odette Scharenborg, Jingdong Chen, Shifu Xiong, Jianqing Gao
2022 J jnl
CoRR
Piotr Zelasko, Siyuan Feng, Laureano Moro-Velázquez, Ali Abavisani, Saurabhchand Bhati, Odette Scharenborg, Mark Hasegawa-Johnson, Najim Dehak
2022 J jnl
Comput. Speech Lang.
Piotr Zelasko, Siyuan Feng, Laureano Moro-Velázquez, Ali Abavisani, Saurabhchand Bhati, Odette Scharenborg, Mark Hasegawa-Johnson, Najim Dehak
2022 J jnl
Speech Commun.
Bence Mark Halpern, Siyuan Feng, Rob van Son, Michiel W. M. van den Brekel, Odette Scharenborg
2022 J jnl
CoRR
Bence Mark Halpern, Teja Rebernik, Thomas Tienkamp, Rob van Son, Michiel W. M. van den Brekel, Martijn Wieling, Max J. H. Witjes, Odette Scharenborg
2022 A conf
INTERSPEECH
Yuanyuan Zhang, Yixuan Zhang, Bence Mark Halpern, Tanvina Patel, Odette Scharenborg
2022 J jnl
CoRR
Danny Merkx, Sebastiaan Scholten, Stefan L. Frank, Mirjam Ernestus, Odette Scharenborg
2022 J jnl
CoRR
Hang Ji, Tanvina Patel, Odette Scharenborg
2022 A conf
INTERSPEECH
Luke Prananta, Bence Mark Halpern, Siyuan Feng, Odette Scharenborg
2022 J jnl
CoRR
Luke Prananta, Bence Mark Halpern, Siyuan Feng, Odette Scharenborg
2022 Misc conf
ICASSP
Hang Chen, Hengshun Zhou, Jun Du, Chin-Hui Lee, Jingdong Chen, Shinji Watanabe, Sabato Marco Siniscalchi, Odette Scharenborg, Diyuan Liu, Bao-Cai Yin, Jia Pan, Jianqing Gao, Cong Liu
2022 J jnl
Cogn. Sci.
Themis Karaminis, Florian Hintz, Odette Scharenborg
2022 Misc conf
ICASSP
Wen-Chin Huang, Bence Mark Halpern, Lester Phillip Violeta, Odette Scharenborg, Tomoki Toda
2022 A conf
INTERSPEECH
Tanvina Patel, Odette Scharenborg
2021 A ed.
INTERSPEECH
Hynek Hermansky, Honza Cernocký, Lukás Burget, Lori Lamel, Odette Scharenborg, Petr Motlícek
2021 Misc conf
ICASSP
Liming Wang, Xinsheng Wang, Mark Hasegawa-Johnson, Odette Scharenborg, Najim Dehak
2021 conf
ITG Conference on Speech Communication
Bence Mark Halpern, Julian Fritsch, Enno Hermann, Rob van Son, Odette Scharenborg, Mathew Magimai-Doss
2021 J jnl
CoRR
Bence Mark Halpern, Julian Fritsch, Enno Hermann, Rob van Son, Odette Scharenborg, Mathew Magimai-Doss
2021 J jnl
CoRR
Xinsheng Wang, Qicong Xie, Jihua Zhu, Lei Xie, Odette Scharenborg
2021 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Xinsheng Wang, Tingting Qiao, Jihua Zhu, Alan Hanjalic, Odette Scharenborg
2021 Misc conf
ICASSP
Siyuan Feng, Piotr Zelasko, Laureano Moro-Velázquez, Ali Abavisani, Mark Hasegawa-Johnson, Odette Scharenborg, Najim Dehak
2021 C conf
ISCAS
Xinsheng Wang, Tian Tian, Jihua Zhu, Odette Scharenborg
2021 C conf
ISCAS
Sebastiaan Scholten, Danny Merkx, Odette Scharenborg
2021 conf
SSW
Marc Illa, Bence Mark Halpern, Rob van Son, Laureano Moro-Velázquez, Odette Scharenborg
2021 J jnl
CoRR
Marc Illa, Bence Mark Halpern, Rob van Son, Laureano Moro-Velázquez, Odette Scharenborg
2021 J jnl
CoRR
Siyuan Feng, Olya Kudina, Bence Mark Halpern, Odette Scharenborg
2021 Misc conf
ICASSP
Xinsheng Wang, Siyuan Feng, Jihua Zhu, Mark Hasegawa-Johnson, Odette Scharenborg
2021 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Xinsheng Wang, Justin van der Hout, Jihua Zhu, Mark Hasegawa-Johnson, Odette Scharenborg
2021 B conf
CogSci
Florian Hintz, Cesko Voeten, James M. McQueen, Odette Scharenborg
2021 J jnl
Speech Commun.
Polina Drozdova, Roeland van Hout, Sven L. Mattys, Odette Scharenborg
2021 conf
ACSCC
Siyuan Feng, Odette Scharenborg
2021 J jnl
CoRR
Wen-Chin Huang, Bence Mark Halpern, Lester Phillip Violeta, Odette Scharenborg, Tomoki Toda
2021 A conf
Interspeech
Siyuan Feng, Piotr Zelasko, Laureano Moro-Velázquez, Odette Scharenborg
2021 J jnl
CoRR
Siyuan Feng, Piotr Zelasko, Laureano Moro-Velázquez, Odette Scharenborg
2020 A conf
INTERSPEECH
Bence Mark Halpern, Rob van Son, Michiel W. M. van den Brekel, Odette Scharenborg
2020 J jnl
CoRR
Bence Mark Halpern, Rob van Son, Michiel W. M. van den Brekel, Odette Scharenborg
2020 A conf
INTERSPEECH
Justin van der Hout, Zoltán D'Haese, Mark Hasegawa-Johnson, Odette Scharenborg
2020 J jnl
CoRR
Justin van der Hout, Zoltán D'Haese, Mark Hasegawa-Johnson, Odette Scharenborg
2020 J jnl
CoRR
Siyuan Feng, Piotr Zelasko, Laureano Moro-Velázquez, Ali Abavisani, Mark Hasegawa-Johnson, Odette Scharenborg, Najim Dehak
2020 J jnl
CoRR
Sebastiaan Scholten, Danny Merkx, Odette Scharenborg
2020 conf
MediaEval
Xinsheng Wang, Jihua Zhu, Odette Scharenborg
2020 A conf
INTERSPEECH
Xinsheng Wang, Tingting Qiao, Jihua Zhu, Alan Hanjalic, Odette Scharenborg
2020 J jnl
CoRR
Xinsheng Wang, Tingting Qiao, Jihua Zhu, Alan Hanjalic, Odette Scharenborg
2020 J jnl
CoRR
Xinsheng Wang, Siyuan Feng, Jihua Zhu, Mark Hasegawa-Johnson, Odette Scharenborg
2020 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Odette Scharenborg, Lucas Ondel, Shruti Palaskar, Philip Arthur, Francesco Ciannella, Mingxing Du, Elin Larsen, Danny Merkx, Rachid Riad, Liming Wang, Emmanuel Dupoux, Laurent Besacier, Alan W. Black, Mark Hasegawa-Johnson, Florian Metze, Graham Neubig, Sebastian Stüker, Pierre Godard, Markus Müller
2020 A conf
INTERSPEECH
Piotr Zelasko, Laureano Moro-Velázquez, Mark Hasegawa-Johnson, Odette Scharenborg, Najim Dehak
2020 J jnl
CoRR
Piotr Zelasko, Laureano Moro-Velázquez, Mark Hasegawa-Johnson, Odette Scharenborg, Najim Dehak
2020 J jnl
CoRR
Si Ioi Ng, Wei Liu, Zhiyuan Peng, Siyuan Feng, Hing-Pang Huang, Odette Scharenborg, Tan Lee
2020 J jnl
CoRR
Siyuan Feng, Odette Scharenborg
2020 A conf
INTERSPEECH
Siyuan Feng, Odette Scharenborg
2020 J jnl
CoRR
Siyuan Feng, Odette Scharenborg
2019 conf
IWSDS
Odette Scharenborg, Mark Hasegawa-Johnson
2019 A conf
INTERSPEECH
Laureano Moro-Velázquez, Jaejin Cho, Shinji Watanabe, Mark A. Hasegawa-Johnson, Odette Scharenborg, Heejin Kim, Najim Dehak
2019 A conf
INTERSPEECH
Odette Scharenborg
2019 A conf
INTERSPEECH
Odette Scharenborg, Jiska Koemans, Cybelle Smith, Mark A. Hasegawa-Johnson, Kara D. Federmeier
2019 conf
SPECOM
Odette Scharenborg
2019 conf
MMM (2)
Odette Scharenborg, Nikki van der Gouw, Martha A. Larson, Elena Marchiori
2019 conf
SLSP
Junrui Ni, Mark Hasegawa-Johnson, Odette Scharenborg
2019 J jnl
Speech Commun.
Odette Scharenborg, Marjolein van Os
2018 A conf
INTERSPEECH
Danny Merkx, Odette Scharenborg
2018 Misc conf
ICASSP
Lucas Ondel, Pierre Godard, Laurent Besacier, Elin Larsen, Mark Hasegawa-Johnson, Odette Scharenborg, Emmanuel Dupoux, Lukás Burget, François Yvon, Sanjeev Khudanpur
2018 J jnl
CoRR
Lucas Ondel, Pierre Godard, Laurent Besacier, Elin Larsen, Mark Hasegawa-Johnson, Odette Scharenborg, Emmanuel Dupoux, Lukás Burget, François Yvon, Sanjeev Khudanpur
2018 conf
SLTU
Odette Scharenborg, Patrick Ebel, Mark Hasegawa-Johnson, Najim Dehak
2018 J jnl
CoRR
Odette Scharenborg, Martha A. Larson
2018 Misc conf
ICASSP
Odette Scharenborg, Laurent Besacier, Alan W. Black, Mark Hasegawa-Johnson, Florian Metze, Graham Neubig, Sebastian Stüker, Pierre Godard, Markus Müller, Lucas Ondel, Shruti Palaskar, Philip Arthur, Francesco Ciannella, Mingxing Du, Elin Larsen, Danny Merkx, Rachid Riad, Liming Wang, Emmanuel Dupoux
2018 J jnl
CoRR
Odette Scharenborg, Laurent Besacier, Alan W. Black, Mark Hasegawa-Johnson, Florian Metze, Graham Neubig, Sebastian Stüker, Pierre Godard, Markus Müller, Lucas Ondel, Shruti Palaskar, Philip Arthur, Francesco Ciannella, Mingxing Du, Elin Larsen, Danny Merkx, Rachid Riad, Liming Wang, Emmanuel Dupoux
2018 A conf
INTERSPEECH
Odette Scharenborg, Martha A. Larson
2018 B conf
CogSci
Themis Karaminis, Odette Scharenborg
2018 A conf
INTERSPEECH
Odette Scharenborg, Sebastian Tiesmeyer, Mark Hasegawa-Johnson, Najim Dehak
2016 A conf
INTERSPEECH
Odette Scharenborg, Juul Coumans, Sofoklis Kakouros, Roeland van Hout
2016 A conf
INTERSPEECH
Polina Drozdova, Roeland van Hout, Odette Scharenborg
2016 A conf
INTERSPEECH
Florian Hintz, Odette Scharenborg
2016 A conf
INTERSPEECH
Odette Scharenborg, Elea Kolkman, Sofoklis Kakouros, Brechtje Post
2015 A conf
INTERSPEECH
Odette Scharenborg
2015 conf
ICPhS
Juliane Schmidt, Odette Scharenborg, Esther Janse
2015 conf
ICPhS
Polina Drozdova, Roeland van Hout, Odette Scharenborg
2014 A conf
INTERSPEECH
Juliane Schmidt, Esther Janse, Odette Scharenborg
2014 A conf
INTERSPEECH
Odette Scharenborg, Eric Sanders, Bert Cranen
2014 A conf
INTERSPEECH
Juul Coumans, Roeland van Hout, Odette Scharenborg
2014 A conf
INTERSPEECH
Polina Drozdova, Roeland van Hout, Odette Scharenborg
2013 A conf
INTERSPEECH
Odette Scharenborg, Esther Janse
2012 A conf
INTERSPEECH
Odette Scharenborg, Marijt J. Witteman, Andrea Weber
2012 A conf
INTERSPEECH
Odette Scharenborg, Esther Janse
2012 A conf
INTERSPEECH
Louis ten Bosch, Odette Scharenborg
2012 A conf
INTERSPEECH
Odette Scharenborg, Esther Janse, Andrea Weber
2011 J jnl
J. Phonetics
Barbara Schuppler, Mirjam Ernestus, Odette Scharenborg, Lou Boves
2011 A conf
INTERSPEECH
Odette Scharenborg, Holger Mitterer, James M. McQueen
2010 J jnl
Speech Commun.
Martin Cooke, María Luisa García Lecumberri, Odette Scharenborg, Wim A. van Dommelen
2010 J jnl
Speech Commun.
Mirjam Broersma, Odette Scharenborg
2009 A conf
INTERSPEECH
Odette Scharenborg, Stefanie Okolowski
2009 A conf
INTERSPEECH
Odette Scharenborg
2009 C conf
ASRU
Barbara Schuppler, Joost van Doremalen, Odette Scharenborg, Bert Cranen, Lou Boves
2008 A conf
INTERSPEECH
Odette Scharenborg
2008 A conf
INTERSPEECH
Barbara Schuppler, Mirjam Ernestus, Odette Scharenborg, Lou Boves
2008 A conf
INTERSPEECH
Martin Cooke, Odette Scharenborg
2008 A conf
INTERSPEECH
María Luisa García Lecumberri, Martin Cooke, Francesco Cutugno, Mircea Giurgiu, Bernd T. Meyer, Odette Scharenborg, Wim A. van Dommelen, Jan Volín
2007 J jnl
Comput. Speech Lang.
Odette Scharenborg, Louis ten Bosch, Lou Boves
2007 J jnl
Comput. Speech Lang.
Odette Scharenborg, Stephanie Seneff, Lou Boves
2007 A conf
INTERSPEECH
Odette Scharenborg, Vincent Wan
2007 conf
ICASSP (4)
Yago Pereiro-Estevan, Vincent Wan, Odette Scharenborg
2007 J jnl
Speech Commun.
Odette Scharenborg
2007 A conf
INTERSPEECH
Odette Scharenborg, Mirjam Ernestus, Vincent Wan
2007 J jnl
Speech Commun.
Odette Scharenborg, Vincent Wan, Roger K. Moore
2006 conf
ICASSP (1)
Louis ten Bosch, Annika Hämäläinen, Odette Scharenborg, Lou Boves
2005 A conf
INTERSPEECH
Louis ten Bosch, Odette Scharenborg
2005 J jnl
Cogn. Sci.
Odette Scharenborg, Dennis Norris, Louis ten Bosch, James M. McQueen
2005 A conf
INTERSPEECH
Odette Scharenborg
2005 A conf
INTERSPEECH
Odette Scharenborg, Stephanie Seneff
2003 A conf
INTERSPEECH
Odette Scharenborg, James M. McQueen, Louis ten Bosch, Dennis Norris
2003 A conf
INTERSPEECH
Odette Scharenborg, Louis ten Bosch, Lou Boves
2002 A conf
INTERSPEECH
Odette Scharenborg, Lou Boves, Johan de Veth
2001 A conf
INTERSPEECH
Odette Scharenborg, Janienke Sturm, Lou Boves
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