Raghvendra Mall

60 papers B 9C 2Misc 3Journal 24Unranked 20
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Amit Kumar, Maninder Kaur, Raghvendra Mall, Sukrit Gupta
2025 conf
MCHM@MM
Maninder Kaur, Amit Kumar, Michele Ceccarelli, Raghvendra Mall, Sukrit Gupta
2024 conf
BIBM
Hamda Alhosani, Raghvendra Mall, Ankita Singh, Filippo Castiglione
2024 J jnl
CoRR
Étienne Goffinet, Raghvendra Mall, Ankita Singh, Rahul Kaushik, Filippo Castiglione
2024 J jnl
Briefings Bioinform.
Raghvendra Mall, Ankita Singh, Chirag N. Patel, Gregory Guirimand, Filippo Castiglione
2023 J jnl
Frontiers Artif. Intell.
Thomas Hartung, Jun Deng, Raghvendra Mall, Alejandro F. Frangi, Frank Emmert-Streib, Tuan D. Pham
2021 J jnl
Bioinform.
Raghvendra Mall, Abdurrahman Elbasir, Hossam Almeer, Zeyaul Islam, Prasanna R. Kolatkar, Sanjay Chawla, Ehsan Ullah
2021 J jnl
Mach. Learn. Sci. Technol.
Heesoo Park, Adnan Ali, Raghvendra Mall, Halima Bensmail, Stefano Sanvito, Fedwa El-Mellouhi
2021 J jnl
Briefings Bioinform.
Raghvendra Mall, Mohamad Saad, Jessica Roelands, Darawan Rinchai, Khalid Kunji, Hossam Almeer, Wouter Hendrickx, Francesco M. Marincola, Michele Ceccarelli, Davide Bedognetti
2021 J jnl
CoRR
Raghvendra Mall, Shameem Ahamed Puthiya Parambath, Han Yufei, Ting Yu, Sanjay Chawla
2020 J jnl
Bioinform.
Abdurrahman Elbasir, Raghvendra Mall, Khalid Kunji, Reda Rawi, Zeyaul Islam, Gwo-Yu Chuang, Prasanna R. Kolatkar, Halima Bensmail
2020 Misc conf
NordiCHI
Raghvendra Mall, Mridul Nagpal, Joni Salminen, Hind A. Al-Merekhi, Soon-Gyo Jung, Bernard J. Jansen
2020 J jnl
npj Digit. Medicine
Ignacio Perez-Pozuelo, Bing Zhai, João R. M. Palotti, Raghvendra Mall, Michaël Aupetit, Juan Miguel García-Gómez, Shahrad Taheri, Yu Guan, Luis Fernández-Luque
2019 J jnl
npj Digit. Medicine
João R. M. Palotti, Raghvendra Mall, Michaël Aupetit, Michael Rueschman, Meghna Singh, Aarti Sathyanarayana, Shahrad Taheri, Luis Fernández-Luque
2019 J jnl
Bioinform.
Abdurrahman Elbasir, Balasubramanian Moovarkumudalvan, Khalid Kunji, Prasanna R. Kolatkar, Raghvendra Mall, Halima Bensmail
2018 J jnl
F1000Research
Raghvendra Mall, Ehsan Ullah, Khalid Kunji, Michele Ceccarelli, Halima Bensmail
2018 conf
BIBM
Abdurrahman Elbasir, Balasubramanian Moovarkumudalvan, Khalid Kunji, Prasanna R. Kolatkar, Halima Bensmail, Raghvendra Mall
2018 J jnl
Bioinform.
Sameer Khurana, Reda Rawi, Khalid Kunji, Gwo-Yu Chuang, Halima Bensmail, Raghvendra Mall
2018 conf
IWBBIO (1)
Hossam Al Meer, Raghvendra Mall, Ehsan Ullah, Nasreddine Megrez, Halima Bensmail
2018 J jnl
Bioinform.
Reda Rawi, Raghvendra Mall, Khalid Kunji, Chen-Hsiang Shen, Peter D. Kwong, Gwo-Yu Chuang
2017 conf
BIBM
Raghvendra Mall, Ehsan Ullah, Khalid Kunji, Halima Bensmail, Michele Ceccarelli
2017 J jnl
BMC Syst. Biol.
Raghvendra Mall, Luigi Cerulo, Halima Bensmail, Antonio Iavarone, Michele Ceccarelli
2017 conf
BCB
Raghvendra Mall, Ehsan Ullah, Khalid Kunji, Fulvio D'Angelo, Halima Bensmail, Michele Ceccarelli
2017 conf
BIBM
Ehsan Ullah, Raghvendra Mall, Halima Bensmail, Reda Rawi, Saila Shama, Nooral Al Muftah, Ian Richard Thmpson
2016 J jnl
BMC Bioinform.
Reda Rawi, Raghvendra Mall, Khalid Kunji, Mohammed El Anbari, Michaël Aupetit, Ehsan Ullah, Halima Bensmail
2016 B conf
IJCNN
Raghvendra Mall, Halima Bensmail, Rocco Langone, Carolina Varon, Johan A. K. Suykens
2016 B conf
ESANN
Rocco Langone, Raghvendra Mall, Vilen Jumutc, Johan A. K. Suykens
2016 conf
DEXA Workshops
Raghvendra Mall, Laure Berti-Équille, Halima Bensmail
2016 conf
BCB
Ehsan Ullah, Raghvendra Mall, Reda Rawi, Halima Bensmail
2015 conf
SSCI
Mandar Chandorkar, Raghvendra Mall, Oliver Lauwers, Johan A. K. Suykens, Bart De Moor
2015 B conf
IJCNN
Siamak Mehrkanoon, Oscar Mauricio Agudelo, Raghvendra Mall, Johan A. K. Suykens
2015 J jnl
Pattern Recognit. Lett.
Raghvendra Mall, Siamak Mehrkanoon, Johan A. K. Suykens
2015 ch.
Big Data - Algorithms, Analytics, and Applications
Raghvendra Mall, Johan A. K. Suykens
2015 J jnl
CoRR
Rocco Langone, Raghvendra Mall, Carlos Alzate, Johan A. K. Suykens
2015 B conf
IJCNN
Raghvendra Mall, Johan A. K. Suykens
2015 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Siamak Mehrkanoon, Carlos Alzate, Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2015 B conf
ESANN
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2015
Raghvendra Mall
2015 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Raghvendra Mall, Johan A. K. Suykens
2014 B conf
ESANN
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2014 C conf
CIDM
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2014 C conf
CIDM
Rocco Langone, Raghvendra Mall, Johan A. K. Suykens
2014 J jnl
CoRR
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2014 B conf
IJCNN
Raghvendra Mall, Siamak Mehrkanoon, Rocco Langone, Johan A. K. Suykens
2014 conf
IEEE BigData
Raghvendra Mall, Vilen Jumutc, Rocco Langone, Johan A. K. Suykens
2013 J jnl
Soc. Netw. Anal. Min.
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2013 conf
PReMI
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2013 J jnl
Entropy
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2013 Misc conf
COMAD
Raghvendra Mall, Johan A. K. Suykens, Mohammed El Anbari, Halima Bensmail
2013 conf
IEEE BigData
Raghvendra Mall, Rocco Langone, Johan A. K. Suykens
2013 B conf
IJCNN
Rocco Langone, Raghvendra Mall, Johan A. K. Suykens
2013 conf
PAKDD (1)
Raghvendra Mall, Johan A. K. Suykens
2011 conf
PAKDD Workshops
Jean-Charles Lamirel, Pascal Cuxac, Raghvendra Mall, Ghada Safi
2011 conf
WSOM
Jean-Charles Lamirel, Raghvendra Mall, Shadi Al Shehabi, Ghada Safi
2011 conf
IEA/AIE (1)
Jean-Charles Lamirel, Raghvendra Mall, Mumtaz Ahmad
2011 conf
KDIR
Raghvendra Mall, Nahil Jain, Vikram Pudi
2011 B conf
IJCNN
Jean-Charles Lamirel, Raghvendra Mall, Pascal Cuxac, Ghada Safi
2010 conf
ICTAI (1)
Raghvendra Mall, Prakhar Jain, Vikram Pudi
2010 conf
IEEE ICCI
Raghvendra Mall, Prakhar Jain, Vikram Pudi, Bipin Indurkhya
2009 Misc conf
COMAD
Raghvendra Mall, Neeraj Bagdia, Vikram Pudi
tests/unit/test_database_exporters.py
← Index tests/unit/test_database_exporters.py python
"""
Unit tests for database exporters.
"""
import pytest
import json
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.unit, pytest.mark.exporters]


