Wei Ding

167 papers A* 25A 6B 15C 9Misc 1Journal 67Unranked 37
YearRankTypeTitle / Venue / Authors
2026 ed.
DASFAA (2)
Feida Zhu, Philip S. Yu, Akiyo Nadamoto, Ee-Peng Lim, Kyuseok Shim, Wei Ding, Bingxue Zhang
2026 ed.
DASFAA (3)
Feida Zhu, Philip S. Yu, Akiyo Nadamoto, Ee-Peng Lim, Kyuseok Shim, Wei Ding, Bingxue Zhang
2026 ed.
DASFAA (5)
Feida Zhu, Philip S. Yu, Akiyo Nadamoto, Ee-Peng Li, Kyuseok Shim, Wei Ding, Bingxue Zhang
2026 ed.
DASFAA (6)
Feida Zhu, Philip S. Yu, Akiyo Nadamoto, Ee-Peng Lim, Kyuseok Shim, Wei Ding, Bingxue Zhang
2025 B conf
IEEE Big Data
Zhen Lu, Chengjie Zheng, Iris Shen, John Quackenbush, Viola Fanfani, Wei Ding, Ping Chen
2025 J jnl
ACM Trans. Intell. Syst. Technol.
Yong Zhuang, Matthew Almeida, Wei Ding, Shafiqul Islam, Zihan Li, Ping Chen
2025 conf
PAKDD (2)
Yong Zhuang, Tianyu Kang, Zhen Lu, Wei Ding, Ping Chen
2025 conf
KDD (2)
Peipei Ping, Wei Ding, Carl Yang
2025 J jnl
CoRR
Andrew Tran, Chris Bowes, David Brown, Ping Chen, Max Choly, Wei Ding
2024 conf
PAKDD (6)
Zihan Li, Wei Ding, Inal Mashukov, Scott E. Crouter, Ping Chen
2024 A conf
ICME
Haonan Lin, Wenbin An, Yan Chen, Feng Tian, Yuzhe Yao, Wei Ding, Qianying Wang, Ping Chen
2024 J jnl
Neural Networks
Tianyu Kang, Wei Ding, Ping Chen
2024 B ed.
IEEE Big Data
Wei Ding, Chang-Tien Lu, Fusheng Wang, Liping Di, Kesheng Wu, Jun Huan, Raghu Nambiar, Jundong Li, Filip Ilievski, Ricardo Baeza-Yates, Xiaohua Hu
2024 A* conf
KDD
Wei Ding, Gustau Camps-Valls
2024 J jnl
IEEE Trans. Cybern.
Wei Li, Wei Liu, Jinlin Chen, Libing Wu, Patrick D. Flynn, Wei Ding, Ping Chen
2023 J jnl
IEEE Data Eng. Bull.
Zhifeng Bao, Panagiotis Bouros, Reynold Cheng, Byron Choi, Anton Dignös, Wei Ding, Yixiang Fang, Boyang Han, Jilin Hu, Arijit Khan, Wenqing Lin, Xuemin Lin, Cheng Long, Nikos Mamoulis, Jian Pei, Matthias Renz, Shashi Shekhar, Jieming Shi, Eleni Tzirita Zacharatou, Sibo Wang, Xiao Wang, Xue Wang, Raymond Chi-Wing Wong, Da Yan, Xifeng Yan, Bin Yang, Dezhong Yao, Ce Zhang, Peilin Zhao, Rong Zhu
2023 B conf
IEEE Big Data
Yong Zhuang, David L. Small, Patrick D. Flynn, Wahid Palash, Shafiqul Islam, Ping Chen, Wei Ding
2023 A* conf
AAAI
Wenbin An, Feng Tian, Qinghua Zheng, Wei Ding, Qianying Wang, Ping Chen
2023 J jnl
IEEE Intell. Syst.
Wenbin An, Feng Tian, Ping Chen, Qinghua Zheng, Wei Ding
2022 J jnl
ACM Trans. Knowl. Discov. Data
Kui Yu, Yajing Yang, Wei Ding
2022 J jnl
Artif. Intell. Medicine
Olga Andreeva, Wei Ding, Suzanne G. Leveille, Yurun Cai, Ping Chen
2022 J jnl
CoRR
Wenbin An, Feng Tian, Qinghua Zheng, Wei Ding, Qianying Wang, Ping Chen
2022 J jnl
IEEE Intell. Syst.
Olga Andreeva, Matthew Almeida, Wei Ding, Scott E. Crouter, Ping Chen
2022 J jnl
ACM Trans. Comput. Heal.
Kevin Amaral, Zihan Li, Wei Ding, Scott E. Crouter, Ping Chen
2022 A* conf
ICDM
Yong Zhuang, Matthew Almeida, Wei Ding, Patrick D. Flynn, Shafiqul Islam, Ping Chen
2021 J jnl
ACM Trans. Knowl. Discov. Data
Matthew Almeida, Yong Zhuang, Wei Ding, Scott E. Crouter, Ping Chen
2020 A* conf
KDD
Tianyu Kang, Ping Chen, John Quackenbush, Wei Ding
2020 A* conf
KDD
Olga Andreeva, Wei Li, Wei Ding, Marieke L. Kuijjer, John Quackenbush, Ping Chen
2020 J jnl
IEEE Access
Jipeng Qiang, Wei Ding, Marieke L. Kuijjer, John Quackenbush, Ping Chen
2020 J jnl
Data Min. Knowl. Discov.
Shima Imani, Frank Madrid, Wei Ding, Scott E. Crouter, Eamonn J. Keogh
2020 J jnl
CoRR
Matthew Almeida, Wei Ding, Scott E. Crouter, Ping Chen
2020 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Kui Yu, Lin Liu, Jiuyong Li, Wei Ding, Thuc Duy Le
2020 J jnl
CoRR
Kevin Michael Amaral, Zihan Li, Wei Ding, Scott E. Crouter, Ping Chen
2019 J jnl
ACM Trans. Intell. Syst. Technol.
Zhaolong Ling, Kui Yu, Hao Wang, Lin Liu, Wei Ding, Xindong Wu
2019 J jnl
Data Min. Knowl. Discov.
Shaghayegh Gharghabi, Chin-Chia Michael Yeh, Yifei Ding, Wei Ding, Paul Hibbing, Samuel LaMunion, Andrew Kaplan, Scott E. Crouter, Eamonn J. Keogh
2019 J jnl
Data Min. Knowl. Discov.
Shaghayegh Gharghabi, Chin-Chia Michael Yeh, Yifei Ding, Wei Ding, Paul Hibbing, Samuel LaMunion, Andrew Kaplan, Scott E. Crouter, Eamonn J. Keogh
2019 J jnl
ACM Trans. Knowl. Discov. Data
Jipeng Qiang, Ping Chen, Wei Ding, Tong Wang, Fei Xie, Xindong Wu
2019 J jnl
Neural Networks
Wei Li, Wei Ding, Rajani S. Sadasivam, Xiaohui Cui, Ping Chen
2018 A* conf
AAAI
Ping Chen, Fei Wu, Tong Wang, Wei Ding
2018 A* conf
ICDM
Tianyu Kang, Kourosh Zarringhalam, Marieke L. Kuijjer, Ping Chen, John Quackenbush, Wei Ding
2018 conf
ICBK
Yong Zhuang, David L. Small, Xin Shu, Kui Yu, Shafiqul Islam, Wei Ding
2018 conf
ICBK
Shima Imani, Frank Madrid, Wei Ding, Scott E. Crouter, Eamonn J. Keogh
2018 conf
ICBK
Zihan Li, Wei Ding, Kui Yu, Suzanne G. Leveille, Pin Chen
2017 J jnl
BMC Bioinform.
Tianyu Kang, Wei Ding, Luoyan Zhang, Daniel Ziemek, Kourosh Zarringhalam
2017 conf
ICBK
Yong Zhuang, Matthew Almeida, Melissa Morabito, Wei Ding
2017 J jnl
Appl. Intell.
Hamidreza Mohebbi, Yang Mu, Wei Ding
2017 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Kui Yu, Xindong Wu, Wei Ding, Yang Mu, Hao Wang
2017 J jnl
CoRR
Jipeng Qiang, Wei Ding, John Quackenbush, Ping Chen
2016 conf
AMCIS
Jingwei Li, Wei Ding, Hsing Cheng, Ping Chen, Dehai Di, Wei Huang
2016 J jnl
Appl. Intell.
Xiang Ren, Wei Ding, Scott E. Crouter, Yang Mu, Rong Xie
2016 conf
ICNSC
Yong Zhuang, Kui Yu, Dawei Wang, Wei Ding
2016 J jnl
CoRR
Joseph Paul Cohen, Henry Z. Lo, Tingting Lu, Wei Ding
2016 J jnl
IEEE Trans. Knowl. Data Eng.
Chung-Hsien Yu, Wei Ding, Melissa Morabito, Ping Chen
2016 J jnl
Knowl. Based Syst.
Kui Yu, Wei Ding, Xindong Wu
2016 J jnl
CoRR
Kui Yu, Wei Ding, Xindong Wu
2016 J jnl
Knowl. Based Syst.
Jipeng Qiang, Ping Chen, Wei Ding, Fei Xie, Xindong Wu
2016 J jnl
IEEE Trans. Knowl. Data Eng.
Qin Zhang, Peng Zhang, Guodong Long, Wei Ding, Chengqi Zhang, Xindong Wu
2016 J jnl
CoRR
Joseph Paul Cohen, Henry Z. Lo, Wei Ding
2016 J jnl
Appl. Intell.
Joseph Paul Cohen, Wei Ding, Caitlin Kuhlman, Aijun Chen, Liping Di
2016 J jnl
CoRR
Joseph Paul Cohen, Wei Ding, Caitlin Kuhlman, Aijun Chen, Liping Di
2016 conf
ICDM Workshops
Kevin Michael Amaral, Ping Chen, Wei Ding, Rajani S. Sadasivam
2016 J jnl
ACM Trans. Knowl. Discov. Data
Kui Yu, Xindong Wu, Wei Ding, Jian Pei
2016 J jnl
CoRR
Henry Z. Lo, Kevin Amaral, Wei Ding
2016 B conf
ICTAI
Jipeng Qiang, Ping Chen, Wei Ding, Tong Wang, Fei Xie, Xindong Wu
2015 C conf
ICDS
Zhou Zhang, Yuewen Liu, Wei Ding, Wayne Wei Huang
2015 A* conf
ICDM
Dawei Wang, Wei Ding
2015 J jnl
ACM Trans. Knowl. Discov. Data
Kui Yu, Wei Ding, Dan A. Simovici, Hao Wang, Jian Pei, Xindong Wu
2015 conf
ICNSC
Yahui Di, Wei Ding, Yang Mu, David L. Small, Shafiqul Islam, Ni-Bin Chang
2015 conf
UIC/ATC/ScalCom
Ke Huang, Xiang Ding, Jing Xu, Guanling Chen, Wei Ding
2015 A conf
SIGCSE
Daniel D. Garcia, Wei Ding, Joseph Paul Cohen, Barbara Ericson, Jeff Gray, Dale Reed
2015 B conf
FG
Henry Z. Lo, Joseph Paul Cohen, Wei Ding
2015 J jnl
Decis. Support Syst.
Zhou Zhang, Yuewen Liu, Wei Ding, Wayne Wei Huang, Qin Su, Ping Chen
2015 J jnl
CoRR
Kui Yu, Xindong Wu, Wei Ding, Jian Pei
2015 J jnl
CoRR
Joseph Paul Cohen, Wei Ding, Abraham Bagherjeiran
2015 conf
IEEE BigData
Chung-Hsien Yu, Dong Luo, Wei Ding, Joseph Paul Cohen, David L. Small, Shafiqul Islam
2015 J jnl
CoRR
Joseph Paul Cohen, Carla Aravena, Wei Ding
2015 A* conf
KDD
Kui Yu, Dawei Wang, Wei Ding, Jian Pei, David L. Small, Shafiqul Islam, Xindong Wu
2015 A* conf
ICDM
Qin Zhang, Peng Zhang, Guodong Long, Wei Ding, Chengqi Zhang, Xindong Wu
2015 conf
ICDM Workshops
Henry Z. Lo, Wei Ding
2014 J jnl
Knowl. Based Syst.
Chunxia Zhang, Xindong Wu, Zhendong Niu, Wei Ding
2014 J jnl
IEEE Trans. Knowl. Data Eng.
Yang Mu, Henry Z. Lo, Wei Ding, Kevin Amaral, Scott E. Crouter
2014 conf
PAKDD (2)
Chung-Hsien Yu, Wei Ding, Ping Chen, Melissa Morabito
2014 J jnl
IEEE Trans. Knowl. Data Eng.
Xindong Wu, Xingquan Zhu, Gong-Qing Wu, Wei Ding
2014 A* conf
ACM Multimedia
Yang Mu, Henry Z. Lo, Wei Ding, Dacheng Tao
2014 J jnl
Appl. Intell.
Youxi Wu, Lingling Wang, Jiadong Ren, Wei Ding, Xindong Wu
2014 J jnl
Appl. Intell.
Henry Z. Lo, Wei Ding, Zohreh Nazeri
2014 A* conf
ICDM
Kui Yu, Xindong Wu, Wei Ding, Jian Pei
2014 conf
IPDPS Workshops
Wei Ding, Ligang Lu, Mauricio Araya-Polo, Amik St.-Cyr, Detlef Hohl, Barbara M. Chapman
2013 ed.
ICDM Workshops
Wei Ding, Takashi Washio, Hui Xiong, George Karypis, Bhavani Thuraisingham, Diane J. Cook, Xindong Wu
2013 J jnl
IEEE Trans. Knowl. Data Eng.
Kui Yu, Wei Ding, Hao Wang, Xindong Wu
2013 A* conf
KDD
Yang Mu, Wei Ding, Tianyi Zhou, Dacheng Tao
2013 J jnl
Appl. Intell.
Dawei Wang, Wei Ding, Henry Z. Lo, Tomasz F. Stepinski, Josue Salazar, Melissa Morabito
2013 C conf
IAS
Wei Ding, Khoa Le, Shou-Hsuan Stephen Huang
2013 A conf
SDM
Wei Ding, Xindong Wu, Shichao Zhang, Xiaofeng Zhu
2013 ch.
Contrast Data Mining
Wei Ding, Tomasz F. Stepinski, Josue Salazar
2013 A* conf
ICDM
Hai-Guang Li, Xindong Wu, Zhao Li, Wei Ding
2013 J jnl
Concurr. Comput. Pract. Exp.
Wei Ding, Chung-Hsing Hsu, Oscar R. Hernandez, Barbara M. Chapman, Richard L. Graham
2013 conf
ICDM Workshops
Yang Mu, Wei Ding
2013 J jnl
Pattern Recognit.
Yang Mu, Wei Ding, Dacheng Tao
2013 A* conf
ICDM
Kui Yu, Xindong Wu, Zan Zhang, Yang Mu, Hao Wang, Wei Ding
2013 conf
ICDM Workshops
Henry Z. Lo, Wei Ding, Zohreh Nazeri
2013 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xindong Wu, Kui Yu, Wei Ding, Hao Wang, Xingquan Zhu
2013 A* conf
AAAI
Hai-Guang Li, Xindong Wu, Zhao Li, Wei Ding
2013 J jnl
Int. J. Artif. Intell. Tools
Xindong Wu, Fei Xie, Gong-Qing Wu, Wei Ding
2013 conf
LCPC
Wei Ding, Oscar R. Hernandez, Tony Curtis, Barbara M. Chapman
2013 A* conf
KDD
Dawei Wang, Wei Ding, Kui Yu, Xindong Wu, Ping Chen, David L. Small, Shafiqul Islam
2013 J jnl
Comput. Environ. Urban Syst.
Dawei Wang, Wei Ding, Henry Z. Lo, Melissa Morabito, Ping Chen, Josue Salazar, Tomasz F. Stepinski
2012 conf
Facing the Multicore-Challenge
Wei Ding, Oscar R. Hernandez, Barbara M. Chapman
2012 J jnl
Neurocomputing
Siyi Liu, Wei Ding, Feng Gao, Tomasz F. Stepinski
2012 C ed.
IEA/AIE
He Jiang, Wei Ding, Moonis Ali, Xindong Wu
2012 A* conf
KDD
Yin Song, Longbing Cao, Xindong Wu, Gang Wei, Wu Ye, Wei Ding
2012 C conf
IEA/AIE
Daiheng Ni, Hong Liu, Wei Ding, Yuanchang Xie, Honggang Wang, Hossein Pishro-Nik, Qian Yu
2012 J jnl
Comput. J.
Kui Yu, Xindong Wu, Wei Ding, Hao Wang
2012 A* conf
KDD
Kui Yu, Wei Ding, Dan A. Simovici, Xindong Wu
2012 book
Modern Advances in Intelligent Systems and Tools
Wei Ding, He Jiang, Moonis Ali, Mingchu Li
2012 C conf
IEA/AIE
Dawei Wang, Wei Ding, Tomasz F. Stepinski, Josue Salazar, Henry Z. Lo, Melissa Morabito
2012 A* conf
ICDM
Meng Fang, Xingquan Zhu, Bin Li, Wei Ding, Xindong Wu
2012 C conf
IEA/AIE
Henry Z. Lo, Dan A. Simovici, Wei Ding
2012 J jnl
IEEE Intell. Syst.
Ping Chen, Chris Bowes, Wei Ding, Max Choly
2011 J jnl
GeoInformatica
Wei Ding, Christoph F. Eick, Xiaojing Yuan, Jing Wang, Jean-Philippe Nicot
2011 J jnl
Int. J. Softw. Sci. Comput. Intell.
Ping Chen, Wei Ding, Walter Garcia
2011 conf
GIS
Siyi Liu, Wei Ding, Joseph Paul Cohen, Dan A. Simovici, Tomasz F. Stepinski
2011 B conf
IJCNN
Yang Mu, Wei Ding, Dacheng Tao, Tomasz F. Stepinski
2011 A* conf
ICDM
Kui Yu, Xindong Wu, Wei Ding, Hao Wang, Hongliang Yao
2011 J jnl
GeoInformatica
Tomasz F. Stepinski, Wei Ding, Christoph F. Eick
2011 conf
ICDM Workshops
Chung-Hsien Yu, Max W. Ward, Melissa Morabito, Wei Ding
2011 B conf
AINA
Wei Ding, Shou-Hsuan Stephen Huang
2011 C conf
KSEM
Yang Mu, Wei Ding, Melissa Morabito, Dacheng Tao
2011 J jnl
Int. J. Softw. Sci. Comput. Intell.
Rosanne Vetro, Dan A. Simovici, Wei Ding
2011 conf
Facing the Multicore-Challenge
Oscar R. Hernandez, Wei Ding, Barbara M. Chapman, Christos Kartsaklis, Ramanan Sankaran, Richard L. Graham
2011 conf
SpringSim (ANSS)
Hong Liu, Qian Yu, Wei Ding, Daiheng Ni, Honggang Wang, Stephen Shannon
2011 conf
Australasian Conference on Artificial Intelligence
Joseph Paul Cohen, Siyi Liu, Wei Ding
2011 J jnl
Knowl. Inf. Syst.
Xingquan Zhu, Wei Ding, Philip S. Yu, Chengqi Zhang
2011 B conf
ICTAI
Xindong Wu, Fei Xie, Gong-Qing Wu, Wei Ding
2011 C conf
ISPA
Siyi Liu, Wei Ding, Tomasz F. Stepinski
2011 J jnl
ACM Trans. Intell. Syst. Technol.
Wei Ding, Tomasz F. Stepinski, Yang Mu, Lourenço P. C. Bandeira, Ricardo Vilalta, Youxi Wu, Zhenyu Lu, Tianyu Cao, Xindong Wu
2010 A conf
CIKM
Wei Ding, Tomasz F. Stepinski, Lourenço P. C. Bandeira, Ricardo Vilalta, Youxi Wu, Zhenyu Lu, Tianyu Cao
2010 A* conf
ICDM
Kui Yu, Xindong Wu, Hao Wang, Wei Ding
2010 conf
COM.Geo
Tomasz F. Stepinski, Josue Salazar, Wei Ding
2010 B conf
Discovery Science
Tomasz F. Stepinski, Josue Salazar, Wei Ding, Denis White
2010 conf
IEEE ICCI
Jue Wang, Wei Ding, Barry Fradkin, Cuong H. Pham, Peter Sherman, Binh D. Tran, Dawei Wang, Yun Yang, Tomasz F. Stepinski
2010 conf
GIS
Tomasz F. Stepinski, Josue Salazar, Wei Ding
2010 conf
IEEE ICCI
Rosanne Vetro, Wei Ding, Dan A. Simovici
2010 A* conf
ICML
Xindong Wu, Kui Yu, Hao Wang, Wei Ding
2010 conf
SemEval@ACL
Andrew Tran, Chris Bowes, David Brown, Ping Chen, Max Choly, Wei Ding
2010 B conf
AINA
Ying-Wei Kuo, Shou-Hsuan Stephen Huang, Wei Ding, Rebecca Kern, Jianhua Yang
2009 conf
HLT-NAACL
Ping Chen, Wei Ding, Chris Bowes, David Brown
2009 J jnl
Int. J. Softw. Sci. Comput. Intell.
Ping Chen, Wei Ding, Chengmin Ding
2009 C conf
IAS
Wei Ding, Matthew J. Hausknecht, Shou-Hsuan Stephen Huang, Zach Riggle
2009 A conf
SDM
Wei Ding, Tomasz F. Stepinski, Josue Salazar
2009 J jnl
Comput. Geosci.
Wei Ding, Tomasz F. Stepinski, Rachana Parmar, Dan Jiang, Christoph F. Eick
2009 B conf
ICTAI
Ping Chen, Wei Ding, Chris Bowes, David Brown
2009 Misc conf
CATA
Wei Ding, Hisham Al-Mubaid, Srikanth Kotagiri
2008 conf
GIS
Tomasz F. Stepinski, Wei Ding, Christoph F. Eick
2008 conf
GIS
Christoph F. Eick, Rachana Parmar, Wei Ding, Tomasz F. Stepinski, Jean-Philippe Nicot
2008 conf
TAC
Ping Chen, Timothy Simmons, Carlos Lacayo, Wei Ding
2008 B conf
PAKDD
Wei Ding, Rachsuda Jiamthapthaksin, Rachana Parmar, Dan Jiang, Tomasz F. Stepinski, Christoph F. Eick
2007 conf
ICDM Workshops
Wei Ding, Christoph F. Eick, Xiaojing Yuan, Jing Wang, Jean-Philippe Nicot
2006 A* conf
ICDM
Wei Ding, Christoph F. Eick, Jing Wang, Xiaojing Yuan
2006 conf
IEEE ICCI
Ping Chen, Wei Ding, Chengmin Ding
2005 A conf
SIGCSE
Gary D. Boetticher, Wei Ding, Charles R. Moen, Kwok-Bun Yue
2005 conf
MSV
Xusheng Wang, Ping Chen, Wei Ding
2004 B conf
ITiCSE
Kwok-Bun Yue, Wei Ding
2004 J jnl
J. Comput. Sci. Coll.
Kwok-Bun Yue, T. Andrew Yang, Wei Ding, Ping Chen
2003 A* conf
ICDM
Ping Chen, Chenyi Hu, Wei Ding, Heloise Lynn, Yves Simon
2001 B conf
ICECCS
Paul Ammann, Wei Ding, Daling Xu
2000 B conf
ICECCS
Aynur Abdurazik, Paul Ammann, Wei Ding, A. Jefferson Offutt
start.py
← Index start.py python
"""
# By repository (existing behavior, now uses repository_upload_sessions)
python start.py --s3 --repo bazaar --index_prefix redb

# By repository with notes filter
python start.py --s3 --repo vx-itw --s3-notes "ITW.0138" --index_prefix redb

# By single date (all repo samples first seen on Jan 15, 2025)
python start.py --date 2025-01-15 --index_prefix redb

# By date with repository filter
python start.py --date 2025-01-15 --repo bazaar --index_prefix redb

# By date range (inclusive)
python start.py --range 2025-01-01 2025-01-31 --index_prefix redb

# By date range with repository and notes filters
python start.py --range 2025-01-01 2025-01-31 --repo malshare --s3-notes "batch1" --index_prefix redb

# By filetype (magika) standalone - process all ELF samples across all repos
python start.py --s3 --magika elf --index_prefix redb

# By filetype with repository filter
python start.py --s3 --repo bazaar --magika elf --index_prefix redb

# By filetype with date range - process only PE samples in date range
python start.py --range 2025-01-01 2025-01-31 --magika pebin --index_prefix redb
"""

