Giter Site home page Giter Site logo

platonb / high-perf-bio Goto Github PK

View Code? Open in Web Editor NEW
9.0 2.0 0.0 2.69 MB

Open-source toolkit that simplifies and speeds up work with bioinformatics data. high-perf-bio allows you easily upload VCF, BED or arbitrary tables to DB and execute popular bioinformatic queries without MongoDB Query Language knowledge.

License: GNU General Public License v3.0

Python 98.34% Shell 1.66%
bioinformatics mongodb vigg python pymongo vcf bed tsv

high-perf-bio's Issues

Программа пересечения и вычитания BED-интервалов

Уже есть подобная функциональность у bedtools, но хочется, чтобы были:

  • выше скорость;
  • меньше потребление RAM;
  • настройка глубины.

Отличие от bedtools (UPD-13.04.2020):
Каждый конечный файл - BED по левой коллекции с немодифицированными интервалами. Т.е. пересечение и вычитание применяется исключительно для отбора данных. bedtools же по умолчанию выводит пересёкшиеся или непересёкшиеся области исходных интервалов, что не сочеталось бы с настройкой глубины intersect_subtract.

Реализация:

  • Как часть intersect_subtract. UPD-13.04.2020: опасения, что программа станет слишком нагромождённой, были напрасны - интервальная функциональность хорошо вписалась в имеющийся код и не потребовала создавать отдельные аргументы командной строки.
  • Как отдельная программа. UPD-13.04.2020: я всегда стараюсь этого подхода избегать.
  • MongoDB-инструкция будет такого типа: {'$lookup': {'from': ..., 'let': {...}, 'pipeline': ..., 'as': ...}}.

Сохранять результаты в виде коллекций

Сейчас результаты выводятся в виде текстовых файлов. Для дальнейшего анализа их приходится вручную заливать в ещё одну БД. Надо бы сделать функциональность сохранения в базу напрямую.

Реализация:

  • Придумывать без особой необходимости новые опции я не люблю. Здесь есть прекрасная возможность обойтись имеющейся опцией -t. Любой путь (даже к домашней папке) содержит слэши. Сделаю так: значение -t без слэшей будет восприниматься как имя новой БД для результатов. Проработаю поведение на случай существования базы с тем же именем.
  • Сейчас в текстовые аутпуты добавляются строки с их историей. При перегонке из БД в БД нужно делать нечто аналогичное. Для метаданных можно смастерить либо отдельную коллекцию базы, либо особый документ каждой коллекции. При решении вопроса менеджмента метаданных хорошо бы заодно подумать над #9.
  • Обязательно сохранять в именах коллекций-потомков расширение файлов, по которым были получены родительские коллекции.
  • Индексировать новоиспечённые коллекции таким же образом, как это делает create_db.

[query] Считывать запросы из файлов

Сейчас программа принимает одиночный запрос в качестве аргумента командной строки. В реальных исследованиях приходится для каждого набора данных выполнять много запросов.