# ============================================================================
# Sample Dataclass for Testing
# ============================================================================

@dataclass
class SampleData:
    """Sample dataclass for export testing."""
    sha256: str = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    name: str = "test_sample"
    value: int = 42
    _id: str = "test_id"


# ============================================================================
# PrintExporter Tests
# ============================================================================

class TestPrintExporter:
    """Tests for PrintExporter class."""

    def test_initialization(self, mock_logger):
        """Test PrintExporter initialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger

    def test_export_dataclass(self, mock_logger, capsys):
        """Test exporting a dataclass."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        sample = SampleData()

        result = exporter.export(sample)

        assert result is True
        captured = capsys.readouterr()
        assert "test_sample" in captured.out

    def test_export_list_of_dataclasses(self, mock_logger, capsys):
        """Test exporting a list of dataclasses."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        samples = [SampleData(name="sample1"), SampleData(name="sample2")]

        result = exporter.export(samples)

        assert result is True
        captured = capsys.readouterr()
        assert "sample1" in captured.out
        assert "sample2" in captured.out

    def test_export_dict(self, mock_logger, capsys):
        """Test exporting a dictionary."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {"key": "value", "number": 42}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "key" in captured.out
        assert "value" in captured.out

    def test_export_none(self, mock_logger):
        """Test exporting None."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export(None)

        assert result is True

    def test_export_empty_list(self, mock_logger):
        """Test exporting empty list."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export([])

        assert result is True