import argparse
import os
import sys
from datetime import datetime, timedelta
from redb.ingestor import *

"""
        # General modules
        'BasicPropertiesExtractor': BasicPropertiesExtractor,
        'HashExtractor': HashExtractor,
        'DIEExtractor': DIEExtractor,
        'CAPAExtractor': CAPAExtractor,
        'StringsExtractor': StringsExtractor,
        # PE modules
        'PEFeaturesExtractor': PEFeaturesExtractor,
        'PEImportExtractor': PEImportExtractor,
        'PEResourceExtractor': PEResourceExtractor,
        'PEOverlayExtractor': PEOverlayExtractor,
        'PESectionExtractor': PESectionExtractor,
        'PESignatureExtractor': PESignatureExtractor,
        'PEExtraFindings': PEExtraFindings,
        'PEInconstistencyTestsExtractor': PEInconstistencyTestsExtractor,
        'PEDotNetExtractor': PEDotNetExtractor,
"""


def main():
    # # path = "/mnt/samples/consilience/malware/test/test-unzipped/0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71/"
    # path = "/Users/p4c0/_samples/test-unzipped/0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71" #Stuxnet
    # # path = "/Volumes/backup/consilience/malware/test/test-unzipped/rhpv-673f91a2085358e3266f466845366f30cf741060edeb31e9a93e2c92033bba28"
    # # path = "/mnt/samples/consilience/malware/test/test-redb/"
    # # path = "/mnt/samples/consilience/malware/malpedia-pe/9bc81280113473de9ebfe54f689b4440287c37fff562e070d3a28f5269cadcf0_dump7_0x00400000"
    # # path = "/mnt/samples/consilience/malware/test/test-unzipped/379251974ebcd5c397f92ca45bb9620d"
    # path = "0242d90dc48a8931bad72ddbdba34bdd568fd30610dfe049c84968d425088c71" # rich header, UPX packer
    # # #path = "d8637bdbcfc9112fcb1f0167b398e771" #dotnet
    # path = "/Users/p4c0/_samples/test-unzipped/sig-8e035beb02a411f8a9e92d4cf184ad34f52bbd0a81a50c222cdd4706e4e45104" #code signed, protector use case for sections
    # path = "/Users/p4c0/_samples/test-unzipped/vsinfo-39d8ad95b0323c37bd3134ab93ac4af44c66a1a8443a41c1ac02cec19bb2816a"
    # # path = "/Volumes/backup/consilience/malware/_sorted_samples/vx-apt/pebin/69e679daaaff3832c39671bf2b813b5530a70fb763d381f9a6e22e3bc493c8a9.7z"
    # # path = "test_files/hello"
    # path = "/Volumes/backup/consilience/malware/test/test-re2db/"
    # # path = "/Users/p4c0/_samples/HEUR-Trojan-PSW.MSIL.Maslog.gen-0c9ae5cd740c1da7060b92ddb33f3a3893e361aad45a2accc64d43bd9a1a4106"
    # # path = "/Users/p4c0/_samples/test-unzipped/"
    # # # path = "/Volumes/backup/consilience/malware/_sorted_samples/vx-apt/pebin/7156bd8056c4b6b4e179a64370067d3f7a7cce0044f1352d41f3c2c73038d273.7z"
    # decompile = False
    # repo = "test-fixing"
    # index_prefix = "test4"
    # selected_modules = "all"
    # exporter_types = ['ClickHouse']

    # parser = argparse.ArgumentParser(
    #     description="Process binary files in a given path."
    # )
    # parser.add_argument("path", 
    #     help="File path, directory path, or path to a .txt file containing a list of files to process (one per line)")
    # parser.add_argument(
    #     "--repo", help="Repository name for sample source, used for loggfile name"
    # )
    # parser.add_argument("--index_prefix", help="Index prefix for ElasticSearch")
    # parser.add_argument(
    #     "-d",
    #     "--decompile",
    #     action="store_true",
    #     help="Optional flag, if set it will run ONLY the decompiler on the binary files",
    # )
    # parser.add_argument(
    #     "-m",
    #     "--modules",
    #     help="Comma-separated list of modules to run (e.g., 'BasicPropertiesExtractor,HashExtractor') or 'all' for all modules",
    #     default="all",
    # )
    # args = parser.parse_args()
    # path = args.path
    # index_prefix = args.index_prefix
    # decompile = args.decompile
    # repo = args.repo
    # selected_modules = args.modules

    # print(f"Decompile flag: {decompile}")
    # print(f"Repo: {repo}")
    # print(f"Selected modules: {selected_modules}")
    
    # if path.endswith('.txt'):
    #     print(f"Reading file list from: {path}")

    # Ingestor(path, decompile, repo, index_prefix, selected_modules).ingest()

    parser = argparse.ArgumentParser(
        description="Process binary files from local paths or S3 storage."
    )
    
    # Create a mutually exclusive group for input sources
    # Not required because --analyzed can be used standalone
    input_group = parser.add_mutually_exclusive_group(required=False)
    input_group.add_argument(
        "--path", 
        help="File path, directory path, or path to a .txt file containing a list of files to process (one per line)")
    input_group.add_argument(
        "--s3",
        action="store_true",
        help="Use S3 mode to fetch files from repository specified by --repo")
    input_group.add_argument(
        "--s3-solo",
        metavar="S3_KEY",
        help="Process a single S3 file by providing the S3 key (e.g., 09/f7/09f7d02a....zip)")
    input_group.add_argument(
        "--nomad-job",
        action="store_true",
        help="Run as Nomad job using environment variables for job parameters")
    input_group.add_argument(
        "--date",
        metavar="YYYY-MM-DD",
        help="Process samples first seen on a specific date (from repository_upload_sessions only)")
    input_group.add_argument(
        "--range",
        nargs=2,
        metavar=("START_DATE", "END_DATE"),
        help="Process samples first seen in a date range (inclusive, from repository_upload_sessions only). Format: YYYY-MM-DD YYYY-MM-DD")
    parser.add_argument(
        "--analyzed",
        action="store_true",
        help="Filter to samples already in the database (from basic_properties). "
             "Can be used standalone or combined with --range/--date to partition large runs")

    parser.add_argument(
        "--repo",
        required=False,
        help="Repository name for sample source, used for logging and S3 filtering (optional for --date/--range modes)")
    
    parser.add_argument(
        "--s3-notes",
        help="Optional filter for S3 files based on notes field (S3 mode only)")

    parser.add_argument(
        "--magika",
        help="Filter by filetype_magika (e.g., 'elf', 'pebin'). Overrides SUPPORTED_FORMATS env var. Can combine with --repo, --date, --range")

    parser.add_argument(
        "--index_prefix", default="redb",
        help="Index prefix for database (default: redb)")
    
    parser.add_argument(
        "-d",
        "--decompile",
        action="store_true",
        help="Optional flag, if set it will run ONLY the decompiler on the binary files",
    )

    parser.add_argument(
        "-y",
        "--yara",
        action="store_true",
        help="Optional flag, if set it will run ONLY the YARA scanner on the binary files",
    )

    parser.add_argument(
        "--with-yara",
        action="store_true",
        help="Add YARA scanning to feature extraction (runs both features and YARA)",
    )

    parser.add_argument(
        "-m",
        "--modules",
        help="Comma-separated list of modules to run (e.g., 'BasicPropertiesExtractor,HashExtractor') or 'all' for all modules",
        default="all",
    )

    parser.add_argument(
        "--decompile-modules",
        help="Comma-separated list of decompiler sub-modules to run when using -d/--decompile. "
             "Available: decompilation, disassembly, cfg, llil, strings, or 'all' (default: all)",
        default="all",
    )
    
    parser.add_argument(
        "--force",
        action="store_true",
        help="Force reprocessing of samples already in the database (bypasses deduplication check)",
    )

    parser.add_argument(
        "--rerun",
        action="store_true",
        help="Re-run decompiler modules on already-disassembled samples only. "
             "Queries code_binja_disassembled_functions_references instead of basic_properties. "
             "Requires --analyzed and --decompile.",
    )

    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Print results instead of uploading to database (useful for testing)",
    )
    
    args = parser.parse_args()

    # Extract arguments
    path = args.path
    index_prefix = args.index_prefix
    decompile = args.decompile
    yara_scan = args.yara
    with_yara = args.with_yara
    repo = args.repo
    selected_modules = args.modules
    decompile_modules = args.decompile_modules
    s3_mode = args.s3
    s3_notes = args.s3_notes
    magika_filter = args.magika
    dry_run = args.dry_run
    force = args.force
    rerun = args.rerun
    s3_solo = args.s3_solo
    s3_key = args.s3_solo if args.s3_solo else None
    nomad_job = args.nomad_job
    analyzed = args.analyzed
    date_filter = args.date
    date_range = args.range

    # Validate that at least one input source is provided
    has_input = any([path, s3_mode, s3_solo, nomad_job, date_filter, date_range, analyzed])
    if not has_input:
        print("ERROR: Must specify an input source: --path, --s3, --s3-solo, --nomad-job, --date, --range, or --analyzed")
        sys.exit(1)

    # Validate --analyzed combinations
    if analyzed and any([path, s3_mode, s3_solo, nomad_job]):
        print("ERROR: --analyzed cannot be combined with --path, --s3, --s3-solo, or --nomad-job")
        sys.exit(1)

    # Validate flag combinations
    if yara_scan and with_yara:
        print("ERROR: Cannot use both --yara and --with-yara")
        sys.exit(1)
    if decompile and with_yara:
        print("ERROR: --with-yara only works with feature extraction, not decompile")
        sys.exit(1)

    # Parse and validate --decompile-modules
    VALID_DECOMPILE_MODULES = {"all", "decompilation", "disassembly", "cfg", "llil", "strings"}
    if decompile_modules == "all":
        decompile_modules_set = {"all"}
    else:
        decompile_modules_set = {m.strip() for m in decompile_modules.split(",")}
        invalid = decompile_modules_set - VALID_DECOMPILE_MODULES
        if invalid:
            print(f"ERROR: Invalid decompile module(s): {', '.join(sorted(invalid))}")
            print(f"Available: {', '.join(sorted(VALID_DECOMPILE_MODULES - {'all'}))}")
            sys.exit(1)

    if not decompile and decompile_modules != "all":
        print("ERROR: --decompile-modules requires -d/--decompile flag")
        sys.exit(1)

    if rerun and not analyzed:
        print("ERROR: --rerun requires --analyzed flag")
        sys.exit(1)
    if rerun and not decompile:
        print("ERROR: --rerun requires -d/--decompile flag")
        sys.exit(1)

    if rerun and force:
        print("ERROR: --rerun and --force are mutually exclusive. "
              "--rerun targets already-disassembled samples, --force targets all analyzed samples.")
        sys.exit(1)

    # Validate and parse date arguments
    start_date = None
    end_date = None

    if date_filter:
        # Single date mode: process samples from that day
        try:
            parsed_date = datetime.strptime(date_filter, "%Y-%m-%d")
            start_date = date_filter
            # End date is the next day (exclusive)
            end_date = (parsed_date + timedelta(days=1)).strftime("%Y-%m-%d")
        except ValueError:
            print(f"ERROR: Invalid date format '{date_filter}'. Use YYYY-MM-DD")
            sys.exit(1)

    if date_range:
        # Date range mode: process samples between start and end dates
        try:
            start_date = date_range[0]
            datetime.strptime(start_date, "%Y-%m-%d")  # Validate format
            parsed_end = datetime.strptime(date_range[1], "%Y-%m-%d")
            # End date is the day after the provided end date (to make it inclusive)
            end_date = (parsed_end + timedelta(days=1)).strftime("%Y-%m-%d")
        except ValueError:
            print(f"ERROR: Invalid date format in range '{date_range}'. Use YYYY-MM-DD YYYY-MM-DD")
            sys.exit(1)

    # Validate required parameters based on mode
    if nomad_job or s3_solo:
        # For nomad job and s3-solo modes, set default repo if not provided (used for log filename)
        if not repo:
            repo = "s3-solo" if s3_solo else "nomad-worker"
    elif analyzed:
        # For analyzed mode, repo is optional (used for logging only)
        if not repo:
            repo = "analyzed"
    elif date_filter or date_range:
        # For date/range modes, repo is optional (used for filtering within date range)
        # Set a default repo name for logging if not provided
        if not repo:
            repo = "date-range"
    elif s3_mode and magika_filter and not repo:
        # For S3 mode with magika filter, repo is optional (query all repos for that filetype)
        repo = "all-repos"
    elif not s3_mode and path:
        # For local mode, repo is required
        if not repo:
            print("ERROR: --repo is required for local mode")
            sys.exit(1)
    elif s3_mode and not repo:
        # For S3 mode without magika filter, repo is required
        print("ERROR: --repo is required for S3 catalog mode (or use --magika to query all repos)")
        sys.exit(1)

    print(f"Decompile flag: {decompile}")
    if decompile and decompile_modules != "all":
        print(f"Decompile modules: {', '.join(sorted(decompile_modules_set))}")
    print(f"YARA scan flag: {yara_scan}")
    print(f"With YARA flag: {with_yara}")
    print(f"Repo: {repo}")
    print(f"Selected modules: {selected_modules}")
    print(f"Dry run mode: {dry_run}")
    print(f"Force reprocessing: {force}")
    print(f"S3 solo mode: {s3_solo}")
    print(f"Nomad job mode: {nomad_job}")
    if magika_filter:
        print(f"Magika filter: {magika_filter}")
    if start_date:
        print(f"Date filter: {start_date} to {end_date}")
    if rerun:
        print(f"Rerun mode: targeting already-disassembled samples from code_binja_disassembled_functions_references")
    if analyzed:
        print(f"Analyzed mode: processing already-analyzed samples from basic_properties")

    if analyzed and not (date_filter or date_range):
        # Analyzed mode (standalone): process samples already in basic_properties via S3
        print(f"Processing already-analyzed samples from {index_prefix}_basic_properties")
        if magika_filter:
            print(f"Filetype filter: {magika_filter}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo or "analyzed",
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            analyzed=True,
            decompile_modules=decompile_modules_set,
            rerun=rerun,
        ).ingest()

    elif date_filter or date_range:
        # Date-based S3 mode
        print(f"Date-based S3 mode enabled")
        if analyzed:
            print(f"Filtered to already-analyzed samples in {index_prefix}_basic_properties")
        if repo and repo != "date-range":
            print(f"Repository filter: {repo}")
        if s3_notes:
            print(f"Notes filter: {s3_notes}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            s3_notes=s3_notes,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            start_date=start_date,
            end_date=end_date,
            analyzed=analyzed,
            decompile_modules=decompile_modules_set,
        ).ingest()

    elif s3_solo:
        # Process a single S3 file using S3 key provided as argument
        print(f"Starting S3 solo mode with S3 key: {s3_key}")

        # Override with environment variables if not provided via command line
        if not index_prefix:
            index_prefix = os.getenv('INDEX_PREFIX', 'redb')
        if not repo:
            repo = os.getenv('REPO', 's3-solo')

        # Validate required parameters
        if not s3_key:
            print("ERROR: S3 key is required for S3-solo mode")
            sys.exit(1)

        # Extract hash from S3 key by splitting and taking the last chunk
        # S3 key format examples:
        # - 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
        # - private/ab/cd/abcd1234567890abcdef1234567890abcdef1234567890abcdef123456.zip
        try:
            # Remove .zip extension and split by '/'
            sample_hash = s3_key.replace('.zip', '').split('/')[-1]
        except Exception as e:
            print(f"ERROR: Failed to extract hash from S3 key {s3_key}: {e}")
            sys.exit(1)

        print(f"S3 Key: {s3_key}")
        print(f"Extracted hash: {sample_hash}")
        print(f"Using index_prefix: {index_prefix}")
        print(f"Using repo: {repo}")
        print(f"Dry run mode: {dry_run}")
        print(f"Selected modules: {selected_modules}")

        # Use ingestor with S3-solo mode
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix or "s3_solo",
            selected_modules=selected_modules,
            s3_mode=True,
            s3_solo=True,
            s3_solo_hash=sample_hash,
            s3_solo_key=s3_key,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

    elif nomad_job:
        # Run as Nomad job using environment variables - convert to S3-solo mode
        print("Starting Nomad job processor...")
        
        # Process Nomad environment variables
        job_id = os.getenv('JOB_ID')
        s3_key = os.getenv('S3_KEY')
        worker_type = os.getenv('WORKER_TYPE')
        callback_url = os.getenv('CALLBACK_URL')
        modules = os.getenv('ANALYSIS_MODULES', 'all')
        
        # Validate required parameters
        if not all([job_id, s3_key, worker_type, callback_url]):
            print("ERROR: Missing required Nomad job parameters")
            print("Required: JOB_ID, S3_KEY, WORKER_TYPE, CALLBACK_URL")
            sys.exit(1)
        
        print(f"Job ID: {job_id}")
        print(f"S3 Key: {s3_key}")
        print(f"Worker Type: {worker_type}")
        print(f"Callback URL: {callback_url}")
        print(f"Analysis Modules: {modules}")
        
        # Extract hash from S3 key (remove sharding structure and .zip extension)
        # S3 key format: 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
        # Extract: 09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c
        try:
            parts = s3_key.split('/')
            if len(parts) == 3:
                sample_hash = parts[2].replace('.zip', '')
            else:
                # Fallback for non-sharded keys
                sample_hash = s3_key.replace('.zip', '')
        except Exception as e:
            print(f"ERROR: Failed to extract hash from S3 key {s3_key}: {e}")
            sys.exit(1)
        
        print(f"Extracted hash: {sample_hash}")
        
        # Set decompile flag based on worker type
        decompile = worker_type == 'decompilation'
        
        # Override modules if specified
        if modules != 'all':
            selected_modules = modules
        
        # Use S3-solo mode with extracted hash
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix or "nomad",
            selected_modules=selected_modules,
            s3_mode=False,  # Not bulk S3 mode
            s3_solo=True,   # Use S3-solo mode
            s3_solo_hash=sample_hash,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

        # TODO: Add callback to send results to callback_url
        print(f"[INFO] Nomad job {job_id} completed. Callback URL: {callback_url}")
    
    elif s3_mode:
        print(f"S3 mode enabled")
        if s3_notes:
            print(f"S3 notes filter: {s3_notes}")
        Ingestor(
            path=None,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            s3_mode=True,
            s3_notes=s3_notes,
            magika_filter=magika_filter,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()
    else:
        print(f"Local mode with path: {path}")
        if path.endswith('.txt'):
            print(f"Reading file list from: {path}")

        Ingestor(
            path=path,
            decompile=decompile,
            yara_scan=yara_scan,
            with_yara=with_yara,
            repository=repo,
            index_prefix=index_prefix,
            selected_modules=selected_modules,
            dry_run=dry_run,
            force=force,
            decompile_modules=decompile_modules_set,
        ).ingest()

if __name__ == "__main__":
    main()