cocoindex 0.1.59__tar.gz → 0.1.60__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.59 → cocoindex-0.1.60}/Cargo.lock +1 -1
- {cocoindex-0.1.59 → cocoindex-0.1.60}/Cargo.toml +1 -1
- {cocoindex-0.1.59 → cocoindex-0.1.60}/PKG-INFO +1 -1
- cocoindex-0.1.60/docs/docs/core/data_types.mdx +188 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/__init__.py +11 -1
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/tests/test_convert.py +69 -19
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/typing.py +1 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/py/convert.rs +19 -5
- cocoindex-0.1.59/docs/docs/core/data_types.mdx +0 -146
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.cargo/config.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.env.lib_debug +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/scripts/update_version.sh +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/CI.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/_doc_release.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/_test.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/docs.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/format.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.github/workflows/release.yml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.gitignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.pre-commit-config.yaml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/.vscode/settings.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/CODE_OF_CONDUCT.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/CONTRIBUTING.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/LICENSE +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/dev/neo4j.yaml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/dev/postgres.yaml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/.gitignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/about/community.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/about/contributing.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/ai/llm.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/basics.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/cli.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/custom_function.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/data_example.svg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/flow_def.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/flow_example.svg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/flow_methods.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/core/settings.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/getting_started/installation.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/getting_started/markdown_files.zip +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/getting_started/overview.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/getting_started/quickstart.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/ops/functions.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/ops/sources.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/ops/targets.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docs/query.mdx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/docusaurus.config.ts +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/package.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/sidebars.ts +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/src/css/custom.css +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/src/theme/Root.js +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/.nojekyll +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/img/docusaurus.png +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/img/favicon.ico +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/img/icon.svg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/img/incremental-etl.gif +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/static/robots.txt +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/tsconfig.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/docs/yarn.lock +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/amazon_s3_embedding/.env.example +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/amazon_s3_embedding/.gitignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/amazon_s3_embedding/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/amazon_s3_embedding/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/amazon_s3_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/code_embedding/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/code_embedding/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/code_embedding/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/code_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/docs_to_knowledge_graph/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/docs_to_knowledge_graph/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/docs_to_knowledge_graph/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/docs_to_knowledge_graph/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/.dockerignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/compose.yaml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/dockerfile +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/files/1810.04805v2.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/fastapi_server_docker/requirements.txt +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/gdrive_text_embedding/.env.example +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/gdrive_text_embedding/.gitignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/gdrive_text_embedding/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/gdrive_text_embedding/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/gdrive_text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/.gitignore +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/index.html +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/package-lock.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/package.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/src/App.jsx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/src/main.jsx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/src/style.css +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/frontend/vite.config.js +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/img/cat1.jpeg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/img/dog1.jpeg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/img/elephant1.jpg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/img/giraffe.jpg +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/image_search/requirements.txt +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/manuals_llm_extraction/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/.env.example +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/data/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/data/patient_forms/Patient_Intake_Form_David_Artificial.docx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/data/patient_forms/Patient_Intake_Form_Emily_Artificial.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/data/patient_forms/Patient_Intake_Form_Joe_Artificial.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/data/patient_forms/Patient_Intake_From_Jane_Artificial.docx +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/patient_intake_extraction/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/pdf_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/img/cocoinsight.png +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/img/neo4j.png +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p1.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p2.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p3.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p4.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p5.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p6.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p7.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p8.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/products/p9.json +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/product_recommendation/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/Text_Embedding.ipynb +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding_qdrant/.env +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding_qdrant/README.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding_qdrant/main.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/examples/text_embedding_qdrant/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/pyproject.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/auth_registry.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/cli.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/convert.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/flow.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/functions.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/index.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/lib.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/llm.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/op.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/py.typed +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/runtime.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/setting.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/setup.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/sources.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/targets.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/tests/__init__.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/tests/test_optional_database.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/tests/test_typing.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/python/cocoindex/utils.py +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/ruff.toml +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/duration.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/field_attrs.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/json_schema.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/schema.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/spec.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/base/value.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/analyzed_flow.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/analyzer.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/exec_ctx.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/flow_builder.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/builder/plan.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/db_tracking.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/db_tracking_setup.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/dumper.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/evaluator.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/indexing_status.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/live_updater.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/memoization.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/row_indexer.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/source_indexer.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/execution/stats.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/lib.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/lib_context.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/anthropic.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/gemini.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/litellm.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/ollama.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/openai.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/openrouter.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/vllm.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/llm/voyage.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/factory_bases.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/functions/embed_text.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/functions/extract_by_llm.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/functions/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/functions/parse_json.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/functions/split_recursively.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/interface.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/py_factory.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/registration.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/registry.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/sdk.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/sources/amazon_s3.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/sources/google_drive.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/sources/local_file.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/sources/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/kuzu.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/neo4j.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/postgres.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/qdrant.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/shared/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/shared/property_graph.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/ops/targets/shared/table_columns.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/prelude.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/py/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/server.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/service/error.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/service/flows.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/service/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/settings.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/auth_registry.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/components.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/db_metadata.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/driver.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/setup/states.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/db.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/fingerprint.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/immutable.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/mod.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/retryable.rs +0 -0
- {cocoindex-0.1.59 → cocoindex-0.1.60}/src/utils/yaml_ser.rs +0 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
---
|
2
|
+
title: Data Types
|
3
|
+
description: Data Types in CocoIndex
|
4
|
+
toc_max_heading_level: 4
|
5
|
+
---
|
6
|
+
|
7
|
+
# Data Types in CocoIndex
|
8
|
+
|
9
|
+
In CocoIndex, all data processed by the flow have a type determined when the flow is defined, before any actual data is processed at runtime.
|
10
|
+
|
11
|
+
This makes schema of data processed by CocoIndex clear, and easily determine the schema of your index.
|
12
|
+
|
13
|
+
## Data Types
|
14
|
+
|
15
|
+
As an engine written in Rust, designed to be used in different languages and data are always serializable, CocoIndex defines a type system independent of any specific programming language.
|
16
|
+
|
17
|
+
CocoIndex automatically infers data types of the output created by CocoIndex sources and functions.
|
18
|
+
You don't need to spell out any data type explicitly when you define the flow.
|
19
|
+
All you need to do is to make sure the data passed to functions and targets are compatible with them.
|
20
|
+
|
21
|
+
Each type in CocoIndex type system is mapped to one or multiple types in Python.
|
22
|
+
When you define a [custom function](/docs/core/custom_function), you need to annotate the data types of arguments and return values.
|
23
|
+
|
24
|
+
* For return values, type annotation is required. Because this provides the ground truth to define the type of the output of the custom function.
|
25
|
+
* For arguments, type annotation is only used to enable the conversion from data values already existing in CocoIndex engine to Python value.
|
26
|
+
Type annotation is optional for basic types. When not specified, CocoIndex will use the *default Python type* for the argument.
|
27
|
+
Type annotation is required for arguments of struct types and table types.
|
28
|
+
|
29
|
+
### Basic Types
|
30
|
+
|
31
|
+
#### Primitive Types
|
32
|
+
|
33
|
+
Primitive types are basic types that are not composed of other types.
|
34
|
+
This is the list of all primitive types supported by CocoIndex:
|
35
|
+
|
36
|
+
| CocoIndex Type | Python Types | Convertible to | Explanation |
|
37
|
+
|------|-------------|--------------|----------------|
|
38
|
+
| *Bytes* | `bytes` | | |
|
39
|
+
| *Str* | `str` | | |
|
40
|
+
| *Bool* | `bool` | | |
|
41
|
+
| *Int64* | `cocoindex.Int64`, `int`, `numpy.int64` | | |
|
42
|
+
| *Float32* | `cocoindex.Float32`, `numpy.float32` | *Float64* | |
|
43
|
+
| *Float64* | `cocoindex.Float64`, `float`, `numpy.float64` | | |
|
44
|
+
| *Range* | `cocoindex.Range` | | |
|
45
|
+
| *Uuid* | `uuid.UUId` | | |
|
46
|
+
| *Date* | `datetime.date` | | |
|
47
|
+
| *Time* | `datetime.time` | | |
|
48
|
+
| *LocalDatetime* | `cocoindex.LocalDateTime` | *OffsetDatetime* | without timezone |
|
49
|
+
| *OffsetDatetime* | `cocoindex.OffsetDateTime`, `datetime.datetime` | | with timezone |
|
50
|
+
| *TimeDelta* | `datetime.timedelta` | | |
|
51
|
+
|
52
|
+
Notes:
|
53
|
+
|
54
|
+
* For some CocoIndex types, we support multiple Python types. You can annotate with any of these Python types.
|
55
|
+
The first one is the *default Python type*, which means CocoIndex will create a value with this type when you don't annotate the type in function arguments.
|
56
|
+
|
57
|
+
* All Python types starting with `cocoindex.` are type aliases exported by CocoIndex. They're annotated types based on certain Python types:
|
58
|
+
|
59
|
+
* `cocoindex.Int64`: `int`
|
60
|
+
* `cocoindex.Float64`: `float`
|
61
|
+
* `cocoindex.Float32`: `float`
|
62
|
+
* `cocoindex.Range`: `tuple[int, int]`, i.e. a start offset (inclusive) and an end offset (exclusive)
|
63
|
+
* `cocoindex.OffsetDateTime`: `datetime.datetime`
|
64
|
+
* `cocoindex.LocalDateTime`: `datetime.datetime`
|
65
|
+
|
66
|
+
These aliases provide a non-ambiguous way to represent a specific type in CocoIndex, given their base Python types can represent a superset of possible values.
|
67
|
+
|
68
|
+
* When we say a CocoIndex type is *convertible to* another type, it means Python types for the second type can be also used to bind to a value of the first type.
|
69
|
+
For example, *Float32* is convertible to *Float64*, so you can bind a value of *Float32* to a Python value of `float` or `np.float64` types.
|
70
|
+
For *LocalDatetime*, when you use `cocoindex.OffsetDateTime` or `datetime.datetime` as the annotation to bind its value, the timezone will be set to UTC.
|
71
|
+
|
72
|
+
|
73
|
+
#### Json Type
|
74
|
+
|
75
|
+
*Json* type can hold any data convertible to JSON by `json` package.
|
76
|
+
In Python, it's represented by `cocoindex.Json`.
|
77
|
+
It's useful to hold data without fixed schema known at flow definition time.
|
78
|
+
|
79
|
+
|
80
|
+
#### Vector Types
|
81
|
+
|
82
|
+
A vector type is a collection of elements of the same basic type.
|
83
|
+
Optionally, it can have a fixed dimension. Noted as *Vector[Type]* or *Vector[Type, Dim]*, e.g. *Vector[Float32]* or *Vector[Float32, 384]*.
|
84
|
+
|
85
|
+
It supports the following Python types:
|
86
|
+
|
87
|
+
* `cocoindex.Vector[T]` or `cocoindex.Vector[T, typing.Literal[Dim]]`, e.g. `cocoindex.Vector[cocoindex.Float32]` or `cocoindex.Vector[cocoindex.Float32, 384]`
|
88
|
+
* The underlying Python type is `numpy.typing.NDArray[T]` where `T` is a numpy numeric type (`numpy.int64`, `numpy.float32` or `numpy.float64`), or `list[T]` otherwise
|
89
|
+
* `numpy.typing.NDArray[T]` where `T` is a numpy numeric type
|
90
|
+
* `list[T]`
|
91
|
+
|
92
|
+
|
93
|
+
#### Union Types
|
94
|
+
|
95
|
+
A union type is a type that can represent values in one of multiple basic types.
|
96
|
+
Noted as *Type1* | *Type2* | ..., e.g. *Int64* | *Float32* | *Float64*.
|
97
|
+
|
98
|
+
The Python type is `T1 | T2 | ...`, e.g. `cocoindex.Int64 | cocoindex.Float32 | cocoindex.Float64`, `int | float` (equivalent to `cocoindex.Int64 | cocoindex.Float64`)
|
99
|
+
|
100
|
+
|
101
|
+
### Struct Types
|
102
|
+
|
103
|
+
A *Struct* has a bunch of fields, each with a name and a type.
|
104
|
+
|
105
|
+
In Python, a *Struct* type is represented by either a [dataclass](https://docs.python.org/3/library/dataclasses.html)
|
106
|
+
or a [NamedTuple](https://docs.python.org/3/library/typing.html#typing.NamedTuple), with all fields annotated with a specific type.
|
107
|
+
Both options define a structured type with named fields, but they differ slightly:
|
108
|
+
|
109
|
+
- **Dataclass**: A flexible class-based structure, mutable by default, defined using the `@dataclass` decorator.
|
110
|
+
- **NamedTuple**: An immutable tuple-based structure, defined using `typing.NamedTuple`.
|
111
|
+
|
112
|
+
For example:
|
113
|
+
|
114
|
+
```python
|
115
|
+
from dataclasses import dataclass
|
116
|
+
from typing import NamedTuple
|
117
|
+
import datetime
|
118
|
+
|
119
|
+
# Using dataclass
|
120
|
+
@dataclass
|
121
|
+
class Person:
|
122
|
+
first_name: str
|
123
|
+
last_name: str
|
124
|
+
dob: datetime.date
|
125
|
+
|
126
|
+
# Using NamedTuple
|
127
|
+
class PersonTuple(NamedTuple):
|
128
|
+
first_name: str
|
129
|
+
last_name: str
|
130
|
+
dob: datetime.date
|
131
|
+
```
|
132
|
+
|
133
|
+
Both `Person` and `PersonTuple` are valid Struct types in CocoIndex, with identical schemas (three fields: `first_name` (Str), `last_name` (Str), `dob` (Date)).
|
134
|
+
Choose `dataclass` for mutable objects or when you need additional methods, and `NamedTuple` for immutable, lightweight structures.
|
135
|
+
|
136
|
+
### Table Types
|
137
|
+
|
138
|
+
A *Table* type models a collection of rows, each with multiple columns.
|
139
|
+
Each column of a table has a specific type.
|
140
|
+
|
141
|
+
We have two specific types of *Table* types: *KTable* and *LTable*.
|
142
|
+
|
143
|
+
#### KTable
|
144
|
+
|
145
|
+
*KTable* is a *Table* type whose first column serves as the key.
|
146
|
+
The row order of a *KTable* is not preserved.
|
147
|
+
Type of the first column (key column) must be a [key type](#key-types).
|
148
|
+
|
149
|
+
In Python, a *KTable* type is represented by `dict[K, V]`.
|
150
|
+
The `V` should be a *Struct* type, either a `dataclass` or `NamedTuple`, representing the value fields of each row.
|
151
|
+
For example, you can use `dict[str, Person]` or `dict[str, PersonTuple]` to represent a *KTable*, with 4 columns: key (*Str*), `first_name` (*Str*), `last_name` (*Str*), `dob` (*Date*).
|
152
|
+
|
153
|
+
Note that if you want to use a *Struct* as the key, you need to ensure its value in Python is immutable. For `dataclass`, annotate it with `@dataclass(frozen=True)`. For `NamedTuple`, immutability is built-in. For example:
|
154
|
+
For example:
|
155
|
+
|
156
|
+
```python
|
157
|
+
@dataclass(frozen=True)
|
158
|
+
class PersonKey:
|
159
|
+
id_kind: str
|
160
|
+
id: str
|
161
|
+
|
162
|
+
class PersonKeyTuple(NamedTuple):
|
163
|
+
id_kind: str
|
164
|
+
id: str
|
165
|
+
```
|
166
|
+
|
167
|
+
Then you can use `dict[PersonKey, Person]` or `dict[PersonKeyTuple, PersonTuple]` to represent a KTable keyed by `PersonKey` or `PersonKeyTuple`.
|
168
|
+
|
169
|
+
|
170
|
+
#### LTable
|
171
|
+
|
172
|
+
*LTable* is a *Table* type whose row order is preserved. *LTable* has no key column.
|
173
|
+
|
174
|
+
In Python, a *LTable* type is represented by `list[R]`, where `R` is a dataclass representing a row.
|
175
|
+
For example, you can use `list[Person]` to represent a *LTable* with 3 columns: `first_name` (*Str*), `last_name` (*Str*), `dob` (*Date*).
|
176
|
+
|
177
|
+
## Key Types
|
178
|
+
|
179
|
+
Currently, the following types are key types
|
180
|
+
|
181
|
+
- *Bytes*
|
182
|
+
- *Str*
|
183
|
+
- *Bool*
|
184
|
+
- *Int64*
|
185
|
+
- *Range*
|
186
|
+
- *Uuid*
|
187
|
+
- *Date*
|
188
|
+
- *Struct* with all fields being key types (using `@dataclass(frozen=True)` or `NamedTuple`)
|
@@ -17,7 +17,16 @@ from .llm import LlmSpec, LlmApiType
|
|
17
17
|
from .index import VectorSimilarityMetric, VectorIndexDef, IndexOptions
|
18
18
|
from .setting import DatabaseConnectionSpec, Settings, ServerSettings
|
19
19
|
from .setting import get_app_namespace
|
20
|
-
from .typing import
|
20
|
+
from .typing import (
|
21
|
+
Int64,
|
22
|
+
Float32,
|
23
|
+
Float64,
|
24
|
+
LocalDateTime,
|
25
|
+
OffsetDateTime,
|
26
|
+
Range,
|
27
|
+
Vector,
|
28
|
+
Json,
|
29
|
+
)
|
21
30
|
|
22
31
|
__all__ = [
|
23
32
|
# Submodules
|
@@ -64,6 +73,7 @@ __all__ = [
|
|
64
73
|
"ServerSettings",
|
65
74
|
"get_app_namespace",
|
66
75
|
# Typing
|
76
|
+
"Int64",
|
67
77
|
"Float32",
|
68
78
|
"Float64",
|
69
79
|
"LocalDateTime",
|
@@ -78,16 +78,15 @@ def build_engine_value_decoder(
|
|
78
78
|
return make_engine_value_decoder([], engine_type, python_type or engine_type_in_py)
|
79
79
|
|
80
80
|
|
81
|
-
def
|
81
|
+
def validate_full_roundtrip_to(
|
82
82
|
value: Any,
|
83
|
-
value_type: Any
|
84
|
-
*
|
83
|
+
value_type: Any,
|
84
|
+
*decoded_values: tuple[Any, Any],
|
85
85
|
) -> None:
|
86
86
|
"""
|
87
|
-
Validate the given value
|
87
|
+
Validate the given value becomes specific values after encoding, sending to engine (using output_type), receiving back and decoding (using input_type).
|
88
88
|
|
89
|
-
`
|
90
|
-
If provided, also validate the value can be decoded to the other types.
|
89
|
+
`decoded_values` is a tuple of (value, type) pairs.
|
91
90
|
"""
|
92
91
|
from cocoindex import _engine # type: ignore
|
93
92
|
|
@@ -102,15 +101,27 @@ def validate_full_roundtrip(
|
|
102
101
|
value_from_engine = _engine.testutil.seder_roundtrip(
|
103
102
|
encoded_value, encoded_output_type
|
104
103
|
)
|
105
|
-
decoder = make_engine_value_decoder([], encoded_output_type, value_type)
|
106
|
-
decoded_value = decoder(value_from_engine)
|
107
|
-
assert eq(decoded_value, value), f"{decoded_value} != {value}"
|
108
104
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
105
|
+
for other_value, other_type in decoded_values:
|
106
|
+
decoder = make_engine_value_decoder([], encoded_output_type, other_type)
|
107
|
+
other_decoded_value = decoder(value_from_engine)
|
108
|
+
assert eq(other_decoded_value, other_value)
|
109
|
+
|
110
|
+
|
111
|
+
def validate_full_roundtrip(
|
112
|
+
value: Any,
|
113
|
+
value_type: Any,
|
114
|
+
*other_decoded_values: tuple[Any, Any],
|
115
|
+
) -> None:
|
116
|
+
"""
|
117
|
+
Validate the given value doesn't change after encoding, sending to engine (using output_type), receiving back and decoding (using input_type).
|
118
|
+
|
119
|
+
`other_decoded_values` is a tuple of (value, type) pairs.
|
120
|
+
If provided, also validate the value can be decoded to the other types.
|
121
|
+
"""
|
122
|
+
validate_full_roundtrip_to(
|
123
|
+
value, value_type, (value, value_type), *other_decoded_values
|
124
|
+
)
|
114
125
|
|
115
126
|
|
116
127
|
def test_encode_engine_value_basic_types() -> None:
|
@@ -218,17 +229,33 @@ def test_encode_engine_value_none() -> None:
|
|
218
229
|
|
219
230
|
|
220
231
|
def test_roundtrip_basic_types() -> None:
|
221
|
-
validate_full_roundtrip(42, int, (42, None))
|
222
|
-
validate_full_roundtrip(3.25, float, (3.25, Float64))
|
223
232
|
validate_full_roundtrip(
|
224
|
-
|
233
|
+
42, cocoindex.Int64, (42, int), (np.int64(42), np.int64), (42, None)
|
225
234
|
)
|
235
|
+
validate_full_roundtrip(42, int, (42, cocoindex.Int64))
|
236
|
+
validate_full_roundtrip(np.int64(42), np.int64, (42, cocoindex.Int64))
|
237
|
+
|
226
238
|
validate_full_roundtrip(
|
227
|
-
3.25,
|
239
|
+
3.25, Float64, (3.25, float), (np.float64(3.25), np.float64), (3.25, None)
|
228
240
|
)
|
241
|
+
validate_full_roundtrip(3.25, float, (3.25, Float64))
|
242
|
+
validate_full_roundtrip(np.float64(3.25), np.float64, (3.25, Float64))
|
243
|
+
|
244
|
+
validate_full_roundtrip(
|
245
|
+
3.25,
|
246
|
+
Float32,
|
247
|
+
(3.25, float),
|
248
|
+
(np.float32(3.25), np.float32),
|
249
|
+
(np.float64(3.25), np.float64),
|
250
|
+
(3.25, Float64),
|
251
|
+
(3.25, None),
|
252
|
+
)
|
253
|
+
validate_full_roundtrip(np.float32(3.25), np.float32, (3.25, Float32))
|
254
|
+
|
229
255
|
validate_full_roundtrip("hello", str, ("hello", None))
|
230
256
|
validate_full_roundtrip(True, bool, (True, None))
|
231
257
|
validate_full_roundtrip(False, bool, (False, None))
|
258
|
+
validate_full_roundtrip((1, 2), cocoindex.Range, ((1, 2), None))
|
232
259
|
validate_full_roundtrip(
|
233
260
|
datetime.date(2025, 1, 1), datetime.date, (datetime.date(2025, 1, 1), None)
|
234
261
|
)
|
@@ -238,14 +265,37 @@ def test_roundtrip_basic_types() -> None:
|
|
238
265
|
cocoindex.LocalDateTime,
|
239
266
|
(datetime.datetime(2025, 1, 2, 3, 4, 5, 123456), datetime.datetime),
|
240
267
|
)
|
268
|
+
|
269
|
+
tz = datetime.timezone(datetime.timedelta(hours=5))
|
241
270
|
validate_full_roundtrip(
|
242
|
-
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456,
|
271
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, tz),
|
272
|
+
cocoindex.OffsetDateTime,
|
273
|
+
(
|
274
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, tz),
|
275
|
+
datetime.datetime,
|
276
|
+
),
|
277
|
+
)
|
278
|
+
validate_full_roundtrip(
|
279
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, tz),
|
280
|
+
datetime.datetime,
|
281
|
+
(datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, tz), cocoindex.OffsetDateTime),
|
282
|
+
)
|
283
|
+
validate_full_roundtrip_to(
|
284
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456),
|
243
285
|
cocoindex.OffsetDateTime,
|
244
286
|
(
|
245
287
|
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, datetime.UTC),
|
246
288
|
datetime.datetime,
|
247
289
|
),
|
248
290
|
)
|
291
|
+
validate_full_roundtrip_to(
|
292
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456),
|
293
|
+
datetime.datetime,
|
294
|
+
(
|
295
|
+
datetime.datetime(2025, 1, 2, 3, 4, 5, 123456, datetime.UTC),
|
296
|
+
cocoindex.OffsetDateTime,
|
297
|
+
),
|
298
|
+
)
|
249
299
|
|
250
300
|
uuid_value = uuid.uuid4()
|
251
301
|
validate_full_roundtrip(uuid_value, uuid.UUID, (uuid_value, None))
|
@@ -40,6 +40,7 @@ class TypeAttr:
|
|
40
40
|
|
41
41
|
Annotation = TypeKind | TypeAttr | VectorInfo
|
42
42
|
|
43
|
+
Int64 = Annotated[int, TypeKind("Int64")]
|
43
44
|
Float32 = Annotated[float, TypeKind("Float32")]
|
44
45
|
Float64 = Annotated[float, TypeKind("Float64")]
|
45
46
|
Range = Annotated[tuple[int, int], TypeKind("Range")]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
use crate::prelude::*;
|
2
|
+
|
1
3
|
use bytes::Bytes;
|
2
4
|
use numpy::{PyArray1, PyArrayDyn, PyArrayMethods};
|
3
5
|
use pyo3::IntoPyObjectExt;
|
@@ -6,14 +8,10 @@ use pyo3::types::PyAny;
|
|
6
8
|
use pyo3::types::{PyList, PyTuple};
|
7
9
|
use pyo3::{exceptions::PyException, prelude::*};
|
8
10
|
use pythonize::{depythonize, pythonize};
|
9
|
-
use serde::Serialize;
|
10
11
|
use serde::de::DeserializeOwned;
|
11
|
-
use std::collections::BTreeMap;
|
12
12
|
use std::ops::Deref;
|
13
|
-
use std::sync::Arc;
|
14
13
|
|
15
14
|
use super::IntoPyResult;
|
16
|
-
use crate::base::{schema, value};
|
17
15
|
|
18
16
|
#[derive(Debug)]
|
19
17
|
pub struct Pythonized<T>(pub T);
|
@@ -143,7 +141,23 @@ fn basic_value_from_py_object<'py>(
|
|
143
141
|
value::BasicValue::LocalDateTime(v.extract::<chrono::NaiveDateTime>()?)
|
144
142
|
}
|
145
143
|
schema::BasicValueType::OffsetDateTime => {
|
146
|
-
|
144
|
+
if v.getattr_opt("tzinfo")?
|
145
|
+
.ok_or_else(|| {
|
146
|
+
PyErr::new::<PyTypeError, _>(format!(
|
147
|
+
"expecting a datetime.datetime value, got {}",
|
148
|
+
v.get_type()
|
149
|
+
))
|
150
|
+
})?
|
151
|
+
.is_none()
|
152
|
+
{
|
153
|
+
value::BasicValue::OffsetDateTime(
|
154
|
+
v.extract::<chrono::NaiveDateTime>()?.and_utc().into(),
|
155
|
+
)
|
156
|
+
} else {
|
157
|
+
value::BasicValue::OffsetDateTime(
|
158
|
+
v.extract::<chrono::DateTime<chrono::FixedOffset>>()?,
|
159
|
+
)
|
160
|
+
}
|
147
161
|
}
|
148
162
|
schema::BasicValueType::TimeDelta => {
|
149
163
|
value::BasicValue::TimeDelta(v.extract::<chrono::TimeDelta>()?)
|
@@ -1,146 +0,0 @@
|
|
1
|
-
---
|
2
|
-
title: Data Types
|
3
|
-
description: Data Types in CocoIndex
|
4
|
-
---
|
5
|
-
|
6
|
-
# Data Types in CocoIndex
|
7
|
-
|
8
|
-
In CocoIndex, all data processed by the flow have a type determined when the flow is defined, before any actual data is processed at runtime.
|
9
|
-
|
10
|
-
This makes schema of data processed by CocoIndex clear, and easily determine the schema of your index.
|
11
|
-
|
12
|
-
## Data Types
|
13
|
-
|
14
|
-
You don't need to spell out data types in CocoIndex, when you define the flow using existing operations (source, function, etc).
|
15
|
-
These operations decide data types of fields produced by them based on the spec and input data types.
|
16
|
-
All you need to do is to make sure the data passed to functions and targets are accepted by them.
|
17
|
-
|
18
|
-
When you define [custom functions](/docs/core/custom_function), you need to specify the data types of arguments and return values.
|
19
|
-
|
20
|
-
### Basic Types
|
21
|
-
|
22
|
-
This is the list of all basic types supported by CocoIndex:
|
23
|
-
|
24
|
-
| Type | Description | Specific Python Type | Native Python Type |
|
25
|
-
|------|-------------|---------------|-------------------------|
|
26
|
-
| Bytes | | `bytes` | `bytes` |
|
27
|
-
| Str | | `str` | `str` |
|
28
|
-
| Bool | | `bool` | `bool` |
|
29
|
-
| Int64 | | `int` | `int` |
|
30
|
-
| Float32 | | `cocoindex.Float32` |`float` |
|
31
|
-
| Float64 | | `cocoindex.Float64` |`float` |
|
32
|
-
| Range | | `cocoindex.Range` | `tuple[int, int]` |
|
33
|
-
| Uuid | | `uuid.UUId` | `uuid.UUID` |
|
34
|
-
| Date | | `datetime.date` | `datetime.date` |
|
35
|
-
| Time | | `datetime.time` | `datetime.time` |
|
36
|
-
| LocalDatetime | Date and time without timezone | `cocoindex.LocalDateTime` | `datetime.datetime` |
|
37
|
-
| OffsetDatetime | Date and time with a timezone offset | `cocoindex.OffsetDateTime` | `datetime.datetime` |
|
38
|
-
| TimeDelta | A duration of time | `datetime.timedelta` | `datetime.timedelta` |
|
39
|
-
| Json | | `cocoindex.Json` | Any data convertible to JSON by `json` package |
|
40
|
-
| Vector[*T*, *Dim*?] | *T* can be a basic type or a numeric type. *Dim* is a positive integer and optional. | `cocoindex.Vector[T]` or `cocoindex.Vector[T, Dim]` | `numpy.typing.NDArray[T]` or `list[T]` |
|
41
|
-
| Union[*T1*, *T2*, ...] | *T1*, *T2*, ... are any basic types | `T1 | T2 | ...` | `T1 | T2 | ...` |
|
42
|
-
|
43
|
-
Values of all data types can be represented by values in Python's native types (as described under the Native Python Type column).
|
44
|
-
However, the underlying execution engine has finer distinctions for some types, specifically:
|
45
|
-
|
46
|
-
* *Float32* and *Float64* for `float`, with different precision.
|
47
|
-
* *LocalDateTime* and *OffsetDateTime* for `datetime.datetime`, with different timezone awareness.
|
48
|
-
* *Range* and *Json* provide a clear tag for the type, to clearly distinguish the type in CocoIndex.
|
49
|
-
* *Vector* holds elements of type *T*. If *T* is numeric (e.g., `np.float32` or `np.float64`), it's represented as `NDArray[T]`; otherwise, as `list[T]`.
|
50
|
-
* *Vector* also has optional dimension information.
|
51
|
-
|
52
|
-
The native Python type is always more permissive and can represent a superset of possible values.
|
53
|
-
* Only when you annotate the return type of a custom function, you should use the specific type,
|
54
|
-
so that CocoIndex will have information about the precise type to be used in the execution engine and target.
|
55
|
-
* For all other purposes, e.g. to provide annotation for argument types of a custom function, or used internally in your custom function,
|
56
|
-
you can choose whatever to use.
|
57
|
-
The native Python type is usually simpler.
|
58
|
-
|
59
|
-
### Struct Types
|
60
|
-
|
61
|
-
A Struct has a bunch of fields, each with a name and a type.
|
62
|
-
|
63
|
-
In Python, a Struct type is represented by either a [dataclass](https://docs.python.org/3/library/dataclasses.html)
|
64
|
-
or a [NamedTuple](https://docs.python.org/3/library/typing.html#typing.NamedTuple), with all fields annotated with a specific type.
|
65
|
-
Both options define a structured type with named fields, but they differ slightly:
|
66
|
-
|
67
|
-
- **Dataclass**: A flexible class-based structure, mutable by default, defined using the `@dataclass` decorator.
|
68
|
-
- **NamedTuple**: An immutable tuple-based structure, defined using `typing.NamedTuple`.
|
69
|
-
|
70
|
-
For example:
|
71
|
-
|
72
|
-
```python
|
73
|
-
from dataclasses import dataclass
|
74
|
-
from typing import NamedTuple
|
75
|
-
import datetime
|
76
|
-
|
77
|
-
# Using dataclass
|
78
|
-
@dataclass
|
79
|
-
class Person:
|
80
|
-
first_name: str
|
81
|
-
last_name: str
|
82
|
-
dob: datetime.date
|
83
|
-
|
84
|
-
# Using NamedTuple
|
85
|
-
class PersonTuple(NamedTuple):
|
86
|
-
first_name: str
|
87
|
-
last_name: str
|
88
|
-
dob: datetime.date
|
89
|
-
```
|
90
|
-
|
91
|
-
Both `Person` and `PersonTuple` are valid Struct types in CocoIndex, with identical schemas (three fields: `first_name` (Str), `last_name` (Str), `dob` (Date)).
|
92
|
-
Choose `dataclass` for mutable objects or when you need additional methods, and `NamedTuple` for immutable, lightweight structures.
|
93
|
-
|
94
|
-
### Table Types
|
95
|
-
|
96
|
-
A Table type models a collection of rows, each with multiple columns.
|
97
|
-
Each column of a table has a specific type.
|
98
|
-
|
99
|
-
We have two specific types of Table types: KTable and LTable.
|
100
|
-
|
101
|
-
#### KTable
|
102
|
-
|
103
|
-
KTable is a Table type whose first column serves as the key.
|
104
|
-
The row order of a KTable is not preserved.
|
105
|
-
Type of the first column (key column) must be a [key type](#key-types).
|
106
|
-
|
107
|
-
In Python, a KTable type is represented by `dict[K, V]`.
|
108
|
-
The `V` should be a struct type, either a `dataclass` or `NamedTuple`, representing the value fields of each row.
|
109
|
-
For example, you can use `dict[str, Person]` or `dict[str, PersonTuple]` to represent a KTable, with 4 columns: key (Str), `first_name` (Str), `last_name` (Str), `dob` (Date).
|
110
|
-
|
111
|
-
Note that if you want to use a struct as the key, you need to ensure the struct is immutable. For `dataclass`, annotate it with `@dataclass(frozen=True)`. For `NamedTuple`, immutability is built-in.
|
112
|
-
For example:
|
113
|
-
|
114
|
-
```python
|
115
|
-
@dataclass(frozen=True)
|
116
|
-
class PersonKey:
|
117
|
-
id_kind: str
|
118
|
-
id: str
|
119
|
-
|
120
|
-
class PersonKeyTuple(NamedTuple):
|
121
|
-
id_kind: str
|
122
|
-
id: str
|
123
|
-
```
|
124
|
-
|
125
|
-
Then you can use `dict[PersonKey, Person]` or `dict[PersonKeyTuple, PersonTuple]` to represent a KTable keyed by `PersonKey` or `PersonKeyTuple`.
|
126
|
-
|
127
|
-
|
128
|
-
#### LTable
|
129
|
-
|
130
|
-
LTable is a Table type whose row order is preserved. LTable has no key column.
|
131
|
-
|
132
|
-
In Python, a LTable type is represented by `list[R]`, where `R` is a dataclass representing a row.
|
133
|
-
For example, you can use `list[Person]` to represent a LTable with 3 columns: `first_name` (Str), `last_name` (Str), `dob` (Date).
|
134
|
-
|
135
|
-
## Key Types
|
136
|
-
|
137
|
-
Currently, the following types are key types
|
138
|
-
|
139
|
-
- Bytes
|
140
|
-
- Str
|
141
|
-
- Bool
|
142
|
-
- Int64
|
143
|
-
- Range
|
144
|
-
- Uuid
|
145
|
-
- Date
|
146
|
-
- Struct with all fields being key types (using `@dataclass(frozen=True)` or `NamedTuple`)
|
File without changes
|
File without changes
|
{cocoindex-0.1.59 → cocoindex-0.1.60}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md"
RENAMED
File without changes
|
{cocoindex-0.1.59 → cocoindex-0.1.60}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md"
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|