Реализация:

  • Считывать запросы из JSON-lines-файлов. Почему "файлов" во множественном числе? На практике запросы то и дело нужно разносить по группам. Пример - получение подпороговых и надпороговых по популяционным частотам вариантов:
{'INFO.0.AF_AFR': {'$lt': Decimal128('0.02')}, 'INFO.0.AF_EUR': {'$gt': Decimal128('0.3')}, 'INFO.0.AF_EAS': {'$gt': Decimal128('0.3')}}
{'INFO.0.AF_AFR': {'$lt': Decimal128('0.02')}, 'INFO.0.AF_EUR': {'$gt': Decimal128('0.3')}, 'INFO.0.AF_EAS': {'$lt': Decimal128('0.02')}}
{'INFO.0.AF_AFR': {'$lt': Decimal128('0.02')}, 'INFO.0.AF_EUR': {'$lt': Decimal128('0.02')}, 'INFO.0.AF_EAS': {'$gt': Decimal128('0.3')}}
{'$or': [{'INFO.0.AF_AFR': {'$gte': Decimal128('0.02')}}, {'INFO.0.AF_EUR': {'$lte': Decimal128('0.3')}}, {'INFO.0.AF_EAS': {'$lte': Decimal128('0.3')}}]}
{'$or': [{'INFO.0.AF_AFR': {'$gte': Decimal128('0.02')}}, {'INFO.0.AF_EUR': {'$lte': Decimal128('0.3')}}, {'INFO.0.AF_EAS': {'$gte': Decimal128('0.02')}}]}
{'$or': [{'INFO.0.AF_AFR': {'$gte': Decimal128('0.02')}}, {'INFO.0.AF_EUR': {'$gte': Decimal128('0.02')}}, {'INFO.0.AF_EAS': {'$lte': Decimal128('0.3')}}]}
  • Продумать структуру папок и файлов, чтобы она не была слишком сложной.
  • Поскольку при наличии индексов запросы выполняются мгновенно, распараллеливание не имеет особого значения. Ради унификации с другими компонентами high-perf-bio, сделаю распараллеливание по исходным (запрососодержащим) файлам.

[left_join] Отбирать поля на уровне MongoDB aggregation

Сейчас поля отбираются блоком Python-кода при потрошении курсора. Если реализовать обычный MongoDB-project {'field_A': 1, 'field_C': 1, field_E: 1}, то пропадут замержденные правые документы, и невозможно будет фильтровать результаты по охвату. Думаю, надо действовать через исключение полей: {'field_B': 0, 'field_D': 0}. Это сложнее, но вполне реализуемо.

При выводе результатов в другую БД нарушается порядок полей

Для VCF, BED и других биоинформатических форматов страшнее бага не придумать. Уже сообщил разработчиками MongoDB:
https://jira.mongodb.org/browse/SERVER-63853
Проголосуйте там, плз, откоментьте.

UPD.
Сейчас актуальнее прогососовать тут:
https://feedback.mongodb.com/forums/924280-database/suggestions/44875462-preserve-field-order-in-merge
(хотя по старой ссылке тоже не будет лишним)

Превьюер MongoDB-коллекций

Для оценки, из чего состоит база, как-то недостаточно вывода имён полей и индексов. Надо иметь возможность демонстрации целых документов.

Варианты реализации:

  • Часть print_db_info. Эта фича, по-моему, неплохо сюда вписывается.
  • Часть make_request. Возможно, сделаю опцию верхнего порога количества отобранных документов. Выставление небольшого значения будет равносильно предпросмотру.
  • Отдельная программа. Вряд ли, т.к. я выступаю за минимализацию количества программ в пределах одного репозитория.

Сортировка VCF и BED по хромосоме и позиции

Думаю над более конкретной фичей, чем #3.

Для VCF это не просто эстетическая штука, а обязательное требование. Что касается BED, там несортированность не смертельна, но снижает производительность некоторым программам (например, bedtools).

Реализация:

  1. create_db должен создавать компаундный индекс по первым двум (VCF) или трём (BED) полям. Без него парсеры при попытке сортировки по этим полям будут крайне тормозить и даже вылетать. Но от возможности создания раздельных индексов по упомянутым полям отказываться не хотелось бы. Я экспериментально убедился в том, что MongoDB разрешает совмещать несколько индексов для одного поля. Но предстоит ещё разобраться, как такое влияет на производительность запросов. Не запутается ли MongoDB при их выполнении? UPD-11.04.2020: не запутается.
  2. reindex_db. Возможно, будет полезен запрет на удаление обсуждаемого составного индекса.
  3. annotator, intersect_subtract, make_request. sort() для курсора и $sort в aggregation pipeline. UPD-18.04.2020: $sort надо держать в конце пайплайна, чтобы тот не мешал предыдущим звеньям использовать индекс. Сам он при этом индексом пользоваться не сможет, что должно частично компенсироваться режимом внешней сортировки.

