Xiaojie Guo

149 papers A* 35A 15B 3C 2Misc 3Journal 83Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Tianle Du, Mingjia Li, Hainuo Wang, Xiaojie Guo
2026 J jnl
CoRR
Meng Wang, Wenjing Dai, Jiawan Zhang, Xiaojie Guo
2026 J jnl
Pattern Recognit.
Meng Wang, Wenjing Dai, Xiaojie Guo
2026 J jnl
Int. J. Comput. Vis.
Yuheng Shi, Tong Zhang, Xiaojie Guo
2026 J jnl
CoRR
Xiaojie Guo, Dmitry Ignatov, Radu Timofte
2026 A* conf
AAAI
Yuanbin Fu, Xiaojie Guo
2026 J jnl
CoRR
Hainuo Wang, Mingjia Li, Xiaojie Guo
2025 A* conf
AAAI
Xinyu He, Xinhui Li, Xiaojie Guo
2025 J jnl
CoRR
Hainuo Wang, Qiming Hu, Xiaojie Guo
2025 conf
CVPR Workshops
Kangning Yang, Jie Cai, Ling Ouyang, Florin-Alexandru Vasluianu, Radu Timofte, Jiaming Ding, Huiming Sun, Lan Fu, Jinlong Li, Chiu Man Ho, Zibo Meng, Mingjia Li, Hainuo Wang, Qiming Hu, Jiarui Wang, Hao Zhao, Jin Hu, Xiaojie Guo, Mengru Yang, Jing He, Yiqing Wang, Zhiyang Chen, Hao Fang, Wei Zhang, Runmin Cong, Dheeraj Damodhar Hegde, Jatin Kalal, Nikhil Akalwadi, Ramesh Ashok Tabib, Uma Mudenagudi, Yu-Fan Lin, Chia-Ming Lee, Chih-Chung Hsu, Mengxin Zhang, Sabari Nathan, K. Uma, A. Sasithradevi, B. Sathya Bama, S. Mohamed Mansoor Roomi, Bilel Benjdira, Anas M. Ali, Wadii Boulila, Wei Dong, Yunzhe Li, Ali Hussein, Han Zhou, Jun Chen, Zeyu Xiao, Zhuoyuan Li
2025 conf
CVPR Workshops
Florin-Alexandru Vasluianu, Tim Seizinger, Zhuyun Zhou, Cailian Chen, Zongwei Wu, Radu Timofte, Mingjia Li, Jin Hu, Hainuo Wang, Hengxing Liu, Jiarui Wang, Qiming Hu, Xiaojie Guo, Xin Lu, Jiarong Yang, Yuanfei Bao, Anya Hu, Zihao Fan, Kunyu Wang, Jie Xiao, Xi Wang, Xueyang Fu, Zheng-Jun Zha, Yu-Fan Lin, Chia-Ming Lee, Chih-Chung Hsu, Xingbo Wang, Dong Li, Yuxu Chen, Bin Chen, Yuanbo Zhou, Yuanbin Chen, Hongwei Wang, Jiannan Lin, Qinquan Gao, Tong Tong, Zhao Zhang, Yanyan Wei, Wei Dong, Han Zhou, Seyed Amirreza Mousavi, Jun Chen, Haobo Liang, Jiajie Jing, Junyu Li, Yan Yang, Seoyeon Lee, Chaewon Kim, Ziyu Feng, Shidi Chen, Bowen Luan, Zewen Chen, Vijayalaxmi Ashok Aralikatti, G. Gyaneshwar Rao, Nikhil Akalwadi, Chaitra Desai, Ramesh Ashok Tabib, Uma Mudenagudi, Anas M. Ali, Bilel Benjdira, Wadii Boulila, Alexandru Brateanu, Cosmin Ancuti, Tanmay Chaturvedi, Manish Kumar, Anmol Srivastav, Daksh Trivedi, Shashwat Thakur, Kishor P. Upla, Zeyu Xiao, Zhuoyuan Li, Boda Zhou, Shashank Shekhar, Kele Xu, Qisheng Xu, Zijian Gao, Tianjiao Wan, Suiyi Zhao, Bo Wang, Yan Luo, Mingshen Wang, Yilin Zhang
2025 J jnl
CoRR
Florin-Alexandru Vasluianu, Tim Seizinger, Zhuyun Zhou, Cailian Chen, Zongwei Wu, Radu Timofte, Mingjia Li, Jin Hu, Hainuo Wang, Hengxing Liu, Jiarui Wang, Qiming Hu, Xiaojie Guo, Xin Lu, Jiarong Yang, Yuanfei Bao, Anya Hu, Zihao Fan, Kunyu Wang, Jie Xiao, Xi Wang, Xueyang Fu, Zheng-Jun Zha, Yu-Fan Lin, Chia-Ming Lee, Chih-Chung Hsu, Xingbo Wang, Dong Li, Yuxu Chen, Bin Chen, Yuanbo Zhou, Yuanbin Chen, Hongwei Wang, Jiannan Lin, Qinquan Gao, Tong Tong, Zhao Zhang, Yanyan Wei, Wei Dong, Han Zhou, Seyed Amirreza Mousavi, Jun Chen, Haobo Liang, Jiajie Jing, Junyu Li, Yan Yang, Seoyeon Lee, Chaewon Kim, Ziyu Feng, Shidi Chen, Bowen Luan, Zewen Chen, Vijayalaxmi Ashok Aralikatti, G. Gyaneshwar Rao, Nikhil Akalwadi, Chaitra Desai, Ramesh Ashok Tabib, Uma Mudenagudi, Anas M. Ali, Bilel Benjdira, Wadii Boulila, Alexandru Brateanu, Cosmin Ancuti, Tanmay Chaturvedi, Manish Kumar, Anmol Srivastav, Daksh Trivedi, Shashwat Thakur, Kishor P. Upla, Zeyu Xiao, Zhuoyuan Li, Boda Zhou, Shashank Shekhar, Kele Xu, Qisheng Xu, Zijian Gao, Tianjiao Wan, Suiyi Zhao, Bo Wang, Yan Luo, Mingshen Wang, Yilin Zhang
2025 J jnl
CoRR
Yuanbin Fu, Liang Li, Xiaojie Guo
2025 J jnl
CoRR
Mingjia Li, Jin Hu, Hainuo Wang, Qiming Hu, Jiarui Wang, Xiaojie Guo
2025 A* conf
CVPR
Hao Zhao, Mingjia Li, Qiming Hu, Xiaojie Guo
2025 J jnl
CoRR
Yuanbin Fu, Xiaojie Guo
2025 J jnl
CoRR
Xinhui Li, Xinyu He, Qiming Hu, Xiaojie Guo
2025 J jnl
CoRR
Qiming Hu, Linlong Fan, Yiyan Luo, Yuhang Yu, Xiaojie Guo, Qingnan Fan
2024 C conf
SNPD
Haobo Liang, Yingxiong Leng, Jinman Luo, Jie Chen, Xiaojie Guo
2024 J jnl
IEEE CAA J. Autom. Sinica
Meng Wang, Jiawan Zhang, Jiayi Ma, Xiaojie Guo
2024 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Linfeng Tang, Jiayi Ma, Hao Zhang, Xiaojie Guo
2024 J jnl
IEEE Trans. Image Process.
Yang Yang, Chun-Le Guo, Xiaojie Guo
2024 J jnl
CoRR
Xinyu He, Xinhui Li, Xiaojie Guo
2024 A conf
ICME
Meng Wang, Xiaojie Guo, Jiawan Zhang
2024 J jnl
CoRR
Mingjia Li, Hao Zhao, Xiaojie Guo
2024 J jnl
IEEE CAA J. Autom. Sinica
Han Xu, Jiayi Ma, Yixuan Yuan, Hao Zhang, Xin Tian, Xiaojie Guo
2024 conf
CVPR Workshops
Xiaoning Liu, Zongwei Wu, Ao Li, Florin-Alexandru Vasluianu, Yulun Zhang, Shuhang Gu, Le Zhang, Ce Zhu, Radu Timofte, Zhi Jin, Hongjun Wu, Chenxi Wang, Haitao Ling, Yuanhao Cai, Hao Bian, Yuxin Zheng, Jing Lin, Alan L. Yuille, Ben Shao, Jin Guo, Tianli Liu, Mohao Wu, Yixu Feng, Shuo Hou, Haotian Lin, Yu Zhu, Peng Wu, Wei Dong, Jinqiu Sun, Yanning Zhang, Qingsen Yan, Wenbin Zou, Weipeng Yang, Yunxiang Li, Qiaomu Wei, Tian Ye, Sixiang Chen, Zhao Zhang, Suiyi Zhao, Bo Wang, Yan Luo, Zhichao Zuo, Mingshen Wang, Junhu Wang, Yanyan Wei, Xiaopeng Sun, Yu Gao, Jiancheng Huang, Hongming Chen, Xiang Chen, Hui Tang, Yuanbin Chen, Yuanbo Zhou, Xinwei Dai, Xintao Qiu, Wei Deng, Qinquan Gao, Tong Tong, Mingjia Li, Jin Hu, Xinyu He, Xiaojie Guo, Sabarinathan, K. Uma, A. Sasithradevi, B. Sathya Bama, S. Mohamed Mansoor Roomi, V. Srivatsav, Jinjuan Wang, Long Sun, Qiuying Chen, Jiahong Shao, Yizhi Zhang, Marcos V. Conde, Daniel Feijoo, Juan C. Benito, Álvaro García, Jaeho Lee, Seongwan Kim, SMA Sharif, Nodirkhuja Khujaev, Roman Tsoy, Ali Murtaza, Uswah Khairuddin, Ahmad 'Athif Mohd Faudzi, Sampada Malagi, Amogh Joshi, Nikhil Akalwadi, Chaitra Desai, Ramesh Ashok Tabib, Uma Mudenagudi, Wenyi Lian, Wenjing Lian, Jagadeesh Kalyanshetti, Vijayalaxmi Ashok Aralikatti, Palani Yashaswini, Nitish Upasi, Dikshit Hegde, Ujwala Patil, Sujata C, Xingzhuo Yan, Wei Hao, Minghan Fu, Pooja Choksy, Anjali Sarvaiya, Kishor P. Upla, Kiran B. Raja, Hailong Yan, Yunkai Zhang, Baiang Li, Jingyi Zhang, Huan Zheng
2024 J jnl
CoRR
Xiaoning Liu, Zongwei Wu, Ao Li, Florin-Alexandru Vasluianu, Yulun Zhang, Shuhang Gu, Le Zhang, Ce Zhu, Radu Timofte, Zhi Jin, Hongjun Wu, Chenxi Wang, Haitao Ling, Yuanhao Cai, Hao Bian, Yuxin Zheng, Jing Lin, Alan L. Yuille, Ben Shao, Jin Guo, Tianli Liu, Mohao Wu, Yixu Feng, Shuo Hou, Haotian Lin, Yu Zhu, Peng Wu, Wei Dong, Jinqiu Sun, Yanning Zhang, Qingsen Yan, Wenbin Zou, Weipeng Yang, Yunxiang Li, Qiaomu Wei, Tian Ye, Sixiang Chen, Zhao Zhang, Suiyi Zhao, Bo Wang, Yan Luo, Zhichao Zuo, Mingshen Wang, Junhu Wang, Yanyan Wei, Xiaopeng Sun, Yu Gao, Jiancheng Huang, Hongming Chen, Xiang Chen, Hui Tang, Yuanbin Chen, Yuanbo Zhou, Xinwei Dai, Xintao Qiu, Wei Deng, Qinquan Gao, Tong Tong, Mingjia Li, Jin Hu, Xinyu He, Xiaojie Guo, Sabarinathan, K. Uma, A. Sasithradevi, B. Sathya Bama, S. Mohamed Mansoor Roomi, V. Srivatsav, Jinjuan Wang, Long Sun, Qiuying Chen, Jiahong Shao, Yizhi Zhang, Marcos V. Conde, Daniel Feijoo, Juan C. Benito, Álvaro García, Jaeho Lee, Seongwan Kim, SMA Sharif, Nodirkhuja Khujaev, Roman Tsoy, Ali Murtaza, Uswah Khairuddin, Ahmad 'Athif Mohd Faudzi, Sampada Malagi, Amogh Joshi, Nikhil Akalwadi, Chaitra Desai, Ramesh Ashok Tabib, Uma Mudenagudi, Wenyi Lian, Wenjing Lian, Jagadeesh Kalyanshetti, Vijayalaxmi Ashok Aralikatti, Palani Yashaswini, Nitish Upasi, Dikshit Hegde, Ujwala Patil, Sujata C
2024 J jnl
IEEE CAA J. Autom. Sinica
Yanan Jia, Qiming Hu, Renwei Dian, Jiayi Ma, Xiaojie Guo
2024 J jnl
CoRR
Yuheng Shi, Tong Zhang, Xiaojie Guo
2024 A* conf
ACM Multimedia
Hengxing Liu, Mingjia Li, Xiaojie Guo
2024 J jnl
CoRR
Hengxing Liu, Mingjia Li, Xiaojie Guo
2024 J jnl
CoRR
Hao Zhao, Mingjia Li, Qiming Hu, Xiaojie Guo
2024 A* conf
ACM Multimedia
Yuanbin Fu, Jie Ying, Houlei Lv, Xiaojie Guo
2024 J jnl
CoRR
Jin Hu, Mingjia Li, Xiaojie Guo
2024 A* conf
NeurIPS
Qiming Hu, Hainuo Wang, Xiaojie Guo
2023 A* conf
AAAI
Xinhui Li, Mingjia Li, Yaxing Wang, Chuan-Xian Ren, Xiaojie Guo
2023 J jnl
CoRR
Xinhui Li, Mingjia Li, Yaxing Wang, Chuan-Xian Ren, Xiaojie Guo
2023 J jnl
CoRR
Meng Wang, Xiaojie Guo, Wenjing Dai, Jiawan Zhang
2023 J jnl
Comput. Vis. Image Underst.
Yuanbin Fu, Jiayi Ma, Xiaojie Guo
2023 J jnl
IEEE Trans. Multim.
Xinhui Li, Mingjia Li, Xiaopeng Li, Xiaojie Guo
2023 J jnl
Int. J. Comput. Vis.
Xiaojie Guo, Qiming Hu
2023 A* conf
ACM Multimedia
Yuanbin Fu, Xiaojie Guo
2023 J jnl
CoRR
Yuanbin Fu, Xiaojie Guo
2023 J jnl
IEEE Trans. Multim.
Xiaopeng Li, Xiaojie Guo
2023 A* conf
ICCV
Qiming Hu, Xiaojie Guo
2023 J jnl
CoRR
Qiming Hu, Xiaojie Guo
2023 J jnl
CoRR
Yuheng Shi, Zehao Huang, Yan Yan, Naiyan Wang, Xiaojie Guo
2023 A* conf
AAAI
Yuheng Shi, Naiyan Wang, Xiaojie Guo
2022 A* conf
ACM Multimedia
Mingjia Li, Yuanbin Fu, Xinhui Li, Xiaojie Guo
2022 A conf
ICME
Meng Wang, Wenjing Dai, Xiaojie Guo, Jiawan Zhang
2022 J jnl
IEEE Trans. Image Process.
Meng Wang, Xiaojie Guo, Wenjing Dai, Jiawan Zhang
2022 A conf
ICME
Zhengzhang Hou, Liang Li, Xiaojie Guo
2022 J jnl
Inf. Fusion
Xiaojie Guo, Yang Yang, Chaoyue Wang, Jiayi Ma
2022 Misc conf
ICASSP
Yang Yang, Yonghua Zhang, Xiaojie Guo
2022 J jnl
Inf. Fusion
Dong Han, Liang Li, Xiaojie Guo, Jiayi Ma
2022 A* conf
IJCAI
Yuanbo Lin Wu, Deyin Liu, Xiaojie Guo, Richang Hong, Liangchen Liu, Rui Zhang
2022 A conf
ICME
Xiaopeng Li, Xiaojie Guo, Jiawan Zhang
2022 A* conf
CVPR
Yang Yang, Chaoyue Wang, Risheng Liu, Lin Zhang, Xiaojie Guo, Dacheng Tao
2022 A conf
ICME
Xinhui Li, Liang Li, Xiaojie Guo
2022 A* conf
ACM Multimedia
Meng Wang, Chaoyue Wang, Xiaojie Guo, Jiawan Zhang
2022 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Han Xu, Jiayi Ma, Junjun Jiang, Xiaojie Guo, Haibin Ling
2022 Misc conf
CoRL
Zhi Liu, Shaoyu Chen, Xiaojie Guo, Xinggang Wang, Tianheng Cheng, Hongmei Zhu, Qian Zhang, Wenyu Liu, Yi Zhang
2022 J jnl
CoRR
Zhi Liu, Shaoyu Chen, Xiaojie Guo, Xinggang Wang, Tianheng Cheng, Hongmei Zhu, Qian Zhang, Wenyu Liu, Yi Zhang
2022 J jnl
CoRR
Yuheng Shi, Naiyan Wang, Xiaojie Guo
2021 J jnl
Entropy
Yuanbin Fu, Jiayi Ma, Xiaojie Guo
2021 J jnl
Inf. Fusion
Xingyu Jiang, Jiayi Ma, Guobao Xiao, Zhenfeng Shao, Xiaojie Guo
2021 J jnl
Int. J. Comput. Vis.
Yonghua Zhang, Xiaojie Guo, Jiayi Ma, Wei Liu, Jiawan Zhang
2021 J jnl
Neural Networks
Chengli Peng, Tian Tian, Chen Chen, Xiaojie Guo, Jiayi Ma
2021 A conf
ICME
Yijing Mei, Xiaojie Guo, Di Sun, Gang Pan, Jiawan Zhang
2021 J jnl
CoRR
Yuanbin Fu, Xiaojie Guo, Qiming Hu, Di Lin, Jiayi Ma, Haibin Ling
2021 A conf
ICME
Hailing Wang, Qiaoyu Tian, Liang Li, Xiaojie Guo
2021 J jnl
CoRR
Qiming Hu, Xiaojie Guo
2021 J jnl
IEEE Trans. Geosci. Remote. Sens.
Han Xu, Jiayi Ma, Zhenfeng Shao, Hao Zhang, Junjun Jiang, Xiaojie Guo
2021 A* conf
NeurIPS
Qiming Hu, Xiaojie Guo
2021 J jnl
CoRR
Qiming Hu, Xiaojie Guo
2021 J jnl
Entropy
Yuanbin Fu, Jiayi Ma, Xiaojie Guo
2020 A* conf
AAAI
Han Xu, Jiayi Ma, Zhuliang Le, Junjun Jiang, Xiaojie Guo
2020 conf
PRCV (1)
Yang Yang, Xiaojie Guo
2020 J jnl
Inf. Fusion
Jiayi Ma, Pengwei Liang, Wei Yu, Chen Chen, Xiaojie Guo, Jia Wu, Junjun Jiang
2020 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xiaojie Guo, Yu Li, Jiayi Ma, Haibin Ling
2020 J jnl
Inf. Fusion
Jiayi Ma, Wei Yu, Chen Chen, Pengwei Liang, Xiaojie Guo, Junjun Jiang
2020 A* conf
AAAI
Hao Zhang, Han Xu, Yang Xiao, Xiaojie Guo, Jiayi Ma
2020 J jnl
IEEE Trans. Image Process.
Xingyu Jiang, Jiayi Ma, Junjun Jiang, Xiaojie Guo
2019 J jnl
Inf. Sci.
Xinggang Wang, Yongluan Yan, Peng Tang, Wenyu Liu, Xiaojie Guo
2019 J jnl
CoRR
Yuanbin Fu, Jiayi Ma, Lin Ma, Xiaojie Guo
2019 A* conf
ACM Multimedia
Yonghua Zhang, Jiawan Zhang, Xiaojie Guo
2019 J jnl
CoRR
Yonghua Zhang, Jiawan Zhang, Xiaojie Guo
2019 J jnl
IEEE Trans. Image Process.
Jiayi Ma, Xingyu Jiang, Junjun Jiang, Ji Zhao, Xiaojie Guo
2019 J jnl
CoRR
Yang Yang, Xiaojie Guo, Jiayi Ma, Lin Ma, Haibin Ling
2019 J jnl
Int. J. Comput. Vis.
Jiayi Ma, Ji Zhao, Junjun Jiang, Huabing Zhou, Xiaojie Guo
2019 J jnl
Pattern Recognit.
Xiaobo Wang, Zhen Lei, Xiaojie Guo, Changqing Zhang, Hailin Shi, Stan Z. Li
2019 J jnl
CoRR
Xiaojie Guo, Siyuan Li, Jiawan Zhang, Jiayi Ma, Lin Ma, Wei Liu, Haibin Ling
2019 A* conf
CVPR
Siyuan Li, Iago Breno Araujo, Wenqi Ren, Zhangyang Wang, Eric K. Tokuda, Roberto Hirata Junior, Roberto Marcondes Cesar Junior, Jiawan Zhang, Xiaojie Guo, Xiaochun Cao
2019 J jnl
CoRR
Siyuan Li, Iago Breno Araujo, Wenqi Ren, Zhangyang Wang, Eric K. Tokuda, Roberto Hirata Junior, Roberto Marcondes Cesar Junior, Jiawan Zhang, Xiaojie Guo, Xiaochun Cao
2019 J jnl
Comput. Vis. Image Underst.
Siyuan Li, Wenqi Ren, Jiawan Zhang, Jinke Yu, Xiaojie Guo
2018 A conf
ICME
Xiaobo Wang, Zhen Lei, Hailin Shi, Xiaojie Guo, Xiangyu Zhu, Stan Z. Li
2018 A conf
ICME
Yonghua Zhang, Liang Li, Runmin Cong, Xiaojie Guo, Hui Xu, Jiawan Zhang
2018 J jnl
Comput. Vis. Image Underst.
Chenyang Zhang, Yingli Tian, Xiaojie Guo, Jingen Liu
2018 C conf
ACML
Yongluan Yan, Xinggang Wang, Xiaojie Guo, Jiemin Fang, Wenyu Liu, Junzhou Huang
2018 J jnl
IEEE Signal Process. Lett.
Xiaobo Wang, Zhen Lei, Shengcai Liao, Xiaojie Guo, Yang Yang, Stan Z. Li
2018 A* conf
IJCAI
Xiaobo Wang, Shifeng Zhang, Zhen Lei, Si Liu, Xiaojie Guo, Stan Z. Li
2018 J jnl
CoRR
Xiaobo Wang, Shifeng Zhang, Zhen Lei, Si Liu, Xiaojie Guo, Stan Z. Li
2018 J jnl
CoRR
Siyuan Li, Wenqi Ren, Jiawan Zhang, Jinke Yu, Xiaojie Guo
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jiayi Ma, Junjun Jiang, Huabing Zhou, Ji Zhao, Xiaojie Guo
2018 J jnl
IEEE Trans. Image Process.
Xiaojie Guo, Zhouchen Lin
2018 A conf
ICME
Liang Li, Xiaojie Guo, Wei Feng, Jiawan Zhang
2018 A conf
ICME
Xiaojie Guo, Siyuan Li, Liang Li, Jiawan Zhang
2018 A* conf
ICRA
Jiayi Ma, Ji Zhao, Junjun Jiang, Huabing Zhou, Yu Zhou, Zheng Wang, Xiaojie Guo
2017 A conf
ICME
Siyuan Li, Jiawan Zhang, Xiaojie Guo
2017 A* conf
IJCAI
Xiaojie Guo, Xiaobo Wang, Haibin Ling
2017 A* conf
CVPR
Xiaobo Wang, Xiaojie Guo, Zhen Lei, Changqing Zhang, Stan Z. Li
2017 J jnl
IEEE Trans. Image Process.
Xiaojie Guo, Yu Li, Haibin Ling
2017 A* conf
ACM Multimedia
Xiaojie Guo, Yu Li, Jiayi Ma
2017 A* conf
IJCAI
Xiaojie Guo, Zhouchen Lin
2017 J jnl
IEEE Trans. Image Process.
Yu Li, Robby T. Tan, Xiaojie Guo, Jiangbo Lu, Michael S. Brown
2016 J jnl
IEEE Trans. Cybern.
Xiaochun Cao, Ling Du, Xingxing Wei, Dan Meng, Xiaojie Guo
2016 J jnl
IEEE Trans. Image Process.
Wenqi Ren, Xiaochun Cao, Jin-shan Pan, Xiaojie Guo, Wangmeng Zuo, Ming-Hsuan Yang
2016 A* conf
ACM Multimedia
Xiaojie Guo
2016 J jnl
CoRR
Xiaojie Guo
2016 A* conf
CVPR
Yu Li, Robby T. Tan, Xiaojie Guo, Jiangbo Lu, Michael S. Brown
2016 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiaochun Cao, Changqing Zhang, Huazhu Fu, Xiaojie Guo, Qi Tian
2016 J jnl
IEEE Trans. Cybern.
Xiaochun Cao, Liang Yang, Xiaojie Guo
2016 A conf
ICME
Siyuan Li, Jiawan Zhang, Xiaojie Guo
2015 J jnl
Frontiers Comput. Sci.
Xiaochun Cao, Meili Ma, Xiaojie Guo, Ling Du, Dongdai Lin
2015 A* conf
ICCV
Xiaobo Wang, Xiaojie Guo, Stan Z. Li
2015 J jnl
IEEE Trans. Image Process.
Xiaochun Cao, Hua Zhang, Xiaojie Guo, Si Liu, Dan Meng
2015 J jnl
IEEE Trans. Image Process.
Xiaochun Cao, Wenqi Ren, Wangmeng Zuo, Xiaojie Guo, Hassan Foroosh
2014 A* conf
ACM Multimedia
Xiaochun Cao, Xingxing Wei, Xiaojie Guo, Yahong Han, Jinhui Tang
2014 A* conf
ACM Multimedia
Xiaobo Wang, Xiaochun Cao, Xiaojie Guo, Zhanjie Song
2014 conf
ECCV (1)
Xiaochun Cao, Hua Zhang, Xiaojie Guo, Si Liu, Xiaowu Chen
2014 A* conf
ICDM
Changqing Zhang, Yahong Han, Xiaojie Guo, Xiaochun Cao
2014 conf
ECCV (7)
Xiaojie Guo, Xinggang Wang, Liang Yang, Xiaochun Cao, Yi Ma
2014 A* conf
CVPR
Xiaojie Guo, Xiaochun Cao, Yi Ma
2014 A conf
ICME
Xiaojie Guo, Xiaochun Cao
2014 J jnl
Sci. China Inf. Sci.
Xiaochun Cao, Yujie Zhang, Xiaojie Guo, Yiu-ming Cheung
2013 A conf
ICME
Xiaochun Cao, Feng Jiang, Siyuan Li, Xiaojie Guo
2013 A* conf
ACM Multimedia
Xiaojie Guo, Siyuan Li, Xiaochun Cao
2013 A* conf
ICCV
Xiaochun Cao, Hua Zhang, Si Liu, Xiaojie Guo, Liang Lin
2013 A* conf
CVPR
Xiaojie Guo, Xiaochun Cao, Xiaowu Chen, Yi Ma
2012 J jnl
Pattern Recognit. Lett.
Xiaojie Guo, Xiaochun Cao
2012 J jnl
Image Vis. Comput.
Xiaojie Guo, Xiaochun Cao
2012 Misc conf
ICASSP
Yawen Xue, Xiaojie Guo, Xiaochun Cao
2011 J jnl
IEEE Trans. Inf. Forensics Secur.
Qiguang Liu, Xiaochun Cao, Chao Deng, Xiaojie Guo
2010 conf
PCM (1)
Chenyang Zhang, Xiaojie Guo, Xiaochun Cao
2010 B conf
ICPR
Xiaojie Guo, Xiaochun Cao
2010 B conf
ICPR
Xiaojie Guo, Xiaochun Cao
2010 B conf
ICPR
Hua Zhang, Xiaojie Guo, Xiaochun Cao
2009 conf
ACCV (2)
Xiaojie Guo, Xiaochun Cao, Jiawan Zhang, Xuewei Li
redb/queries.py
← Index redb/queries.py python
"""
Database query functions for REDB.

Contains all functions that query ClickHouse for sample metadata,
deduplication checks, and catalog lookups.
"""
import os
import ast
import clickhouse_connect
from typing import List, Optional, Dict

