cocoindex 0.1.35__tar.gz → 0.1.36__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cocoindex-0.1.35 → cocoindex-0.1.36}/Cargo.lock +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/Cargo.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/PKG-INFO +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/basics.md +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/flow_methods.mdx +47 -18
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/code_embedding/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/requirements.txt +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/requirements.txt +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding_qdrant/pyproject.toml +1 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/db_tracking.rs +25 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/dumper.rs +8 -5
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/evaluator.rs +14 -10
- cocoindex-0.1.36/src/execution/indexing_status.rs +59 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/mod.rs +1 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/row_indexer.rs +68 -61
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/source_indexer.rs +21 -7
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/interface.rs +24 -6
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/sources/google_drive.rs +32 -13
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/sources/local_file.rs +29 -16
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/server.rs +4 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/service/error.rs +4 -4
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/service/flows.rs +79 -39
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/auth_registry.rs +7 -1
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.cargo/config.toml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.env.lib_debug +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/scripts/update_version.sh +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/workflows/CI.yml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/workflows/_test.yml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/workflows/docs.yml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.github/workflows/release.yml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.gitignore +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/.vscode/settings.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/CODE_OF_CONDUCT.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/CONTRIBUTING.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/LICENSE +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/dev/neo4j.yaml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/dev/postgres.yaml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/.gitignore +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/about/community.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/about/contributing.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/ai/llm.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/cli.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/custom_function.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/data_example.svg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/data_types.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/flow_def.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/flow_example.svg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/core/initialization.mdx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/getting_started/installation.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/getting_started/markdown_files.zip +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/getting_started/overview.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/getting_started/quickstart.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/ops/functions.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/ops/sources.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docs/ops/storages.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/docusaurus.config.ts +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/package.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/sidebars.ts +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/src/css/custom.css +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/src/theme/Root.js +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/static/.nojekyll +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/static/img/docusaurus.png +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/static/img/favicon.ico +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/static/img/icon.svg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/static/robots.txt +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/tsconfig.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/docs/yarn.lock +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/code_embedding/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/code_embedding/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/code_embedding/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/markdown_files/1706.03762v7.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/markdown_files/1810.04805v2.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/docs_to_knowledge_graph/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/.dockerignore +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/compose.yaml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/dockerfile +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/sample_code/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/fastapi_server_docker/src/cocoindex_funs.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/.env.example +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/.gitignore +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/data/1706.03762v7.docx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/data/1810.04805v2.docx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/gdrive_text_embedding/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/.gitignore +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/index.html +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/package-lock.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/package.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/src/App.jsx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/src/main.jsx +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/src/style.css +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/frontend/vite.config.js +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/img/cat1.jpeg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/img/dog1.jpeg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/img/elephant1.jpg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/img/giraffe.jpg +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/image_search_example/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/img/cocoinsight.png +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/img/neo4j.png +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p1.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p2.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p3.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p4.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p5.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p6.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p7.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p8.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/products/p9.json +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/Text_Embedding.ipynb +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding_qdrant/.env +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding_qdrant/README.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding_qdrant/main.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/pyproject.toml +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/__init__.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/auth_registry.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/cli.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/convert.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/flow.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/functions.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/index.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/lib.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/llm.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/op.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/py.typed +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/query.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/runtime.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/setting.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/setup.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/sources.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/storages.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/tests/__init__.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/tests/test_convert.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/python/cocoindex/typing.py +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/field_attrs.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/json_schema.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/schema.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/spec.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/base/value.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/builder/analyzed_flow.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/builder/analyzer.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/builder/flow_builder.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/builder/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/builder/plan.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/db_tracking_setup.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/live_updater.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/memoization.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/query.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/execution/stats.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/lib.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/lib_context.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/llm/anthropic.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/llm/gemini.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/llm/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/llm/ollama.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/llm/openai.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/factory_bases.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/functions/extract_by_llm.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/functions/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/functions/parse_json.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/functions/split_recursively.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/py_factory.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/registration.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/registry.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/sdk.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/sources/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/storages/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/storages/neo4j.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/storages/postgres.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/storages/qdrant.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/ops/storages/spec.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/prelude.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/py/convert.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/py/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/service/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/service/search.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/settings.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/components.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/db_metadata.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/driver.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/setup/states.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/db.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/fingerprint.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/immutable.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/mod.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/retriable.rs +0 -0
- {cocoindex-0.1.35 → cocoindex-0.1.36}/src/utils/yaml_ser.rs +0 -0
@@ -11,7 +11,7 @@ CocoIndex is an ETL framework for building indexes from specified data sources,
|
|
11
11
|
|
12
12
|
## Indexing flow
|
13
13
|
|
14
|
-
An indexing flow extracts data from
|
14
|
+
An indexing flow extracts data from specified data sources, upon specified transformations, and puts the transformed data into specified storage for later retrieval.
|
15
15
|
|
16
16
|
An indexing flow has two aspects: data and operations on data.
|
17
17
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
---
|
2
2
|
title: Flow Running
|
3
|
+
toc_max_heading_level: 4
|
3
4
|
description: Run a CocoIndex Flow, including build / update data in the target storage and evaluate the flow without changing the target storage.
|
4
5
|
---
|
5
6
|
|
@@ -70,8 +71,7 @@ This is to achieve best efficiency.
|
|
70
71
|
|
71
72
|
### One time update
|
72
73
|
|
73
|
-
|
74
|
-
<TabItem value="shell" label="Shell" default>
|
74
|
+
#### CLI
|
75
75
|
|
76
76
|
The `cocoindex update` subcommand creates/updates data in the target storage.
|
77
77
|
|
@@ -81,7 +81,9 @@ Once it's done, the target data is fresh up to the moment when the function is c
|
|
81
81
|
python main.py cocoindex update
|
82
82
|
```
|
83
83
|
|
84
|
-
|
84
|
+
#### Library API
|
85
|
+
|
86
|
+
<Tabs>
|
85
87
|
<TabItem value="python" label="Python">
|
86
88
|
|
87
89
|
The `update()` async method creates/updates data in the target storage.
|
@@ -108,8 +110,7 @@ A data source may enable one or multiple *change capture mechanisms*:
|
|
108
110
|
|
109
111
|
Change capture mechanisms enable CocoIndex to continuously capture changes from the source data and update the target data accordingly, under live update mode.
|
110
112
|
|
111
|
-
|
112
|
-
<TabItem value="shell" label="Shell" default>
|
113
|
+
#### CLI
|
113
114
|
|
114
115
|
To perform live update, run the `cocoindex update` subcommand with `-L` option:
|
115
116
|
|
@@ -120,7 +121,9 @@ python main.py cocoindex update -L
|
|
120
121
|
If there's at least one data source with change capture mechanism enabled, it will keep running until the aborted (e.g. by `Ctrl-C`).
|
121
122
|
Otherwise, it falls back to the same behavior as one time update, and will finish after a one-time update is done.
|
122
123
|
|
123
|
-
|
124
|
+
#### Library API
|
125
|
+
|
126
|
+
<Tabs>
|
124
127
|
<TabItem value="python" label="Python">
|
125
128
|
|
126
129
|
To perform live update, you need to create a `cocoindex.FlowLiveUpdater` object using the `cocoindex.Flow` object.
|
@@ -145,8 +148,10 @@ my_updater = cocoindex.FlowLiveUpdater(
|
|
145
148
|
|
146
149
|
A `FlowLiveUpdater` object supports the following methods:
|
147
150
|
|
151
|
+
* `start()`: Start the updater.
|
152
|
+
CocoIndex will continuously capture changes from the source data and update the target data accordingly in background threads managed by the engine.
|
148
153
|
* `abort()`: Abort the updater.
|
149
|
-
* `wait()
|
154
|
+
* `wait()`: Wait for the updater to finish. It only unblocks in one of the following cases:
|
150
155
|
* The updater was aborted.
|
151
156
|
* A one time update is done, and live update is not enabled:
|
152
157
|
either `live_mode` is `False`, or all data sources have no change capture mechanisms enabled.
|
@@ -154,6 +159,8 @@ A `FlowLiveUpdater` object supports the following methods:
|
|
154
159
|
|
155
160
|
```python
|
156
161
|
my_updater = cocoindex.FlowLiveUpdater(demo_flow)
|
162
|
+
# Start the updater.
|
163
|
+
my_updater.start()
|
157
164
|
|
158
165
|
# Perform your own logic (e.g. a query loop).
|
159
166
|
...
|
@@ -163,26 +170,47 @@ print(my_updater.update_stats())
|
|
163
170
|
# Abort the updater.
|
164
171
|
my_updater.abort()
|
165
172
|
# Wait for the updater to finish.
|
166
|
-
|
173
|
+
my_updater.wait()
|
167
174
|
```
|
168
175
|
|
169
176
|
Python SDK also allows you to use the updater as a context manager.
|
170
|
-
It will abort and wait for the updater to finish automatically when the context is exited.
|
171
|
-
The following code is equivalent to the code above:
|
177
|
+
It will automatically start the updater during the context entry, and abort and wait for the updater to finish automatically when the context is exited.
|
178
|
+
The following code is equivalent to the code above (if no early return happens):
|
172
179
|
|
173
180
|
```python
|
174
|
-
|
181
|
+
with cocoindex.FlowLiveUpdater(demo_flow) as my_updater:
|
175
182
|
# Perform your own logic (e.g. a query loop).
|
176
183
|
...
|
177
184
|
print(my_updater.update_stats())
|
178
185
|
```
|
179
186
|
|
180
|
-
|
187
|
+
CocoIndex also provides asynchronous versions of APIs for blocking operations, including:
|
181
188
|
|
182
|
-
|
183
|
-
|
189
|
+
* `start_async()` and `wait_async()`, e.g.
|
190
|
+
|
191
|
+
```python
|
192
|
+
my_updater = cocoindex.FlowLiveUpdater(demo_flow)
|
193
|
+
# Start the updater.
|
194
|
+
await my_updater.start_async()
|
195
|
+
|
196
|
+
# Perform your own logic (e.g. a query loop).
|
184
197
|
...
|
185
|
-
|
198
|
+
|
199
|
+
# Print the update stats.
|
200
|
+
print(my_updater.update_stats())
|
201
|
+
# Abort the updater.
|
202
|
+
my_updater.abort()
|
203
|
+
# Wait for the updater to finish.
|
204
|
+
await my_updater.wait_async()
|
205
|
+
```
|
206
|
+
* Async context manager, e.g.
|
207
|
+
|
208
|
+
```python
|
209
|
+
async with cocoindex.FlowLiveUpdater(demo_flow) as my_updater:
|
210
|
+
# Perform your own logic (e.g. a query loop).
|
211
|
+
...
|
212
|
+
print(my_updater.update_stats())
|
213
|
+
```
|
186
214
|
|
187
215
|
</TabItem>
|
188
216
|
</Tabs>
|
@@ -191,8 +219,7 @@ with cocoindex.FlowLiveUpdater(demo_flow) as my_updater:
|
|
191
219
|
|
192
220
|
CocoIndex allows you to run the transformations defined by the flow without updating the target storage.
|
193
221
|
|
194
|
-
|
195
|
-
<TabItem value="shell" label="Shell" default>
|
222
|
+
### CLI
|
196
223
|
|
197
224
|
The `cocoindex evaluate` subcommand runs the transformation and dumps flow outputs.
|
198
225
|
It takes the following options:
|
@@ -208,7 +235,9 @@ Example:
|
|
208
235
|
python main.py cocoindex evaluate --output-dir ./eval_output
|
209
236
|
```
|
210
237
|
|
211
|
-
|
238
|
+
### Library API
|
239
|
+
|
240
|
+
<Tabs>
|
212
241
|
<TabItem value="python" label="Python">
|
213
242
|
|
214
243
|
The `evaluate_and_dump()` method runs the transformation and dumps flow outputs to files.
|
@@ -3,4 +3,4 @@ name = "code-embedding"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for cocoindex: build embedding index based on source code."
|
5
5
|
requires-python = ">=3.10"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1"]
|
@@ -3,4 +3,4 @@ name = "manuals-to-kg"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for cocoindex: extract triples from files and build knowledge graph."
|
5
5
|
requires-python = ">=3.10"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1"]
|
@@ -3,4 +3,4 @@ name = "gdrive-text-embedding"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for cocoindex: build embedding index based on Google Drive files."
|
5
5
|
requires-python = ">=3.11"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1"]
|
@@ -4,7 +4,7 @@ version = "0.1.0"
|
|
4
4
|
description = "Simple example for cocoindex: extract structured information from a Markdown file using LLM."
|
5
5
|
requires-python = ">=3.10"
|
6
6
|
dependencies = [
|
7
|
-
"cocoindex>=0.1.
|
7
|
+
"cocoindex>=0.1.35",
|
8
8
|
"python-dotenv>=1.0.1",
|
9
9
|
"marker-pdf>=1.5.2",
|
10
10
|
]
|
{cocoindex-0.1.35 → cocoindex-0.1.36}/examples/product_taxonomy_knowledge_graph/pyproject.toml
RENAMED
@@ -3,4 +3,4 @@ name = "cocoindex-ecommerce-taxonomy"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for CocoIndex: extract taxonomy from e-commerce products and build knowledge graph."
|
5
5
|
requires-python = ">=3.10"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1", "jinja2>=3.1.6"]
|
@@ -3,4 +3,4 @@ name = "text-embedding"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for cocoindex: build embedding index based on local text files."
|
5
5
|
requires-python = ">=3.10"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1"]
|
@@ -3,4 +3,4 @@ name = "text-embedding-qdrant"
|
|
3
3
|
version = "0.1.0"
|
4
4
|
description = "Simple example for cocoindex: build embedding index based on local text files."
|
5
5
|
requires-python = ">=3.10"
|
6
|
-
dependencies = ["cocoindex>=0.1.
|
6
|
+
dependencies = ["cocoindex>=0.1.35", "python-dotenv>=1.0.1"]
|
@@ -211,3 +211,28 @@ impl ListTrackedSourceKeyMetadataState {
|
|
211
211
|
sqlx::query_as(&self.query_str).bind(source_id).fetch(pool)
|
212
212
|
}
|
213
213
|
}
|
214
|
+
|
215
|
+
#[derive(sqlx::FromRow, Debug)]
|
216
|
+
pub struct SourceLastProcessedInfo {
|
217
|
+
pub processed_source_ordinal: Option<i64>,
|
218
|
+
pub process_logic_fingerprint: Option<Vec<u8>>,
|
219
|
+
pub process_time_micros: Option<i64>,
|
220
|
+
}
|
221
|
+
|
222
|
+
pub async fn read_source_last_processed_info(
|
223
|
+
source_id: i32,
|
224
|
+
source_key_json: &serde_json::Value,
|
225
|
+
db_setup: &TrackingTableSetupState,
|
226
|
+
pool: &PgPool,
|
227
|
+
) -> Result<Option<SourceLastProcessedInfo>> {
|
228
|
+
let query_str = format!(
|
229
|
+
"SELECT processed_source_ordinal, process_logic_fingerprint, process_time_micros FROM {} WHERE source_id = $1 AND source_key = $2",
|
230
|
+
db_setup.table_name
|
231
|
+
);
|
232
|
+
let last_processed_info = sqlx::query_as(&query_str)
|
233
|
+
.bind(source_id)
|
234
|
+
.bind(source_key_json)
|
235
|
+
.fetch_optional(pool)
|
236
|
+
.await?;
|
237
|
+
Ok(last_processed_info)
|
238
|
+
}
|
@@ -11,6 +11,7 @@ use std::collections::BTreeMap;
|
|
11
11
|
use std::path::{Path, PathBuf};
|
12
12
|
use yaml_rust2::YamlEmitter;
|
13
13
|
|
14
|
+
use super::evaluator::SourceRowEvaluationContext;
|
14
15
|
use super::memoization::EvaluationMemoryOptions;
|
15
16
|
use super::row_indexer;
|
16
17
|
use crate::base::{schema, value};
|
@@ -77,10 +78,12 @@ impl<'a> Dumper<'a> {
|
|
77
78
|
'a: 'b,
|
78
79
|
{
|
79
80
|
let data_builder = row_indexer::evaluate_source_entry_with_memory(
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
81
|
+
&SourceRowEvaluationContext {
|
82
|
+
plan: self.plan,
|
83
|
+
import_op,
|
84
|
+
schema: self.schema,
|
85
|
+
key,
|
86
|
+
},
|
84
87
|
EvaluationMemoryOptions {
|
85
88
|
enable_cache: self.options.use_cache,
|
86
89
|
evaluation_only: true,
|
@@ -167,7 +170,7 @@ impl<'a> Dumper<'a> {
|
|
167
170
|
async fn evaluate_and_dump_for_source(&self, import_op: &AnalyzedImportOp) -> Result<()> {
|
168
171
|
let mut keys_by_filename_prefix: IndexMap<String, Vec<value::KeyValue>> = IndexMap::new();
|
169
172
|
|
170
|
-
let mut rows_stream = import_op.executor.list(SourceExecutorListOptions {
|
173
|
+
let mut rows_stream = import_op.executor.list(&SourceExecutorListOptions {
|
171
174
|
include_ordinal: false,
|
172
175
|
});
|
173
176
|
while let Some(rows) = rows_stream.next().await {
|
@@ -446,6 +446,13 @@ async fn evaluate_op_scope(
|
|
446
446
|
Ok(())
|
447
447
|
}
|
448
448
|
|
449
|
+
pub struct SourceRowEvaluationContext<'a> {
|
450
|
+
pub plan: &'a ExecutionPlan,
|
451
|
+
pub import_op: &'a AnalyzedImportOp,
|
452
|
+
pub schema: &'a schema::FlowSchema,
|
453
|
+
pub key: &'a value::KeyValue,
|
454
|
+
}
|
455
|
+
|
449
456
|
#[derive(Debug)]
|
450
457
|
pub struct EvaluateSourceEntryOutput {
|
451
458
|
pub data_scope: ScopeValueBuilder,
|
@@ -453,23 +460,20 @@ pub struct EvaluateSourceEntryOutput {
|
|
453
460
|
}
|
454
461
|
|
455
462
|
pub async fn evaluate_source_entry(
|
456
|
-
|
457
|
-
import_op: &AnalyzedImportOp,
|
458
|
-
schema: &schema::FlowSchema,
|
459
|
-
key: &value::KeyValue,
|
463
|
+
src_eval_ctx: &SourceRowEvaluationContext<'_>,
|
460
464
|
source_value: value::FieldValues,
|
461
465
|
memory: &EvaluationMemory,
|
462
466
|
) -> Result<EvaluateSourceEntryOutput> {
|
463
|
-
let root_schema = &schema.schema;
|
467
|
+
let root_schema = &src_eval_ctx.schema.schema;
|
464
468
|
let root_scope_value = ScopeValueBuilder::new(root_schema.fields.len());
|
465
469
|
let root_scope_entry = ScopeEntry::new(
|
466
470
|
ScopeKey::None,
|
467
471
|
&root_scope_value,
|
468
472
|
root_schema,
|
469
|
-
&plan.op_scope,
|
473
|
+
&src_eval_ctx.plan.op_scope,
|
470
474
|
);
|
471
475
|
|
472
|
-
let table_schema = match &root_schema.fields[import_op.output.field_idx as usize]
|
476
|
+
let table_schema = match &root_schema.fields[src_eval_ctx.import_op.output.field_idx as usize]
|
473
477
|
.value_type
|
474
478
|
.typ
|
475
479
|
{
|
@@ -482,12 +486,12 @@ pub async fn evaluate_source_entry(
|
|
482
486
|
let scope_value =
|
483
487
|
ScopeValueBuilder::augmented_from(&value::ScopeValue(source_value), table_schema)?;
|
484
488
|
root_scope_entry.define_field_w_builder(
|
485
|
-
&import_op.output,
|
486
|
-
value::Value::KTable(BTreeMap::from([(key.clone(), scope_value)])),
|
489
|
+
&src_eval_ctx.import_op.output,
|
490
|
+
value::Value::KTable(BTreeMap::from([(src_eval_ctx.key.clone(), scope_value)])),
|
487
491
|
);
|
488
492
|
|
489
493
|
evaluate_op_scope(
|
490
|
-
&plan.op_scope,
|
494
|
+
&src_eval_ctx.plan.op_scope,
|
491
495
|
RefList::Nil.prepend(&root_scope_entry),
|
492
496
|
memory,
|
493
497
|
)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
use crate::prelude::*;
|
2
|
+
|
3
|
+
use super::db_tracking;
|
4
|
+
use super::evaluator;
|
5
|
+
use futures::try_join;
|
6
|
+
|
7
|
+
#[derive(Debug, Serialize)]
|
8
|
+
pub struct SourceRowLastProcessedInfo {
|
9
|
+
pub source_ordinal: Option<interface::Ordinal>,
|
10
|
+
pub processing_time: Option<chrono::DateTime<chrono::Utc>>,
|
11
|
+
pub is_logic_current: bool,
|
12
|
+
}
|
13
|
+
|
14
|
+
#[derive(Debug, Serialize)]
|
15
|
+
pub struct SourceRowInfo {
|
16
|
+
pub ordinal: Option<interface::Ordinal>,
|
17
|
+
}
|
18
|
+
|
19
|
+
#[derive(Debug, Serialize)]
|
20
|
+
pub struct SourceRowIndexingStatus {
|
21
|
+
pub last_processed: Option<SourceRowLastProcessedInfo>,
|
22
|
+
pub current: Option<SourceRowInfo>,
|
23
|
+
}
|
24
|
+
|
25
|
+
pub async fn get_source_row_indexing_status(
|
26
|
+
src_eval_ctx: &evaluator::SourceRowEvaluationContext<'_>,
|
27
|
+
pool: &sqlx::PgPool,
|
28
|
+
) -> Result<SourceRowIndexingStatus> {
|
29
|
+
let source_key_json = serde_json::to_value(src_eval_ctx.key)?;
|
30
|
+
let last_processed_fut = db_tracking::read_source_last_processed_info(
|
31
|
+
src_eval_ctx.import_op.source_id,
|
32
|
+
&source_key_json,
|
33
|
+
&src_eval_ctx.plan.tracking_table_setup,
|
34
|
+
pool,
|
35
|
+
);
|
36
|
+
let current_fut = src_eval_ctx.import_op.executor.get_value(
|
37
|
+
&src_eval_ctx.key,
|
38
|
+
&interface::SourceExecutorGetOptions {
|
39
|
+
include_value: false,
|
40
|
+
include_ordinal: true,
|
41
|
+
},
|
42
|
+
);
|
43
|
+
let (last_processed, current) = try_join!(last_processed_fut, current_fut)?;
|
44
|
+
|
45
|
+
let last_processed = last_processed.map(|l| SourceRowLastProcessedInfo {
|
46
|
+
source_ordinal: l.processed_source_ordinal.map(interface::Ordinal),
|
47
|
+
processing_time: l
|
48
|
+
.process_time_micros
|
49
|
+
.map(chrono::DateTime::<chrono::Utc>::from_timestamp_micros)
|
50
|
+
.flatten(),
|
51
|
+
is_logic_current: Some(src_eval_ctx.plan.logic_fingerprint.0.as_slice())
|
52
|
+
== l.process_logic_fingerprint.as_ref().map(|b| b.as_slice()),
|
53
|
+
});
|
54
|
+
let current = current.map(|c| SourceRowInfo { ordinal: c.ordinal });
|
55
|
+
Ok(SourceRowIndexingStatus {
|
56
|
+
last_processed,
|
57
|
+
current,
|
58
|
+
})
|
59
|
+
}
|