[plugins] Программа пополнения ID-столбца src-VCF

Все компоненты high-perf-bio ориентированы на фильтрацию данных, размещённых в базы. Допущенное мною исключение - конкатенатор коллекций, да и там тоже возможна фильтрация ($project). Проги, сильно выходящие за рамки этого принципа, я буду размещать в отдельном каталоге - plugins. Планируемый обогатитель ID-столбца rs-идентификаторами, скорее всего, станет первым таким инструментом. Результаты будут формироваться не из коллекций, а из обычного VCF-файла. БД понадобится программе лишь как источник соответствия координат и аллелей с rsIDs.

[create] Возможность задать произвольный набор имён полей trg-db-TSV

Многие TSV, увы, идут без шапки. А программе она нужна для формирования имён полей в создаваемой базе. Сейчас create подгружает имена полей из самой первой или первой после метаинфы табличной строки. В результате, в случае отсутствия в исходной таблице шапки, ключи документов получатся бессмысленными. Проще прописать шапку на уровне составления команды, чем расковыривать здоровенную таблицу. Кроме того, в ряде случаев, например, при работе с SAM, наличие шапки не приветствуется спецификациями формата. Кстати, о SAM: у меня в далеко идущих планах есть его полная поддержка (#21), но появление возможности добавления кастомного набора ключей было бы неплохим временным хаком, чтобы уже сейчас удавалось загружать SAM в БД хотя бы под видом TSV.

Реализация:
Как в CLI, так и в GUI надо запрашивать у исследователя строку, где элементы соединены с помощью \t. В CLI напоминать о необходимости заключать эту строку в кавычки. Что касается GUI, надеюсь, как можно скорее в @streamlit появится виждет каскадного ввода, и процесс построения шапки значительно упростится. Голосуйте за создание этого виджета!

Сохранять результаты в gzip-файлы

Многие компоненты принимают сжатые таблицы, но выводят несжатые. Перед тем, как подать вывод одного компонента на вход другому, приходится отдельно запускать башовый однострочник-сжиматель. При частой работе с high-perf-bio эта мелкая недоработка начинает бесить.

Сортировка проиндексированных полей

Проиндексированные поля, вероятнее всего, являются наиболее значимыми для исследователя. Хорошо бы выдавать таблицы, отсортированные по соответствующим столбцам. Т.к. поля - с индексами, на производительность сортировка не должна влиять.

Переименовать args в inp

Пусть это будет единым для CLI и GUI именем объектов, накапливающих пользовательский ввод.

Переформатировать весь тулкит с помощью autopep8

autopep8 я выбрал, ибо он - наименее агрессивный форматтер. Хочется сохранить собственный, выработанный годами код-стайл, но при этом по-максимуму соблюдать PEP-8.

  • autopep8 иногда довольно неэстетично разносит длинные по его мнению строки кода на несколько строк, поэтому зададим ему заведомо недостижимое значение максимальной длины строки:
"autopep8.args": [
  "--max-line-length=1000"
]

Подробная инструкция для начинающих любителей Visual Studio Code:

  1. CTRL+,
  2. Autopep8: Args
  3. Добавить элемент
  4. --max-line-length=1000
  5. OK
  • Несколько лет назад наличие __pycache__-папок портило результаты ld-tools. С тех пор я запрещаю их создание с помощью sys.dont_write_bytecode = True. Но эта строка должна идти в самом начале модуля, что, естественно, выбесит форматтер. Надо временно притупить его бдительность:
# autopep8: off
import sys; sys.dont_write_bytecode = True
# autopep8: on
  • Просто, чтобы не забыть: запуск переформатирования в vscode - CTRL+SHIFT+I

[create] Поддержка CSQ-INFO в VCF

Сейчас может читаться и создаваться INFO-столбец, оформленный по стандарту ANN. Но существует и другой стандарт - CSQ (ConSeQuence annotations). В идеале надо, чтобы он тоже поддерживался.

Вынести повторяющиеся от компонента к компоненту участки __init__ в отдельный модуль

Код инитов тогда существенно разгрузится.

Кандидаты на вынос:

  • Конфликт имён БД.
  • Количество процессов.
  • Дополнительный запрос.
  • Сортировка.
  • Отбор полей.
  • Вторичный разделитель.
  • Индексация.

Возможно, стоит также перенести в этот модуль функцию parse_nested_objs.

[create_db] Поддержка JSON Lines

Некоторые важные данные, например, источник соответствия rsIDs разных версий dbSNP, доступны в виде сабжа.

Реализиция:

  • Поскольку каждый элемент JSON Lines идёт отдельной строкой, то считывание будет обычное - построчное, с накоплением в списки заданного размера.
  • С учётом того, что объекты могут быть непредсказуемой вложенности, не понятно, как делать автоопределение типов данных. Скорее всего, придётся полагаться на правильность определения со стороны авторов JSON-файлов.
  • Квазирасширение надо давать, очевидно, TSV.

[download_bio_data] Каждый процесс - скачивание данных одного портала

Сейчас программа параллельно качает несколько файлов из одного портала, потом то же самое - со следующего портала. Это создаёт чрезмерную нагрузку на сервер и вряд ли способствует значимому повышению скорости скачивания. Возможно, именно из-за такого поведения проги FTP Европейского Института Биоинформатики (EMBL-EBI) начинает вредничать, то и дело обрубая загрузку. Хочу переписать программу, чтобы параллелить на уровне порталов, а не файлов.

[dock] Вывод каркаса запроса в конечную метастроку

Для каждой строки аннотируемой таблицы формируется свой запрос, но выделить общую часть всех ежестрочных запросов всё же возможно. С появлением функциональности дозапроса становится очевидной необходимость вывода метастроки с запросом, пусть и не до конца сформированным.

[create_db] Возможность дозаписывать базы

Хочется, конечно, следовать ранее заявленному правилу "новый результат - в новый файл или базу", но практика показала, что фича очень нужная.

Чтобы исследователь осознавал, что модифицирует имеющуюся базу, думаю, стоит сделать отдельный разрешающий флажок.

[count] Ошибка горизонтальной конкатенации элементов, если часть из них - массивы

Удивительно, что я раньше этого не заметил. Если, к примеру, среди вариантов попались мультиаллельники, MongoDB выдаст Unsupported conversion from array to string. Пример куска агрегации, не рассчитанного на списки:
{'$group': {'_id': {'$concat': [{'$toString': '$ID'}, '_', {'$toString': '$REF'}, '_', {'$toString': '$ALT'}]}, <...>}}

[create] Дробить генотипы VCF, получая списки

Для более гибкого запрашивания.

Как это будет выглядеть:
'1│0' --> [1, '│', 0]

Обратная совместимость.
Обновлять doc_to_line не придётся, т.к. он изначально способен работать со списками внутри GT.

[Streamlit GUI] Выбор полей колекций через st.multiselect

Раз GUI-модули теперь подгружают MongoClient (#30), то открывается возможность сделать мышко-ориентированный выбор монгячих полей. Поскольку st.multiselect при невыборе выдаёт пустой список, а не пустую строку, понадобится учесть это в инитах соответствующих главных модулей.

[_gui_streamlit] Создать запускабельный двойным кликом .desktop-файл

Сабж представляю себе таким:

[Desktop Entry]
Type=Application
Version=1.0
Name=high-perf-bio
Comment=Open-source toolkit that simplifies and speeds up work with bioinformatics data

#Replace SPICIFY/PATH/TO with real path:
Path=SPICIFY/PATH/TO/high-perf-bio-master

Exec=bash -c 'streamlit run _gui_streamlit.py'
Icon=utilities-terminal
Terminal=true
Categories=Application;

#Next steps:
#cd SPICIFY/PATH/TO/high-perf-bio-master
#sudo cp _gui_streamlit.desktop /usr/share/applications/

Но, как минимум, в elementary OS двойной клик лишь открывает _gui_streamlit.desktop в блокноте. Если переместить файл в /usr/share/applications/, исполняться он от этого не научится.

Terminal=true, в Exec прописана работоспособная команда... Что ещё нужно для счастья?

Скрипт подсчёта строк

Уже есть такой продукт в старом скриптовом проекте. Но хочу переписать с нуля и переосмыслить функциональность.

  • CLI и GUI.
  • Стиль кода по стандартам high-perf-bio.
  • Количество строк для каждого файла, для всех файлов каждой папки и, возможно, для всех файлов дерева папок.
  • Опциональный подсчёт не полных строк, а значений столбца или нескольких столбцов.
  • Сохранение или удаление дублей.

Разлочить проджекшен src-db-VCF

Сейчас отбирать поля ex-VCF запрещено, т.к. непонятно, как быть с INFO, FORMAT и полями с генотипами. Но есть ведь задачи типа выделения из VCF координат и/или rsIDs и/или аллелей. Так что разлочить надо, но с ворнингом, что сложные объекты тупо отсериализуются, а к вложенным полям доступа нет из-за вредности MongoDB.

[create] Недостаточно глубоко парсится INFO dbSNP

К примеру, строка

RS=1570391677;dbSNPBuildID=154;SSR=0;PSEUDOGENEINFO=DDX11L1:100287102;VC=SNV;GNO;FREQ=KOREAN:0.9891,0.0109|SGDP_PRJ:0,1;COMMON

преобразуется в

    "INFO": [{
            "RS": 1570391677,
            "dbSNPBuildID": 154,
            "SSR": 0,
            "PSEUDOGENEINFO": "DDX11L1:100287102",
            "VC": "SNV",
            "FREQ": ["KOREAN:0.9891", "0.0109|SGDP_PRJ:0", 1]
        },
        ["GNO", "COMMON"]
    ]

Очевидно, что значения подполей вроде PSEUDOGENEINFO и FREQ должны делаться словарями.

Игнорируются строки метаинформации VCF

Сейчас они выбрасываются ещё на этапе создания БД и не могут оказаться в результатах парсинга коллекций. Без строк метаинформации получающиеся таблицы не полностью соответствуют стандарту VCF. Надо бы эти строки протаскивать в базу и кидать в конечные файлы. Но остаются вопросы, требующие углубления в спецификации формата.

  • На сегодняшний день компоненты high_perf_bio прописывают в конечные файлы несколько закомментированных строк, хранящих в себе историю этих файлов. Позволительно ли их сочетать с генерируемыми коллерами метастроками VCF?
  • Программы, разумеется, выдают не полные VCF, а лишь строки, соответствующие запросам. Актуальны ли для фильтрованного VCF метастроки залитого в базу VCF?

Программа развёртывания и свёртывания src-db-VCF по полю ALT

Раз задумка касается только VCF, то проге быть плагином.

Прототип:
MongoDB_unwind_group

Если с $unwind-стадией всё просто, то с формированием $group придётся чуть повозиться:

  1. Собрать имена всех полей (N штук) исходного VCF в список;
  2. Добавить в $group ID в качестве _id;
  3. Сгенерировать N $first-выражений, вставив туда вышеупомянутые имена полей;
  4. Добавить эти выражения в $group;
  5. Для ALT заменить $first на $push.

Мягкая проверка правильности ввода имени поля

Жёсткая проверка правильности ввода имён полей путём поиска по ключам первого документа первой коллекции иногда всё-таки приводит к недоразумениям. К примеру, в первом документе dbSNP ex-VCF, насколько я помню, нет GENEINFO (или PSEUDOGENEINFO - лень проверять), и если попытаться выполнить по нему запрос, вылезет ошибка, что, мол, этого поля нет во всей коллекции. От проверки отказываться не буду, но заменю исключение на предупреждение. Понадобится модуль warnings стандартной библиотеки.

Возможность подачи произвольного (до)запроса

query потрясающ, но во многих ситуациях его функциональность избыточна. Нужно, чтобы как можно больше инструментов high-perf-bio, отличных от query, позволяли применить одиночный пользовательский запрос, дополняющий запрос основной. Принимать произвольное MQL/PyMongo-выражение программы должны будут через соответствующий аргумент CLI или виджет Streamlit-GUI.

Создать Dockerfile

Зачем?

  • Не на все дистрибутивы легко установить MongoDB. А для rpm-ostree-based систем вообще не понятно, как это делать.
  • Чтобы избавить вас от любой предэксплуатационной возни в принципе.

Недостаток использования high-perf-bio как Docker-контейнера: команды запуска компонентов распухнут из-за необходимости монтирования томов.

Адаптировать к запуску из GUI

Планирую рефакторинг основных компонентов и плагинов, который позволит запускать их с помощью GUI или импортировать в другие Python-программы.

  • Переименовать класс PrepSingleProc в Main, т.к. его __init__ набивается всё большим количеством атрибутов, не связанных напрямую с распараллеливаемой функцией.
  • Перенести алгоритм определения оптимального количества процессов в __init__ вышеупомянутого Main.
  • Всё, что вне Main, сделать выполняемым только при прямом запуске модуля:
if __name__ == '__main__':
  • (UPD-2022.04.25) Вынести в отдельный набор модулей приветственные тексты всех CLI, чтобы их GUI тоже мог задействовать.
  • (UPD-2022.04.26) Принимать пустые значения не только в виде None, но и в виде ''. Первое любит возвращать argparse, второе - streamlit.

GUI (Streamlit)

Задачи:

  • Создать классы, в инитах которых будет накапливаться инпут, полностью совместимый с уже привычным из argparse.
    • Знакомые по CLI приветственные принты реализовать в виде раскрывающихся блоков (st.expander).
    • Все виджеты кроме выбора компонента high-perf-bio завернуть в формы (st.form) с кнопкой запуска (st.form_submit_button). Если тупо, без формы, накидать виджетов, то этап сбора настроек будет проскакиваться.
  • Создать модуль (рабочее название - GUI.py):
    • Импорт GUI-классов, описанных чуть выше.
    • Импорт основных классов всех компонентов с подачей в иниты объектов, мимикрирующих под творения argparse.
    • Выпадающий список с тулзами.
    • Проверка, нажал ли исследователь кнопку запуска.
    • Спиннер (st.spinner), крутящийся, пока задача считается.
  • Вынести тексты, описывающие тулзы, в отдельные модули, и импортировать их как из CLI, так и из GUI (обновлённый meta-issue #15).
  • Ещё касательно #15: в инитах основных модулей принимать проигнорированную исследователем опцию не только в виде None, но и в виде ''.
  • Избавиться от интерактивного диалога пересоздания БД в пользу соответствующего элемента интерфейса (#25).

Проблемы:

  • Невозможно на этапе получения сигнала от виджета проверить, ввёл ли исследователь путь к папке / имя БД (апстрим-фичреквест: streamlit/streamlit#4645).
  • Для запуска веб-интерфейса придётся всё равно иметь дело с командной строкой (streamlit run GUI.py). Я-то потерплю, а каково будет небиоинформатикам? Возможное решение - создать .desktop-ярлык, но это не так уж и просто: #26.

Аргумент/виджет разрешения пересоздать БД

Сейчас, если программа обнаружила конфликт имён, в диалоговом режиме предлагается стирание БД. Но этот способ слишком привязан к консоли, усложняя разработку GUI (#24). Сделаю для каждого компонента, способного создавать БД, универсальный CLI- и GUI-элемент erase-existing-db. Важные детали:

  • DbAlreadyExistsError оставлю на случай попытки стереть исходную базу, но переселю это исключение в common_errors.
  • В create будет по-прежнему append, но лучше его переименовать в нечто более человеко-понятное, например, replenish-existing-db.

[create] Поддержка SAM

  • Хедер придётся, как и в случае с BED, хардкодить. Он, как минимум, такой:
    QNAME, FLAG, RNAME, POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL
  • Теги будут посылаться в подструктуры ещё одного поля. Хоть я и против вмешательства в спеки форматов, придётся выдумать этому полю имя. Допустим, OPTIONAL.

[ljoin] $lookup не задействует индекс при работе с интервалами

Вчера, по-сути, завершил проект high-perf-bio, реализовав в left_join отбор геномных интервалов одной MongoDB-коллекции по их вхождению/невхождению в интервалы из других коллекций БД. Но, как выяснилось, не без ложки дёгтя.

Пояснение для IT-специалистов, не специализирующихся на работе с генетическими данными. Что такое геномный интервал? Есть хромосомы - надмолекулярные сткуктуры, включающие, помимо всего прочего, ДНК. Есть нуклеотиды - мономеры ДНК. Сослаться на тот или иной участок ДНК можно так: обозначение хромосомы, номер стартового нуклеотида, номер конечного нуклеотида. Эти два нуклеотида - границы как раз геномного интервала. В биоинформатических таблицах чаще всего мы видим интервалы с выявленным влиянием на организм.

Aggregation pipeline из программы left_join, построенный по официальным докам MongoDB, выдаёт правильные результаты, но работает бесконечно долго для больших коллекций. Ни compound, ни одиночные индексы не ускоряют вычисление. Вот основа пайплайна - код левостороннего внешнего объединения коллекций - источника описываемой проблемы:

pipeline = [{'$lookup': {'from': right_coll_name,
                         'let': {'chrom': '$chrom', 'start': '$start', 'end': '$end'},
                         'pipeline': [{'$match': {'$expr': {'$and': [{'$eq': ['$$chrom', '$chrom']},
                                                                     {'$lt': [{'$max': ['$$start', '$start']},
                                                                              {'$min': ['$$end', '$end']}]}]}}}],
                         'as': right_coll_name.replace('.', '_')}} for right_coll_name in right_coll_names]

Эта же конструкция, но чуть упрощённая (Ilya Vorontsov):

pipeline = [{'$lookup': {'from': right_coll_name,
                         'let': {'chrom': '$chrom', 'start': '$start', 'end': '$end'},
                         'pipeline': [{'$match': {'$expr': {'$and': [{'$eq': ['$$chrom', '$chrom']},
                                                                     {'$lt': ['$$start', '$end']},
                                                                     {'$lt': ['$start', '$$end']}]}}}],
                         'as': right_coll_name.replace('.', '_')}} for right_coll_name in right_coll_names]

Каждый объединённый документ представляет собой документ "левой" коллекции, в который вложены отвечающие запросу документы "правых" коллекций. Если в "правой" коллекции не нашлось соответствий, в объединённый документ попадает пустой список.

Кто-нибудь знает, как решить/обойти проблему игнора индексов?

P.S. Я уже создал аналогичную тему на официальном форуме MongoDB, но там далеко не всегда отвечают. Поэтому очень надеюсь на помощь коллег, знакомых и других посетителей репозитория.

@VorontsovIE, @yustinaivanova, может у вас будут какие-то идеи? Был бы очень благодарен.

Предполагаемые тормозящие факторы:

  • Вложенный пайплайн, какое бы выражение в нём ни было. UPD: точно нет: если попробовать объединять аналогичной конструкцией не по интервалам, а по одиночным полям, то всё посчитается почти мгновенно.
  • Подсчёт максимальной стартовой границы и минимальной конечной (Ilya Vorontsov).
  • Сочетание работы по хромосомам с работой по интеравалам.
  • Добавляемая к $lookup-пайплайну сортировка. Сразу говорю, что она не влияет.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.