from redb import settings
from redb.s3_utils import generate_s3_key_from_hash


def get_supported_formats(magika_filter: Optional[str] = None) -> List[str]:
    """
    Get supported file formats from SUPPORTED_FORMATS env variable or magika_filter override.
    Expected format: SUPPORTED_FORMATS=['pebin', 'elf']

    Args:
        magika_filter: Optional single format to filter by (overrides env var)

    Returns:
        List of supported format strings, defaults to ['pebin'] if not set
    """
    # If magika_filter is provided, use it as the only format
    if magika_filter:
        return [magika_filter]

    formats_str = os.getenv('SUPPORTED_FORMATS', "['pebin']")
    try:
        formats = ast.literal_eval(formats_str)
        if isinstance(formats, list) and all(isinstance(f, str) for f in formats):
            return formats
        else:
            print(f"[WARNING] SUPPORTED_FORMATS must be a list of strings, got: {formats_str}")
            return ['pebin']
    except (ValueError, SyntaxError) as e:
        print(f"[WARNING] Failed to parse SUPPORTED_FORMATS '{formats_str}': {e}")
        return ['pebin']


def get_db_catalog_connection():
    """Create and return a ClickHouse client for catalog queries"""
    return clickhouse_connect.get_client(
        host=os.getenv("DB_HOST"),
        port=int(os.getenv("DB_PORT", "8123")),
        verify=os.getenv("DB_ENFORCE_SSL", "False").lower() == "true",
        username=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        database=os.getenv("DB_NAME")
    )


