À propos du projet

Opteryx Core est le moteur d'exécution SQL derrière opteryx.app, publié comme un fork d'Opteryx avec une API et une surface de configuration plus restreintes et plus affirmées, façonnées autour des charges de travail du service hébergé. Il est conçu pour des requêtes analytiques rapides et intensives en lecture sur des données columnar : il gère l'analyse SQL, la planification, le pushdown de prédicats, l'élagage de projection et l'exécution, de sorte que les jeux de données peuvent être interrogés depuis Python sans déployer un entrepôt séparé. Architecture La planification des requêtes est écrite en Python ; l'exécution des requêtes est native. Une fois que le planificateur produit un plan physique, le moteur l'exécute de bout en bout en code compilé — scan, opérateurs, ordonnancement et répartition — et ni PyArrow ni NumPy ne sont présents nulle part dans le moteur. Les résultats sont renvoyés sous forme de morsels Draken, des lots de colonnes diffusés au fur et à mesure que le moteur les produit, de sorte qu'un résultat volumineux n'a pas besoin de tenir en mémoire d'un seul coup. Un morsel expose num_rows, column_names et column(name).to_pylist() ; une fois le flux lu jusqu'au bout, session.rowcount indique le nombre de lignes délivrées. Premiers pas Les prérequis sont Python 3.11 ou version ultérieure, une chaîne d'outils C/C++ pour les compilations locales depuis les sources, et Rust/Cargo pour l'extension Rust. Installez avec pip install opteryx-core et importez-le sous le nom opteryx. Un exemple local minimal enregistre un espace de travail avec DiskConnector et interroge des noms de jeux de données séparés par des points, résolus relativement au répertoire de travail courant, par exemple data.planets se résolvant en ./data/planets, avec le format détecté à partir des extensions de fichier. Une interface en ligne de commande est également disponible via python -m opteryx pour interroger sans écrire de Python. Usages prévus Le projet mentionne : alimenter la couche d'exécution utilisée par opteryx.app, exécuter du SQL analytique sur des jeux de données locaux Parquet, CSV, JSONL et .skene, intégrer un moteur de requêtes dans des applications Python, scripts, notebooks et services, travailler sur les internes du moteur tels que la planification, l'exécution native et les performances des formats de fichier, et utiliser le moteur de fichiers ou le format .skene de manière autonome via les wheels rugo et libskene. Organisation du dépôt et distributions Le dépôt contient le moteur SQL (opteryx/), le substrat vectoriel columnar natif et les morsels (draken/), le moteur de fichiers pour la lecture et l'écriture de Parquet, CSV et JSONL (rugo/), le format de fichier columnar .skene avec lecteur, écrivain et spécification normative en C++ (skene/), les sources d'extension de calcul en Rust et C++ (src/), les instantanés de catalogue générés (reference/), les tests, les données de test, la documentation, les scripts de développement, les dépendances vendoriées et la machinerie de build partagée dans build_common.py. Une seule arborescence source produit trois wheels, à source unique dans build_common.py afin qu'ils ne puissent pas diverger : opteryx-core (importé sous le nom opteryx) regroupe le moteur SQL complet avec draken, rugo et skene ; rugo fournit le moteur de fichiers plus draken pour lire et écrire des fichiers sans le moteur SQL ; libskene (importé sous le nom skene) fournit le lecteur et l'écrivain .skene plus draken. draken n'est pas publié séparément. rugo et skene sont parallèles et aucun ne dépend de l'autre. Les wheels sont construits en CI, pas localement ; le développement local utilise les cibles du Makefile telles que make dev-install, make compile, make c, make q, make test, make dt et make check. Formats de fichier Les jeux de données sont lus par extension et un jeu de données est d'un seul format de bout en bout ; un répertoire mélangeant les formats est une erreur plutôt qu'une lecture au mieux. Parquet est le format par défaut pour les données stockées et l'échange, lu via rugo, tout comme CSV et JSONL/NDJSON. Le format .skene est natif de draken : il stocke un ou plusieurs row groups de vecteurs draken sans perte, y compris des raffinements que Parquet abandonne — une colonne IPv4 fait un aller-retour en tant que UINT32 raffiné par un descripteur logique IPV4, et l'encodage par dictionnaire et les indications de disposition sont restaurés plutôt que redérivés. Il n'est délibérément pas portable et aucun lecteur tiers n'est promis, donc Parquet reste le choix pour l'échange. Les fichiers Parquet, CSV et JSONL peuvent aussi être nommés directement avec les fonctions de table read_parquet(), read_csv() et read_jsonl() ; il n'existe pas de read_skene(). Intégration au catalogue Opteryx Core est décrit comme fonctionnant au mieux lorsqu'il est associé à la bibliothèque opteryx_catalog, qui est le modèle prévu pour les jeux de données nommés, les tables adossées à un catalogue et l'expérience générale utilisée dans opteryx.app. La configuration définit un connecteur par défaut avec catalogue, projet et base de données Firestore, et un bucket GCS, après quoi les jeux de données adossés au catalogue peuvent être interrogés avec des noms séparés par des points tels que public.space.planets. Pour les données locales, les espaces de travail enregistrés tels que testdata, scratch ou data sont typiques. Positionnement et contribution Le projet se présente comme un moteur analytique embarqué plutôt qu'une plateforme complète pour l'utilisateur final : pour une expérience hébergée et des fonctionnalités de service multi-tenant, opteryx.app est la voie recommandée, tandis que ce paquet fournit directement le moteur de base. Les contributions sont invitées sous forme d'utilisation sur des jeux de données personnels, de rapports de bogues lorsque les requêtes, les schémas ou les performances se comportent mal, de pull requests pour des correctifs, des tests, de la documentation ou des performances, et de cas de reproduction partagés, de requêtes échouantes et de fichiers Parquet aux cas limites. Le projet est sous licence Apache-2.0, avec une documentation sur docs.opteryx.app.