# ============================================================================
# ElasticsearchExporter Tests
# ============================================================================

class TestElasticsearchExporter:
    """Tests for ElasticsearchExporter class."""

    def test_initialization(self, mock_logger):
        """Test ElasticsearchExporter initialization."""
        with patch('redb.settings.get_elasticsearch_client') as mock_client:
            mock_client.return_value = Mock()
            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")

            assert exporter.index_prefix == "test_index"
            assert exporter.log is mock_logger
            assert exporter.client is not None

    def test_export_dataclass(self, mock_logger):
        """Test exporting a dataclass to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True
            mock_client.index.assert_called()

    def test_export_list(self, mock_logger):
        """Test exporting a list to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            samples = [SampleData(name="sample1"), SampleData(name="sample2")]

            result = exporter.export(
                samples,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": "test_hash"}
            )

            assert result is True
            # Should be called twice (once per sample)
            assert mock_client.index.call_count == 2

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_client.index.side_effect = Exception("Connection failed")
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is False
            mock_logger.error.assert_called()

    def test_export_with_custom_id(self, mock_logger):
        """Test exporting with custom _id field."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData(_id="custom_id")

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True


# ============================================================================
# ClickHouseExporter Tests
# ============================================================================

class TestClickHouseExporter:
    """Tests for ClickHouseExporter class."""

    def test_initialization(self, mock_logger):
        """Test ClickHouseExporter initialization."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger
        assert exporter.client is mock_client

    def test_export_tuple_data(self, mock_logger):
        """Test exporting tuple data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is True

    def test_export_multi_table(self, mock_logger):
        """Test exporting multi-table data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table1',
                    'data': [["hash123", "sample.exe"]],
                    'column_names': ["sha256", "name"],
                    'column_type_names': ["String", "String"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.side_effect = Exception("Connection failed")
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is False

    def test_export_missing_table(self, mock_logger):
        """Test export without table name raises error."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names)
                # Missing table parameter
            )

            assert result is False

    def test_get_client(self, mock_logger):
        """Test get_client method."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        result = exporter.get_client()

        assert result is mock_client

    def test_get_client_creates_new(self, mock_logger):
        """Test get_client creates new client if none exists."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_new_client = Mock()
            mock_create.return_value = mock_new_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            result = exporter.get_client()

            assert result is mock_new_client


# ============================================================================
# DatabaseExporter Abstract Base Class Tests
# ============================================================================

class TestDatabaseExporter:
    """Tests for DatabaseExporter abstract base class."""

    def test_cannot_instantiate_abstract(self):
        """Test that DatabaseExporter cannot be instantiated directly."""
        from redb.extractors.database_exporters import DatabaseExporter

        with pytest.raises(TypeError):
            DatabaseExporter()

    def test_subclass_must_implement_export(self):
        """Test that subclasses must implement export method."""
        from redb.extractors.database_exporters import DatabaseExporter

        # Define incomplete subclass
        class IncompleteExporter(DatabaseExporter):
            pass

        with pytest.raises(TypeError):
            IncompleteExporter()


# ============================================================================
# Null/Edge Case Tests
# ============================================================================

class TestExporterEdgeCases:
    """Tests for edge cases in exporters."""

    def test_print_exporter_with_complex_nested_data(self, mock_logger, capsys):
        """Test PrintExporter with complex nested data."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {
            "level1": {
                "level2": {
                    "level3": [1, 2, 3]
                }
            },
            "array": [{"a": 1}, {"b": 2}]
        }

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "level1" in captured.out

    def test_clickhouse_null_handling(self, mock_logger):
        """Test ClickHouse exporter handles null values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            # Multi-table data with null values
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [[None, "sample.exe", None]],
                    'column_names': ["sha256", "name", "size"],
                    'column_type_names': ["Nullable(String)", "String", "Nullable(UInt64)"]
                }
            }

            result = exporter.export(data)

            # Should handle nulls appropriately
            assert result is True

    def test_clickhouse_array_handling(self, mock_logger):
        """Test ClickHouse exporter handles array types."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", ["tag1", "tag2"]]],
                    'column_names': ["sha256", "tags"],
                    'column_type_names': ["String", "Array(String)"]
                }
            }

            result = exporter.export(data)

            assert result is True