def fetch_s3_objects_by_repository(repository: Optional[str], index_prefix: str, decompile: bool, notes: Optional[str] = None, magika_filter: Optional[str] = None, yara_scan: bool = False, force: bool = False) -> List[Dict]:
    """
    Query the ClickHouse repository_upload_sessions table to get samples.
    S3 bucket comes from env var, S3 key is derived from sha256.

    Args:
        repository: Repository name (e.g., "bazaar", "malshare"). If None or "all-repos", queries all repositories.
        index_prefix: Table prefix for checking existing samples
        decompile: Whether we're in decompile mode (affects which table to check for existing)
        notes: Optional filter for notes field
        magika_filter: Optional single filetype to filter by (overrides SUPPORTED_FORMATS)
        yara_scan: Whether we're in YARA-only mode (skips "already processed" check)

    Returns:
        List of dicts with sha256, s3_bucket, s3_key for each sample
    """
    try:
        client = get_db_catalog_connection()
        s3_bucket = os.getenv('S3_BUCKET')

        if not s3_bucket:
            print("[ERROR] S3_BUCKET environment variable is required")
            return []

        # Get supported formats from env or magika_filter override
        supported_formats = get_supported_formats(magika_filter)
        print(f"[INFO] Querying for supported formats: {supported_formats}")

        # Build query - repository filter is optional
        # Join with catalog_samples to get first_seen date
        if repository and repository != "all-repos":
            query = """
                SELECT DISTINCT rus.sha256, rus.filetype_magika, cs.first_seen
                FROM repository_upload_sessions rus
                LEFT JOIN catalog_samples cs ON rus.sha256 = cs.sha256
                WHERE rus.repository = %(repo)s
                  AND rus.filetype_magika IN %(formats)s
            """
            params = {"repo": repository, "formats": supported_formats}
        else:
            # Query all repositories
            query = """
                SELECT DISTINCT rus.sha256, rus.filetype_magika, cs.first_seen
                FROM repository_upload_sessions rus
                LEFT JOIN catalog_samples cs ON rus.sha256 = cs.sha256
                WHERE rus.filetype_magika IN %(formats)s
            """
            params = {"formats": supported_formats}

        if notes:
            query += " AND rus.notes LIKE %(notes)s"
            params["notes"] = f"%{notes}%"

        # Execute query and convert to list of dictionaries
        result = client.query(query, parameters=params)

        # Build rows with s3_bucket and s3_key derived from sha256
        rows = []
        for row in result.result_rows:
            sha256 = row[0]
            # Handle binary string if needed
            if isinstance(sha256, bytes):
                sha256 = sha256.decode('utf-8')

            rows.append({
                'sha256': sha256,
                's3_bucket': s3_bucket,
                's3_key': generate_s3_key_from_hash(sha256),
                'filetype_magika': row[1],
                'first_seen': row[2]  # From catalog_samples (None if not found)
            })

        print(f"[DEBUG] Found {len(rows)} objects in repository_upload_sessions for repository {repository}")

        # Extract SHA256 hashes from the results for bulk checking
        sha256_list = [row.get('sha256') for row in rows if row.get('sha256')]

        if sha256_list and not force:
            # Check which hashes are already in the database
            existing_hashes = is_in_db_bulk(sha256_list, index_prefix, decompile, yara_scan, magika_filter)
            print(f"[INFO] Found {len(existing_hashes)} objects already in database")

            # Filter out rows with existing hashes
            rows = [row for row in rows if row.get('sha256') not in existing_hashes]
            print(f"[INFO] After filtering, {len(rows)} objects remain to be processed")
        elif force:
            print(f"[INFO] Force mode: skipping deduplication check, processing all {len(sha256_list)} objects")

        # Randomize the order of rows before returning
        import random
        random.shuffle(rows)

        return rows
    except Exception as e:
        print(f"[ERROR] Failed to query repository_upload_sessions: {e}")
        return []
    finally:
        if 'client' in locals():
            client.close()


def fetch_s3_objects_by_date_range(
    index_prefix: str,
    decompile: bool,
    start_date: str,
    end_date: str,
    repository: Optional[str] = None,
    notes: Optional[str] = None,
    magika_filter: Optional[str] = None,
    yara_scan: bool = False,
    force: bool = False,
    analyzed: bool = False
) -> List[Dict]:
    """
    Query samples from catalog_samples by first_seen date range, filtered to only include
    samples that exist in repository_upload_sessions (bulk/repo uploads only).

    Args:
        index_prefix: Table prefix for checking existing samples
        decompile: Whether we're in decompile mode
        start_date: Start date (inclusive) in YYYY-MM-DD format
        end_date: End date (exclusive) in YYYY-MM-DD format
        repository: Optional repository filter
        notes: Optional notes filter
        magika_filter: Optional single filetype to filter by (overrides SUPPORTED_FORMATS)
        yara_scan: Whether we're in YARA-only mode (skips "already processed" check)
        analyzed: Filter to only samples already in basic_properties (cross-database join)

    Returns:
        List of dicts with sha256, s3_bucket, s3_key for each sample
    """
    try:
        client = get_db_catalog_connection()
        s3_bucket = os.getenv('S3_BUCKET')

        if not s3_bucket:
            print("[ERROR] S3_BUCKET environment variable is required")
            return []

        # Get supported formats from env or magika_filter override
        supported_formats = get_supported_formats(magika_filter)
        print(f"[INFO] Querying for supported formats: {supported_formats}")

        # Join catalog_samples with repository_upload_sessions to:
        # 1. Filter by first_seen date from catalog_samples
        # 2. Only include samples that exist in repository_upload_sessions (not user uploads)
        # 3. Optionally filter to only already-analyzed samples (in basic_properties)
        analyzed_join = ""
        if analyzed:
            basic_table = f"{index_prefix}_basic_properties"
            analyzed_join = f"INNER JOIN {basic_table} bp ON cs.sha256 = bp.sha256"
            print(f"[INFO] Filtering to already-analyzed samples in {basic_table}")

        query = f"""
            SELECT DISTINCT cs.sha256, rus.filetype_magika, cs.first_seen
            FROM catalog_samples cs
            INNER JOIN repository_upload_sessions rus ON cs.sha256 = rus.sha256
            {analyzed_join}
            WHERE cs.first_seen >= %(start_date)s
              AND cs.first_seen < %(end_date)s
              AND rus.filetype_magika IN %(formats)s
        """
        params = {
            "start_date": start_date,
            "end_date": end_date,
            "formats": supported_formats
        }

        if repository:
            query += " AND rus.repository = %(repo)s"
            params["repo"] = repository

        if notes:
            query += " AND rus.notes LIKE %(notes)s"
            params["notes"] = f"%{notes}%"

        # Execute query
        result = client.query(query, parameters=params)

        # Build rows with s3_bucket and s3_key derived from sha256
        rows = []
        for row in result.result_rows:
            sha256 = row[0]
            # Handle binary string if needed
            if isinstance(sha256, bytes):
                sha256 = sha256.decode('utf-8')

            rows.append({
                'sha256': sha256,
                's3_bucket': s3_bucket,
                's3_key': generate_s3_key_from_hash(sha256),
                'filetype_magika': row[1],
                'first_seen': row[2]  # From catalog_samples
            })

        date_info = f"from {start_date} to {end_date}"
        repo_info = f" for repository {repository}" if repository else ""
        print(f"[DEBUG] Found {len(rows)} objects in catalog_samples {date_info}{repo_info}")

        # Extract SHA256 hashes from the results for bulk checking
        sha256_list = [row.get('sha256') for row in rows if row.get('sha256')]

        if sha256_list and not force:
            # Check which hashes are already in the database
            existing_hashes = is_in_db_bulk(sha256_list, index_prefix, decompile, yara_scan, magika_filter)
            print(f"[INFO] Found {len(existing_hashes)} objects already in database")

            # Filter out rows with existing hashes
            rows = [row for row in rows if row.get('sha256') not in existing_hashes]
            print(f"[INFO] After filtering, {len(rows)} objects remain to be processed")
        elif force:
            print(f"[INFO] Force mode: skipping deduplication check, processing all {len(sha256_list)} objects")

        # Randomize the order of rows before returning
        import random
        random.shuffle(rows)

        return rows
    except Exception as e:
        print(f"[ERROR] Failed to query catalog_samples by date range: {e}")
        return []
    finally:
        if 'client' in locals():
            client.close()