# ============================================================================
# Type Conversion Tests
# ============================================================================

class TestExporterTypeConversions:
    """Tests for type conversions in exporters."""

    def test_clickhouse_datetime_handling(self, mock_logger):
        """Test ClickHouse exporter handles datetime values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            now = datetime.now(timezone.utc)
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", now]],
                    'column_names': ["sha256", "timestamp"],
                    'column_type_names': ["String", "DateTime64(3, 'UTC')"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_print_exporter_datetime_serialization(self, mock_logger, capsys):
        """Test PrintExporter handles datetime serialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        now = datetime.now(timezone.utc)
        data = {"timestamp": now, "name": "test"}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "timestamp" in captured.out


# ============================================================================
# Connection Context Manager Tests
# ============================================================================

class TestClickHouseConnectionManager:
    """Tests for ClickHouse connection context manager."""

    def test_clickhouse_connection_context(self, mock_logger):
        """Test clickhouse_connection context manager."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            with exporter.clickhouse_connection() as client:
                assert client is mock_client

            # Client should be closed after context exits
            mock_client.close.assert_called()

    def test_clickhouse_connection_close_on_error(self, mock_logger):
        """Test client is closed even if operation fails."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            try:
                with exporter.clickhouse_connection() as client:
                    raise ValueError("Test error")
            except ValueError:
                pass

            # Client should still be closed
            mock_client.close.assert_called()