def fetch_analyzed_samples(
    index_prefix: str,
    decompile: bool,
    magika_filter: Optional[str] = None,
    yara_scan: bool = False,
    force: bool = False,
    rerun: bool = False
) -> List[Dict]:
    """
    Query samples from basic_properties that have already been analyzed.
    Useful for reprocessing with decompilation or specific modules.

    Args:
        index_prefix: Table prefix for ClickHouse
        decompile: Whether we're in decompile mode (affects filtering)
        magika_filter: Optional single filetype to filter by (overrides SUPPORTED_FORMATS)
        yara_scan: Whether we're in YARA-only mode (skips decompile filtering)
        force: Skip all deduplication checks when True
        rerun: Query disassembled table directly (only already-disassembled samples)

    Returns:
        List of dicts with sha256, s3_bucket, s3_key for each analyzed sample
    """
    try:
        client = settings.create_clickhouse_client()
        s3_bucket = os.getenv('S3_BUCKET')

        if not s3_bucket:
            print("[ERROR] S3_BUCKET environment variable is required")
            return []

        # Rerun mode: query directly from disassembled_functions_references
        # instead of basic_properties. This targets only samples that already
        # went through binja successfully.
        if rerun:
            disassembled_table = _get_code_dedup_table(magika_filter)
            basic_table = f"{index_prefix}_basic_properties"

            # Join with basic_properties to get filetype_magika and apply format filters
            conditions = []
            params = {}

            if magika_filter:
                conditions.append("bp.filetype_magika = %(magika)s")
                params["magika"] = magika_filter
            else:
                supported_formats = get_supported_formats()
                conditions.append("bp.filetype_magika IN %(formats)s")
                params["formats"] = supported_formats

            query = (
                f"SELECT DISTINCT d.sha256, bp.filetype_magika "
                f"FROM {disassembled_table} d FINAL "
                f"INNER JOIN {basic_table} bp FINAL ON d.sha256 = bp.sha256"
            )
            if conditions:
                query += " WHERE " + " AND ".join(conditions)

            result = client.query(query, parameters=params)

            rows = []
            for row in result.result_rows:
                sha256 = row[0]
                if isinstance(sha256, bytes):
                    sha256 = sha256.decode('utf-8')
                rows.append({
                    'sha256': sha256,
                    's3_bucket': s3_bucket,
                    's3_key': generate_s3_key_from_hash(sha256),
                    'filetype_magika': row[1]
                })

            print(f"[INFO] Rerun mode: found {len(rows)} already-disassembled samples in {disassembled_table}")

            import random
            random.shuffle(rows)
            return rows

        basic_table = f"{index_prefix}_basic_properties"

        # Build query
        conditions = []
        params = {}

        if magika_filter:
            conditions.append("filetype_magika = %(magika)s")
            params["magika"] = magika_filter
        else:
            supported_formats = get_supported_formats()
            conditions.append("filetype_magika IN %(formats)s")
            params["formats"] = supported_formats

        query = f"SELECT DISTINCT sha256, filetype_magika FROM {basic_table} FINAL"
        if conditions:
            query += " WHERE " + " AND ".join(conditions)

        result = client.query(query, parameters=params)

        rows = []
        for row in result.result_rows:
            sha256 = row[0]
            if isinstance(sha256, bytes):
                sha256 = sha256.decode('utf-8')
            rows.append({
                'sha256': sha256,
                's3_bucket': s3_bucket,
                's3_key': generate_s3_key_from_hash(sha256),
                'filetype_magika': row[1]
            })

        print(f"[DEBUG] Found {len(rows)} analyzed samples in {basic_table}")

        # In YARA-only mode, filter out already-scanned samples (unless force)
        if yara_scan and not force:
            sha256_list = [r['sha256'] for r in rows]
            if sha256_list:
                already_scanned = _check_yara_matches_bulk(sha256_list)
                print(f"[INFO] Found {len(already_scanned)} already YARA-scanned samples")
                rows = [r for r in rows if r['sha256'].lower() not in already_scanned]
                print(f"[INFO] After filtering, {len(rows)} samples remain for YARA scanning")
        # In decompile mode, filter out already-disassembled samples (unless force)
        # We check disassembly (not decompilation) because disassembly is the ground truth:
        # disassembly always succeeds, decompilation may not, so a missing decompile
        # entry doesn't mean the sample wasn't analyzed.
        elif decompile and not force:
            sha256_list = [r['sha256'] for r in rows]
            if sha256_list:
                disassembled_table = _get_code_dedup_table(magika_filter)
                batch_size = 3900

                already_disassembled = set()
                for i in range(0, len(sha256_list), batch_size):
                    batch = sha256_list[i:i+batch_size]
                    placeholders = "','".join(batch)
                    check_query = f"SELECT DISTINCT sha256 FROM {disassembled_table} FINAL WHERE sha256 IN ('{placeholders}')"
                    check_result = client.query(check_query)
                    for check_row in check_result.result_rows:
                        hash_value = check_row[0]
                        if isinstance(hash_value, bytes):
                            hash_value = hash_value.decode('utf-8')
                        already_disassembled.add(hash_value)

                print(f"[INFO] Found {len(already_disassembled)} already-disassembled samples")
                rows = [r for r in rows if r['sha256'] not in already_disassembled]
                print(f"[INFO] After filtering, {len(rows)} samples remain for decompilation")
        elif force:
            print(f"[INFO] Force mode: returning all {len(rows)} analyzed samples")

        # Randomize the order of rows before returning
        import random
        random.shuffle(rows)

        return rows
    except Exception as e:
        print(f"[ERROR] Failed to query analyzed samples: {e}")
        return []
    finally:
        if 'client' in locals():
            client.close()


def is_in_db(sha256, index_prefix, client=None):
    """
    Check if a sample with given SHA256 already exists in the database

    Args:
        sha256: File's SHA256 hash
        index_prefix: Table prefix for ClickHouse
        client: Optional ClickHouse client instance

    Returns:
        bool: True if file exists, False otherwise
    """
    table = f"{index_prefix}_basic_properties"
    close_client = False

    try:
        if client is None:
            client = settings.create_clickhouse_client()
            close_client = True

        # No need for FINAL when checking existence with LIMIT 1
        # Any version of the row proves the sample exists
        query = f"SELECT 1 FROM {table} WHERE sha256 = %(sha256)s LIMIT 1"
        result = client.query(query, parameters={"sha256": sha256})

        return len(result.result_rows) > 0
    except Exception as e:
        print(f"[ERROR] Failed to check if file is in DB: {e}")
        return False
    finally:
        if close_client and client:
            client.close()


def _get_code_dedup_table(magika_filter: Optional[str] = None) -> str:
    """
    Return the code-analysis table used for deduplication based on filetype.

    APK samples are disassembled into code_apk_smali_methods_references;
    everything else uses {CLICKHOUSE_CODE_PREFIX}_disassembled_functions_references.
    """
    if magika_filter == "apk":
        return "code_apk_smali_methods_references"
    code_prefix = os.getenv("CLICKHOUSE_CODE_PREFIX", "code_binja")
    return f"{code_prefix}_disassembled_functions_references"


def is_in_code_db(sha256, client=None, filetype=None):
    """
    Check if a sample with given SHA256 has already been disassembled.

    Args:
        sha256: File's SHA256 hash
        client: Optional ClickHouse client instance
        filetype: Magika filetype label (e.g. 'apk') to pick the right code table

    Returns:
        bool: True if file has been disassembled, False otherwise
    """
    table = _get_code_dedup_table(filetype)
    close_client = False

    try:
        if client is None:
            client = settings.create_clickhouse_client()
            close_client = True

        query = f"SELECT 1 FROM {table} WHERE sha256 = %(sha256)s LIMIT 1"
        result = client.query(query, parameters={"sha256": sha256})

        return len(result.result_rows) > 0
    except Exception as e:
        print(f"[ERROR] Failed to check if file is in code DB: {e}")
        return False
    finally:
        if close_client and client:
            client.close()


def _check_yara_matches_bulk(sha256_list):
    """
    Check which samples have already been YARA-scanned by querying yara_matches.

    The yara_matches table uses FixedString(32) binary sha256, so we convert
    hex strings with unhex().

    Args:
        sha256_list: List of hex SHA256 strings to check

    Returns:
        set: Set of hex SHA256 hashes that already have YARA matches
    """
    # unhex('64hexchars') adds 9 chars overhead per entry vs plain '64hexchars'.
    # 3900 works for plain strings (~67 chars each = 261K) but overflows
    # max_query_size (262144) with unhex() wrapping (~73 chars each = 285K).
    # 3500 × 73 = 255K stays safely under the limit.
    batch_size = 3500
    already_scanned = set()

    try:
        client = settings.create_clickhouse_client()

        total_batches = (len(sha256_list) + batch_size - 1) // batch_size
        for batch_num, i in enumerate(range(0, len(sha256_list), batch_size), 1):
            batch = sha256_list[i:i+batch_size]
            unhex_list = ",".join(f"unhex('{h}')" for h in batch)
            query = f"SELECT DISTINCT hex(sha256) FROM yara_matches FINAL WHERE sha256 IN ({unhex_list})"
            result = client.query(query)
            for row in result.result_rows:
                hash_value = row[0]
                if isinstance(hash_value, bytes):
                    hash_value = hash_value.decode('utf-8')
                already_scanned.add(hash_value.lower())

            if batch_num % 100 == 0 or batch_num == total_batches:
                print(f"[INFO] YARA dedup progress: batch {batch_num}/{total_batches}, found {len(already_scanned)} so far")

        print(f"[INFO] YARA dedup: found {len(already_scanned)} already-scanned samples")
        return already_scanned

    except Exception as e:
        raise RuntimeError(f"YARA dedup query failed — aborting to prevent reprocessing all samples: {e}")
    finally:
        if 'client' in locals():
            client.close()


def is_in_db_bulk(sha256_list, index_prefix, decompile, yara_scan=False, magika_filter=None):
    """
    Check which samples from a list of SHA256 hashes should be skipped.

    Args:
        sha256_list: List of SHA256 hashes to check
        index_prefix: Table prefix for ClickHouse
        decompile: Whether we're in decompile mode
        yara_scan: Whether we're in YARA-only mode (checks yara_matches table)
        magika_filter: Magika filetype label (e.g. 'apk') to pick the right code table

    Returns:
        set: Set of SHA256 hashes that should be skipped
    """
    if not sha256_list:
        return set()

    # YARA-only mode: check yara_matches table for already-scanned samples
    if yara_scan:
        return _check_yara_matches_bulk(sha256_list)

    basic_table = f"{index_prefix}_basic_properties"
    batch_size = 3900

    try:
        client = settings.create_clickhouse_client()

        # Step 1: Check basic_properties (required for both modes)
        in_basic_properties = set()
        for i in range(0, len(sha256_list), batch_size):
            batch = sha256_list[i:i+batch_size]
            placeholders = "','".join(batch)
            query = f"SELECT DISTINCT sha256 FROM {basic_table} FINAL WHERE sha256 IN ('{placeholders}')"
            result = client.query(query)
            for row in result.result_rows:
                hash_value = row[0]
                if isinstance(hash_value, bytes):
                    hash_value = hash_value.decode('utf-8')
                in_basic_properties.add(hash_value)

        if not decompile:
            # Analysis mode: skip samples already in basic_properties
            return in_basic_properties

        # Decompile mode: skip samples NOT in basic_properties + already decompiled
        not_in_basic = set(sha256_list) - in_basic_properties

        if not in_basic_properties:
            return set(sha256_list)  # None ready for decompilation

        # Step 2: Check disassembled table for samples that ARE in basic_properties
        # Disassembly is the ground truth for code analysis (it always succeeds,
        # unlike decompilation which may fail).
        disassembled_table = _get_code_dedup_table(magika_filter)

        already_disassembled = set()
        samples_to_check = list(in_basic_properties)
        for i in range(0, len(samples_to_check), batch_size):
            batch = samples_to_check[i:i+batch_size]
            placeholders = "','".join(batch)
            query = f"SELECT DISTINCT sha256 FROM {disassembled_table} FINAL WHERE sha256 IN ('{placeholders}')"
            result = client.query(query)
            for row in result.result_rows:
                hash_value = row[0]
                if isinstance(hash_value, bytes):
                    hash_value = hash_value.decode('utf-8')
                already_disassembled.add(hash_value)

        return not_in_basic | already_disassembled

    except Exception as e:
        print(f"[ERROR] Failed to check hashes in DB: {e}")
        return set()
    finally:
        if 'client' in locals():
            client.close()