diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 8f33eca..1bf96f2 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -136,7 +136,7 @@ this action runs [pytest] on the Darwin/macOS platform to perform unit tests and - Uses: - [actions/checkout] - [actions/setup-python] - - [senzing-factory/github-action-install-senzing-api] + - [senzing-factory/github-action-install-senzing-sdk] - [pytest] - [actions/upload-artifact] @@ -149,7 +149,7 @@ this action runs [pytest] on the Linux platform to perform unit tests and code c - Uses: - [actions/checkout] - [actions/setup-python] - - [senzing-factory/github-action-install-senzing-api] + - [senzing-factory/github-action-install-senzing-sdk] - [pytest] - [actions/upload-artifact] @@ -162,7 +162,7 @@ this action runs [pytest] on the Windows platform to perform unit tests and code - Uses: - [actions/checkout] - [actions/setup-python] - - [senzing-factory/github-action-install-senzing-api] + - [senzing-factory/github-action-install-senzing-sdk] - [pytest] - [actions/upload-artifact] @@ -213,5 +213,5 @@ this action runs [pytest] on the Windows platform to perform unit tests and code [senzing-factory/build-resources/.../lint-workflows.yaml]: https://github.com/senzing-factory/build-resources/blob/main/.github/workflows/lint-workflows.yaml [senzing-factory/build-resources/.../move-pr-to-done-dependabot.yaml]: https://github.com/senzing-factory/build-resources/blob/main/.github/workflows/move-pr-to-done-dependabot.yaml [senzing-factory/github-action-docker-buildx-build]: https://github.com/senzing-factory/github-action-docker-buildx-build -[senzing-factory/github-action-install-senzing-api]: https://github.com/senzing-factory/github-action-install-senzing-api +[senzing-factory/github-action-install-senzing-sdk]: https://github.com/senzing-factory/github-action-install-senzing-sdk [super-linter]: https://github.com/super-linter/super-linter diff --git a/.github/workflows/mypy.yaml b/.github/workflows/mypy.yaml index 22602fc..1c1cc82 100644 --- a/.github/workflows/mypy.yaml +++ b/.github/workflows/mypy.yaml @@ -30,9 +30,10 @@ jobs: echo "PATH=${PATH}" >> "${GITHUB_ENV}" python -m pip install --upgrade pip python -m pip install --requirement requirements.txt + python -m pip install --requirement test-requirements.txt python -m pip install mypy pytest orjson - name: Run mypy tests run: | # shellcheck disable=SC2046 - mypy --strict $(git ls-files '*.py' ':!:docs/source/*' ':!:examples/*') + mypy --strict $(git ls-files '*.py' ':!:docs/source/*') diff --git a/.github/workflows/pylint.yaml b/.github/workflows/pylint.yaml index cd2fce2..b24e101 100644 --- a/.github/workflows/pylint.yaml +++ b/.github/workflows/pylint.yaml @@ -28,6 +28,7 @@ jobs: echo "PATH=${PATH}" >> "${GITHUB_ENV}" python -m pip install --upgrade pip python -m pip install --requirement requirements.txt + python -m pip install --requirement test-requirements.txt python -m pip install psutil pylint pytest pytest_schema - name: Analysing the code with pylint diff --git a/.github/workflows/pytest-darwin.yaml b/.github/workflows/pytest-darwin.yaml index a819d5e..2cbc2f3 100644 --- a/.github/workflows/pytest-darwin.yaml +++ b/.github/workflows/pytest-darwin.yaml @@ -3,14 +3,17 @@ name: pytest darwin on: [pull_request, workflow_dispatch] env: + DYLD_LIBRARY_PATH: /opt/senzing/er/lib:/opt/senzing/er/lib/macos + LD_LIBRARY_PATH: /opt/senzing/er/lib:/opt/senzing/er/lib/macos PYTHONPATH: /Users/runner/work/sz-sdk-python/sz-sdk-python/src + SENZING_TOOLS_DATABASE_URL: sqlite3://na:na@nowhere/tmp/sqlite/G2C.db permissions: contents: read jobs: pytest-darwin: - name: "pytest OS: ${{ matrix.os }}; Python ${{ matrix.python-version }}" + name: "pytest Senzing: ${{ matrix.senzingsdk-version }}; OS: ${{ matrix.os }}; Python ${{ matrix.python-version }}" runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -18,6 +21,7 @@ jobs: os: [macos-latest] # 3.9 is unsupported on the darwin runner python-version: ["3.10", "3.11", "3.12"] + senzingsdk-version: [staging-v4] steps: - name: Checkout repository @@ -35,6 +39,7 @@ jobs: echo "PATH=${PATH}" >> "${GITHUB_ENV}" python -m pip install --upgrade pip python -m pip install --requirement requirements.txt + python -m pip install --requirement test-requirements.txt python -m pip install psutil pytest pytest-cov pytest-schema - if: matrix.python-version == '3.10' @@ -43,6 +48,21 @@ jobs: source ./venv/bin/activate python -m pip install typing_extensions + - name: Install Senzing SDK + uses: senzing-factory/github-action-install-senzing-sdk@v2 + with: + senzingsdk-repository-path: ${{ secrets.SENZING_OSX_BETA_REPOSITORY }} + + - name: Copy /etc files + run: | + sudo mkdir -p /opt/senzing/er/etc + sudo cp testdata/senzing-license/g2.lic /opt/senzing/er/etc/g2.lic + + - name: Copy test database files + run: | + mkdir /tmp/sqlite + cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db + - name: Run pytest on tests run: | source ./venv/bin/activate diff --git a/.github/workflows/pytest-linux.yaml b/.github/workflows/pytest-linux.yaml index d1001e6..1ffaf95 100644 --- a/.github/workflows/pytest-linux.yaml +++ b/.github/workflows/pytest-linux.yaml @@ -3,7 +3,9 @@ name: pytest linux on: [push, pull_request] env: + LD_LIBRARY_PATH: /opt/senzing/er/lib PYTHONPATH: /home/runner/work/sz-sdk-python/sz-sdk-python/src + SENZING_TOOLS_DATABASE_URL: sqlite3://na:na@nowhere/tmp/sqlite/G2C.db permissions: contents: read @@ -17,6 +19,7 @@ jobs: matrix: os: [ubuntu-latest] python-version: ["3.9", "3.10", "3.11", "3.12"] + senzingsdk-version: [staging-v4] steps: - name: Checkout repository @@ -34,6 +37,7 @@ jobs: echo "PATH=${PATH}" >> "${GITHUB_ENV}" python -m pip install --upgrade pip python -m pip install --requirement requirements.txt + python -m pip install --requirement test-requirements.txt python -m pip install psutil pytest pytest-cov pytest-schema - if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' @@ -42,22 +46,57 @@ jobs: source ./venv/bin/activate python -m pip install typing_extensions + - name: Install Senzing SDK + uses: senzing-factory/github-action-install-senzing-sdk@v2 + with: + senzingsdk-repository-package: ${{ secrets.SENZING_APT_BETA_STAGING_REPOSITORY_PACKAGE }} + senzingsdk-repository-path: ${{ secrets.SENZING_APT_BETA_STAGING_REPOSITORY_URL }} + + - name: Copy /etc files + run: | + sudo mkdir -p /etc/opt/senzing + sudo cp testdata/senzing-license/g2.lic /etc/opt/senzing/g2.lic + + - name: Copy test database files + run: | + mkdir /tmp/sqlite + cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db + - name: Run pytest on tests run: | source ./venv/bin/activate pytest tests/ --verbose --capture=no --cov=src --cov-append - - name: Run unittest on examples + # Use pytest to check examples, there are no "test" classes/functions, pytest imports + # the .py files. If there is a Python error in the examples, an exit code of 1 + # is returned. If there are no Python errors but pytest didn't think it found any + # tests an exit code of 5 is returned, this is a pass but need to capture it and + # return 0 - https://docs.pytest.org/en/stable/reference/exit-codes.html + - name: Run pytest on examples run: | source ./venv/bin/activate - python3 -m unittest \ - examples/szconfig/*.py \ - examples/szconfigmanager/*.py \ - examples/szdiagnostic/*.py \ - examples/szengine/*.py \ - examples/szproduct/*.py \ - examples/misc/*.py \ - || true + set +e + pytest \ + examples/misc/ \ + examples/docs/ \ + examples/extras/ \ + examples/szabstractfactory/ \ + examples/szconfig/ \ + examples/szconfigmanager/ \ + examples/szdiagnostic/ \ + examples/szengine/ \ + examples/szproduct/ \ + --capture=no \ + -o python_files=*.py \ + --verbose + pytest_exit_code="$?" + set -e + if [ "$pytest_exit_code" -eq 5 ]; then + echo -e "\nExit code from pytest was $pytest_exit_code, this is expected testing the examples if there were no Python errors\n" + exit 0 + else + exit "$pytest_exit_code" + fi - name: Rename coverage file env: diff --git a/.github/workflows/pytest-windows.yaml b/.github/workflows/pytest-windows.yaml index 348ced9..0bbf4ab 100644 --- a/.github/workflows/pytest-windows.yaml +++ b/.github/workflows/pytest-windows.yaml @@ -3,20 +3,23 @@ name: pytest windows on: [pull_request, workflow_dispatch] env: + LD_LIBRARY_PATH: 'C:\Program Files\Senzing\er\lib' PYTHONPATH: 'D:\a\sz-sdk-python\sz-sdk-python\src' + SENZING_TOOLS_DATABASE_URL: 'sqlite3://na:na@nowhere/C:\Temp\sqlite\G2C.db' permissions: contents: read jobs: pytest-windows: - name: "pytest OS: ${{ matrix.os }}; Python ${{ matrix.python-version }}" + name: "pytest Senzing: ${{ matrix.senzingsdk-version }}; OS: ${{ matrix.os }}; Python ${{ matrix.python-version }}" runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [windows-latest] python-version: ["3.9", "3.10", "3.11", "3.12"] + senzingsdk-version: [staging-v4] steps: - name: Checkout repository @@ -33,14 +36,33 @@ jobs: .\\venv\\Scripts\\activate python -m pip install --upgrade pip python -m pip install --requirement requirements.txt + python -m pip install --requirement test-requirements.txt python -m pip install psutil pytest pytest-cov pytest-schema - - if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' - name: Install python libraries for python 3.8, 3.9, and 3.10 + - if: matrix.python-version == '3.9' || matrix.python-version == '3.10' + name: Install python libraries for python 3.9 and 3.10 run: | .\\venv\\Scripts\\activate python -m pip install typing_extensions + - name: Install Senzing SDK + uses: senzing-factory/github-action-install-senzing-sdk@v2 + with: + senzingsdk-repository-path: ${{ secrets.SENZING_WIN_BETA_REPOSITORY }} + + - name: Add to "Path" environment variable + run: | + printf "C:\Program Files\Senzing\er\lib" | Out-File -FilePath "$env:GITHUB_PATH" -Encoding utf8 -Append + + - name: Copy /etc files + run: | + copy testdata/senzing-license/g2.lic "C:\Program Files\Senzing\er\etc\g2.lic" + + - name: Copy test database files + run: | + mkdir "C:\Temp\sqlite" + copy testdata/sqlite/G2C.db "C:\Temp\sqlite\G2C.db" + - name: Run pytest on tests run: | .\\venv\\Scripts\\activate diff --git a/CHANGELOG.md b/CHANGELOG.md index 51919fd..8c47bf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,19 +7,24 @@ and this project adheres to [Semantic Versioning]. ## [Unreleased] +## [0.2.4] - 2025-02-14 + +### Changed in 0.2.4 + +- Updated documentation + ## [0.2.3] - 2025-02-10 ### Fixed in 0.2.3 - Added SzDatabaseTransientError & SzSdkError to \_\_init\_\_.py for importing - ## [0.2.2] - 2025-01-28 ### Added in 0.2.2 - Simpler class methods for szengineflags to build upon in a future release -- documentation-requirements.txt +- documentation-requirements.txt ### Changed in 0.2.2 diff --git a/Makefile b/Makefile index 699bdfd..d2879be 100755 --- a/Makefile +++ b/Makefile @@ -75,6 +75,7 @@ dependencies-for-development: venv dependencies-for-development-osarch-specific python3 -m pip install --upgrade pip; \ python3 -m pip install --requirement development-requirements.txt + .PHONY: dependencies-for-documentation dependencies-for-documentation: venv dependencies-for-documentation-osarch-specific $(activate-venv); \ @@ -115,24 +116,7 @@ lint: pylint mypy bandit black flake8 isort # ----------------------------------------------------------------------------- .PHONY: test -test: test-tests - - -.PHONY: test-tests -test-tests: - $(info --- Unit tests -----------------------------------------------------------------) - @$(activate-venv); pytest tests --verbose --capture=no --cov=src/senzing --cov-report xml:coverage.xml - - -# .PHONY: test-examples -# test-examples: -# $(info --- Test examples --------------------------------------------------------------) -# @$(activate-venv); python3 -m unittest \ -# examples/szconfig/*.py \ -# examples/szconfigmanager/*.py \ -# examples/szdiagnostic/*.py \ -# examples/szengine/*.py \ -# examples/szproduct/*.py +test: test-osarch-specific .PHONY: docker-test @@ -228,7 +212,7 @@ isort: mypy: $(info ${\n}) $(info --- mypy -----------------------------------------------------------------------) - @$(activate-venv); mypy --strict $(shell git ls-files '*.py' ':!:docs/source/*' ':!:examples/*') + @$(activate-venv); mypy --strict $(shell git ls-files '*.py' ':!:docs/source/*') .PHONY: pydoc diff --git a/docs/source/conf.py b/docs/source/conf.py index 6b3e604..1afbad8 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -33,6 +33,7 @@ sys.path.insert(0, os.path.abspath("../../src")) + extensions = [ "autodocsumm", # to generate tables of functions, attributes, methods, etc. "sphinx_toolbox.collapse", # support collapsable sections diff --git a/docs/source/index.rst b/docs/source/index.rst index 6a6a205..d69204e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,20 +3,51 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to sz-sdk-python's documentation! -========================================= +`senzing` Python package documentation +====================================== + +The `senzing`_ Python package contains the interface definitions +for the `senzing-core`_ and `senzing-grpc`_ implementation packages. + +By using interface definitions, implementation-agnostic code can be written. +For example, the following code does not need to know the underlying implementation +of the Senzing Abstract Factory: + +.. literalinclude:: ../../examples/docs/using_abstract_factory.py + :linenos: + :language: python + +Similarly, interface definitions for Senzing objects can be used. +Example: + +.. literalinclude:: ../../examples/docs/using_sz_engine.py + :linenos: + :language: python + +Senzing has additional Software Development Kits (SDKs) +for Java, Go, and C#. +Information for these SDKs can be found at `docs.senzing.com`_. .. toctree:: :maxdepth: 2 :caption: Contents: - modules - + senzing +References +========== -Indices and tables -================== +#. :ref:`genindex` +#. :ref:`modindex` +#. :ref:`search` +#. `GitHub`_ +#. `Pypi`_ +#. `senzing-core`_ +#. `senzing-grpc`_ -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +.. _docs.senzing.com: https://www.senzing.com/docs +.. _GitHub: https://github.com/senzing-garage/sz-sdk-python/tree/main/examples +.. _Pypi: https://pypi.org/project/senzing/ +.. _senzing-core: https://garage.senzing.com/sz-sdk-python-core +.. _senzing-grpc: https://garage.senzing.com/sz-sdk-python-grpc +.. _senzing: https://github.com/senzing-garage/sz-sdk-python diff --git a/docs/source/modules.rst b/docs/source/modules.rst deleted file mode 100644 index 2d78ffc..0000000 --- a/docs/source/modules.rst +++ /dev/null @@ -1,7 +0,0 @@ -senzing -======= - -.. toctree:: - :maxdepth: 4 - - senzing diff --git a/docs/source/senzing.rst b/docs/source/senzing.rst index 430747f..7d81747 100644 --- a/docs/source/senzing.rst +++ b/docs/source/senzing.rst @@ -1,69 +1,125 @@ senzing package =============== -Submodules ----------- - -senzing.szabstractfactory module --------------------------------- +The `senzing`_ Python package has 5 major modules / classes. +Senzing objects are created using an `Abstract Factory Pattern`_. + +.. list-table:: Senzing classes + :widths: 20 20 60 + :header-rows: 1 + + * - Module + - Class + - Creation + * - szconfig + - SzConfig + - `sz_config = sz_abstract_factory.create_config()` + * - szconfigmanager + - SzConfigManager + - `sz_configmanager = sz_abstract_factory.create_configmanager()` + * - szdiagnostic + - SzDiagnostic + - `sz_diagnostic = sz_abstract_factory.create_diagnostic()` + * - szengine + - SzEngine + - `sz_engine = sz_abstract_factory.create_engine()` + * - szproduct + - SzProduct + - `sz_product = sz_abstract_factory.create_product()` + +In the examples, the creation of the Senzing Abstract Factory has been abstracted to + +.. literalinclude:: ../../examples/docs/import_sz_abstract_factory.txt + :language: python + +and the creation of the Senzing objects has been abstracted to + +.. literalinclude:: ../../examples/docs/import_sz_engine.txt + :language: python + +Using the `senzing-core`_ Python package, the implementation looks like the following: + +.. literalinclude:: ../../examples/helpers/setup_senzing.py + :linenos: + :language: python + +Naturally, the ``__init__.py`` file needs to be modified to support importing the variables. +For the full implementation of the documentation examples, visit the source code on +`GitHub`_. + +szabstractfactory +----------------- .. automodule:: senzing.szabstractfactory :members: :undoc-members: :show-inheritance: -senzing.szconfig module ------------------------ +szconfig +-------- .. automodule:: senzing.szconfig :members: :undoc-members: :show-inheritance: -senzing.szconfigmanager module ------------------------------- +szconfigmanager +--------------- .. automodule:: senzing.szconfigmanager :members: :undoc-members: :show-inheritance: -senzing.szdiagnostic module ---------------------------- +szdiagnostic +------------ .. automodule:: senzing.szdiagnostic :members: :undoc-members: :show-inheritance: -senzing.szengine module ------------------------ +szengine +-------- .. automodule:: senzing.szengine :members: :undoc-members: :show-inheritance: -senzing.szengineflags module ----------------------------- +szproduct +--------- + +.. automodule:: senzing.szproduct + :members: + :undoc-members: + :show-inheritance: + +szengineflags +------------- .. automodule:: senzing.szengineflags :members: :undoc-members: :show-inheritance: -senzing.szproduct module ------------------------- +szerror +------- -.. automodule:: senzing.szproduct +.. automodule:: senzing.szerror :members: :undoc-members: :show-inheritance: -Module contents ---------------- +constants +--------- -.. automodule:: senzing +.. automodule:: senzing.constants :members: :undoc-members: :show-inheritance: + +.. _Abstract Factory Pattern: https://en.wikipedia.org/wiki/Abstract_factory_pattern +.. _GitHub: https://github.com/senzing-garage/sz-sdk-python/tree/main/examples +.. _senzing-core: https://garage.senzing.com/sz-sdk-python-core +.. _senzing: https://github.com/senzing-garage/sz-sdk-python \ No newline at end of file diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000..560b569 --- /dev/null +++ b/examples/__init__.py @@ -0,0 +1,17 @@ +from .helpers import ( + get_sz_abstract_factory, + get_sz_config, + get_sz_configmanager, + get_sz_diagnostic, + get_sz_engine, + get_sz_product, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_config", + "get_sz_configmanager", + "get_sz_diagnostic", + "get_sz_engine", + "get_sz_product", +] diff --git a/examples/docs/__init__.py b/examples/docs/__init__.py new file mode 100644 index 0000000..faf47d9 --- /dev/null +++ b/examples/docs/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_engine, + sz_abstract_factory, + sz_engine, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_engine", + "sz_abstract_factory", + "sz_engine", +] diff --git a/examples/docs/a_header_docs.py b/examples/docs/a_header_docs.py new file mode 100755 index 0000000..8d0cebb --- /dev/null +++ b/examples/docs/a_header_docs.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- docs ------------------------------------------------------------\n") diff --git a/examples/docs/import_sz_abstract_factory.txt b/examples/docs/import_sz_abstract_factory.txt new file mode 100644 index 0000000..15c67cc --- /dev/null +++ b/examples/docs/import_sz_abstract_factory.txt @@ -0,0 +1 @@ +from . import sz_abstract_factory diff --git a/examples/docs/import_sz_engine.txt b/examples/docs/import_sz_engine.txt new file mode 100644 index 0000000..4eca987 --- /dev/null +++ b/examples/docs/import_sz_engine.txt @@ -0,0 +1 @@ +from . import sz_engine diff --git a/examples/docs/using_abstract_factory.py b/examples/docs/using_abstract_factory.py new file mode 100644 index 0000000..5be6437 --- /dev/null +++ b/examples/docs/using_abstract_factory.py @@ -0,0 +1,9 @@ +from senzing import SzAbstractFactory, SzEngineFlags + + +def perform_senzing_search(sz_abstract_factory: SzAbstractFactory, attributes: str) -> str: + """Example Senzing search.""" + sz_engine = sz_abstract_factory.create_engine() + flags = SzEngineFlags.SZ_SEARCH_BY_ATTRIBUTES_DEFAULT_FLAGS + search_profile = "" + return sz_engine.search_by_attributes(attributes, flags, search_profile) diff --git a/examples/docs/using_sz_engine.py b/examples/docs/using_sz_engine.py new file mode 100644 index 0000000..36b436d --- /dev/null +++ b/examples/docs/using_sz_engine.py @@ -0,0 +1,8 @@ +from senzing import SzEngine, SzEngineFlags + + +def perform_senzing_search(sz_engine: SzEngine, attributes: str) -> str: + """Example Senzing search.""" + flags = SzEngineFlags.SZ_SEARCH_BY_ATTRIBUTES_DEFAULT_FLAGS + search_profile = "" + return sz_engine.search_by_attributes(attributes, flags, search_profile) diff --git a/examples/extras/szdiagnostic/szdiagnostic_initialize_with_debug.py b/examples/extras/szdiagnostic/szdiagnostic_initialize_with_debug.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/extras/szengine/add_record_with_info.py b/examples/extras/szengine/add_record_with_info.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/add_record_with_info.txt b/examples/extras/szengine/add_record_with_info.txt new file mode 100755 index 0000000..4fc7961 --- /dev/null +++ b/examples/extras/szengine/add_record_with_info.txt @@ -0,0 +1 @@ +// Output has been formatted for easier reading. diff --git a/examples/extras/szengine/delete_record_with_info.py b/examples/extras/szengine/delete_record_with_info.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/delete_record_with_info.txt b/examples/extras/szengine/delete_record_with_info.txt new file mode 100755 index 0000000..8a99656 --- /dev/null +++ b/examples/extras/szengine/delete_record_with_info.txt @@ -0,0 +1 @@ +// TODO: Construct output. diff --git a/examples/extras/szengine/export_csv_entity_report.py b/examples/extras/szengine/export_csv_entity_report.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/export_json_entity_report.py b/examples/extras/szengine/export_json_entity_report.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/fetch_next.py b/examples/extras/szengine/fetch_next.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/find_path_by_entity_id_with_exclusions.py b/examples/extras/szengine/find_path_by_entity_id_with_exclusions.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_entity_id_with_exclusions.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/find_path_by_entity_id_with_exclusions_and_required_data_sources.py b/examples/extras/szengine/find_path_by_entity_id_with_exclusions_and_required_data_sources.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_entity_id_with_exclusions_and_required_data_sources.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/find_path_by_entity_id_with_required_data_sources.py b/examples/extras/szengine/find_path_by_entity_id_with_required_data_sources.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_entity_id_with_required_data_sources.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/find_path_by_record_id_with_exclusions.py b/examples/extras/szengine/find_path_by_record_id_with_exclusions.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_record_id_with_exclusions.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/find_path_by_record_id_with_exclusions_and_required_data_sources.py b/examples/extras/szengine/find_path_by_record_id_with_exclusions_and_required_data_sources.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_record_id_with_exclusions_and_required_data_sources.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/find_path_by_record_id_with_required_data_sources.py b/examples/extras/szengine/find_path_by_record_id_with_required_data_sources.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/find_path_by_record_id_with_required_data_sources.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/g2engine_initialize_with_config_id.py b/examples/extras/szengine/g2engine_initialize_with_config_id.py new file mode 100755 index 0000000..b7a1e93 --- /dev/null +++ b/examples/extras/szengine/g2engine_initialize_with_config_id.py @@ -0,0 +1 @@ +# TODO: Create testable example. diff --git a/examples/extras/szengine/reevaluate_entity_with_info.py b/examples/extras/szengine/reevaluate_entity_with_info.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/reevaluate_entity_with_info.txt b/examples/extras/szengine/reevaluate_entity_with_info.txt new file mode 100755 index 0000000..8a99656 --- /dev/null +++ b/examples/extras/szengine/reevaluate_entity_with_info.txt @@ -0,0 +1 @@ +// TODO: Construct output. diff --git a/examples/extras/szengine/reevaluate_record_with_info.py b/examples/extras/szengine/reevaluate_record_with_info.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/extras/szengine/reevaluate_record_with_info.txt b/examples/extras/szengine/reevaluate_record_with_info.txt new file mode 100755 index 0000000..4857715 --- /dev/null +++ b/examples/extras/szengine/reevaluate_record_with_info.txt @@ -0,0 +1 @@ +// TODO: Construct output. \ No newline at end of file diff --git a/examples/extras/szengine/szengine_initialize_constructor.py b/examples/extras/szengine/szengine_initialize_constructor.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/helpers/__init__.py b/examples/helpers/__init__.py new file mode 100644 index 0000000..ce71643 --- /dev/null +++ b/examples/helpers/__init__.py @@ -0,0 +1,29 @@ +from .setup_senzing import ( + get_sz_abstract_factory, + get_sz_config, + get_sz_configmanager, + get_sz_diagnostic, + get_sz_engine, + get_sz_product, + sz_abstract_factory, + sz_config, + sz_configmanager, + sz_diagnostic, + sz_engine, + sz_product, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_config", + "get_sz_configmanager", + "get_sz_diagnostic", + "get_sz_engine", + "get_sz_product", + "sz_abstract_factory", + "sz_config", + "sz_configmanager", + "sz_diagnostic", + "sz_engine", + "sz_product", +] diff --git a/examples/helpers/setup_senzing.py b/examples/helpers/setup_senzing.py new file mode 100755 index 0000000..5e26e61 --- /dev/null +++ b/examples/helpers/setup_senzing.py @@ -0,0 +1,63 @@ +from senzing_core import SzAbstractFactoryCore + +from senzing import ( + SzAbstractFactory, + SzConfig, + SzConfigManager, + SzDiagnostic, + SzEngine, + SzError, + SzProduct, +) + +INSTANCE_NAME = "Example" +SETTINGS = { + "PIPELINE": { + "CONFIGPATH": "/etc/opt/senzing", + "RESOURCEPATH": "/opt/senzing/er/resources", + "SUPPORTPATH": "/opt/senzing/data", + }, + "SQL": {"CONNECTION": "sqlite3://na:na@/tmp/sqlite/G2C.db"}, +} + + +def get_sz_abstract_factory() -> SzAbstractFactory: + """Example AbstractFactory""" + try: + result = SzAbstractFactoryCore(INSTANCE_NAME, SETTINGS) + except SzError as err: + print(f"\nERROR: {err}\n") + return result + + +def get_sz_config() -> SzConfig: + """Example Config""" + return get_sz_abstract_factory().create_config() + + +def get_sz_configmanager() -> SzConfigManager: + """Example ConfigManager""" + return get_sz_abstract_factory().create_configmanager() + + +def get_sz_diagnostic() -> SzDiagnostic: + """Example Diagnostic""" + return get_sz_abstract_factory().create_diagnostic() + + +def get_sz_engine() -> SzEngine: + """Example Engine""" + return get_sz_abstract_factory().create_engine() + + +def get_sz_product() -> SzProduct: + """Example Product""" + return get_sz_abstract_factory().create_product() + + +sz_abstract_factory = get_sz_abstract_factory() +sz_config = get_sz_config() +sz_configmanager = get_sz_configmanager() +sz_diagnostic = get_sz_diagnostic() +sz_engine = get_sz_engine() +sz_product = get_sz_product() diff --git a/examples/misc/__init__.py b/examples/misc/__init__.py new file mode 100644 index 0000000..40337a0 --- /dev/null +++ b/examples/misc/__init__.py @@ -0,0 +1,6 @@ +from ..helpers.setup_senzing import get_sz_abstract_factory, sz_abstract_factory + +__all__ = [ + "get_sz_abstract_factory", + "sz_abstract_factory", +] diff --git a/examples/misc/a_header_misc.py b/examples/misc/a_header_misc.py new file mode 100755 index 0000000..02b01c1 --- /dev/null +++ b/examples/misc/a_header_misc.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- misc ------------------------------------------------------------\n") diff --git a/examples/misc/add_truthset_data.py b/examples/misc/add_truthset_data.py new file mode 100755 index 0000000..945cf50 --- /dev/null +++ b/examples/misc/add_truthset_data.py @@ -0,0 +1,27 @@ +from senzing import SZ_WITHOUT_INFO, SzError +from senzing_truthset import ( + TRUTHSET_CUSTOMER_RECORDS, + TRUTHSET_REFERENCE_RECORDS, + TRUTHSET_WATCHLIST_RECORDS, +) + +from . import get_sz_abstract_factory + +try: + sz_abstract_factory = get_sz_abstract_factory() + sz_engine = sz_abstract_factory.create_engine() + record_sets = [ + TRUTHSET_CUSTOMER_RECORDS, + TRUTHSET_REFERENCE_RECORDS, + TRUTHSET_WATCHLIST_RECORDS, + ] + for record_set in record_sets: + for record in record_set.values(): + sz_engine.add_record( + record.get("DataSource"), + record.get("Id"), + record.get("Json"), + SZ_WITHOUT_INFO, + ) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/misc/add_truthset_datasources.py b/examples/misc/add_truthset_datasources.py new file mode 100755 index 0000000..8ad92a1 --- /dev/null +++ b/examples/misc/add_truthset_datasources.py @@ -0,0 +1,23 @@ +from senzing import SzError +from senzing_truthset import TRUTHSET_DATASOURCES + +from . import get_sz_abstract_factory + +try: + sz_abstract_factory = get_sz_abstract_factory() + sz_config = sz_abstract_factory.create_config() + sz_configmanager = sz_abstract_factory.create_configmanager() + sz_diagnostic = sz_abstract_factory.create_diagnostic() + sz_engine = sz_abstract_factory.create_engine() + + current_default_config_id = sz_configmanager.get_default_config_id() + old_config_definition = sz_configmanager.get_config(current_default_config_id) + config_handle = sz_config.import_config(old_config_definition) + for data_source_code in TRUTHSET_DATASOURCES: + sz_config.add_data_source(config_handle, data_source_code) + new_config_definition = sz_config.export_config(config_handle) + new_default_config_id = sz_configmanager.add_config(new_config_definition, "Add TruthSet datasources") + sz_configmanager.replace_default_config_id(current_default_config_id, new_default_config_id) + sz_abstract_factory.reinitialize(new_default_config_id) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/misc/engine_flags_by_name.py b/examples/misc/engine_flags_by_name.py new file mode 100644 index 0000000..ccd8ac4 --- /dev/null +++ b/examples/misc/engine_flags_by_name.py @@ -0,0 +1,4 @@ +from senzing import SzEngineFlags + +result = SzEngineFlags.flags_by_name() +print(f"\n{result}\n") diff --git a/examples/misc/engine_flags_by_name.txt b/examples/misc/engine_flags_by_name.txt new file mode 100644 index 0000000..3db9a72 --- /dev/null +++ b/examples/misc/engine_flags_by_name.txt @@ -0,0 +1,54 @@ +// Output has been formatted for easier reading. + +{ + "SZ_ENTITY_BRIEF_DEFAULT_FLAGS": 1082304, + "SZ_ENTITY_CORE_FLAGS": 63488, + "SZ_ENTITY_DEFAULT_FLAGS": 3734464, + "SZ_ENTITY_INCLUDE_ALL_FEATURES": 1024, + "SZ_ENTITY_INCLUDE_ALL_RELATIONS": 960, + "SZ_ENTITY_INCLUDE_DISCLOSED_RELATIONS": 512, + "SZ_ENTITY_INCLUDE_ENTITY_NAME": 4096, + "SZ_ENTITY_INCLUDE_FEATURE_STATS": 16777216, + "SZ_ENTITY_INCLUDE_INTERNAL_FEATURES": 8388608, + "SZ_ENTITY_INCLUDE_NAME_ONLY_RELATIONS": 256, + "SZ_ENTITY_INCLUDE_POSSIBLY_RELATED_RELATIONS": 128, + "SZ_ENTITY_INCLUDE_POSSIBLY_SAME_RELATIONS": 64, + "SZ_ENTITY_INCLUDE_RECORD_DATA": 16384, + "SZ_ENTITY_INCLUDE_RECORD_FEATURE_DETAILS": 34359738368, + "SZ_ENTITY_INCLUDE_RECORD_FEATURE_IDS": 262144, + "SZ_ENTITY_INCLUDE_RECORD_FEATURE_STATS": 68719476736, + "SZ_ENTITY_INCLUDE_RECORD_JSON_DATA": 65536, + "SZ_ENTITY_INCLUDE_RECORD_MATCHING_INFO": 32768, + "SZ_ENTITY_INCLUDE_RECORD_SUMMARY": 8192, + "SZ_ENTITY_INCLUDE_RECORD_TYPES": 268435456, + "SZ_ENTITY_INCLUDE_RECORD_UNMAPPED_DATA": 2147483648, + "SZ_ENTITY_INCLUDE_RELATED_ENTITY_NAME": 524288, + "SZ_ENTITY_INCLUDE_RELATED_MATCHING_INFO": 1048576, + "SZ_ENTITY_INCLUDE_RELATED_RECORD_DATA": 4194304, + "SZ_ENTITY_INCLUDE_RELATED_RECORD_SUMMARY": 2097152, + "SZ_ENTITY_INCLUDE_RELATED_RECORD_TYPES": 536870912, + "SZ_ENTITY_INCLUDE_REPRESENTATIVE_FEATURES": 2048, + "SZ_EXPORT_DEFAULT_FLAGS": 3734497, + "SZ_EXPORT_INCLUDE_ALL_ENTITIES": 33, + "SZ_EXPORT_INCLUDE_ALL_HAVING_RELATIONSHIPS": 30, + "SZ_EXPORT_INCLUDE_DISCLOSED": 16, + "SZ_EXPORT_INCLUDE_MULTI_RECORD_ENTITIES": 1, + "SZ_EXPORT_INCLUDE_NAME_ONLY": 8, + "SZ_EXPORT_INCLUDE_POSSIBLY_RELATED": 4, + "SZ_EXPORT_INCLUDE_POSSIBLY_SAME": 2, + "SZ_EXPORT_INCLUDE_SINGLE_RECORD_ENTITIES": 32, + "SZ_FIND_NETWORK_DEFAULT_FLAGS": 8589946880, + "SZ_FIND_NETWORK_INCLUDE_MATCHING_INFO": 8589934592, + "SZ_FIND_PATH_DEFAULT_FLAGS": 1073754112, + "SZ_FIND_PATH_INCLUDE_MATCHING_INFO": 1073741824, + "SZ_FIND_PATH_STRICT_AVOID": 33554432, + "SZ_INCLUDE_FEATURE_SCORES": 67108864, + "SZ_INCLUDE_MATCH_KEY_DETAILS": 17179869184, + "SZ_SEARCH_BY_ATTRIBUTES_ALL": 67123215, + "SZ_SEARCH_BY_ATTRIBUTES_MINIMAL_STRONG": 3, + "SZ_SEARCH_BY_ATTRIBUTES_STRONG": 67123203, + "SZ_SEARCH_INCLUDE_ALL_ENTITIES": 15, + "SZ_SEARCH_INCLUDE_STATS": 134217728, + "SZ_WHY_ENTITIES_DEFAULT_FLAGS": 96009152, + "SZ_WITH_INFO": 4611686018427387904 +} \ No newline at end of file diff --git a/examples/misc/engine_flags_by_value.py b/examples/misc/engine_flags_by_value.py new file mode 100644 index 0000000..5c9f8e6 --- /dev/null +++ b/examples/misc/engine_flags_by_value.py @@ -0,0 +1,4 @@ +from senzing import SzEngineFlags + +result = SzEngineFlags.flags_by_value() +print(f"\n{result}\n") diff --git a/examples/misc/engine_flags_by_value.txt b/examples/misc/engine_flags_by_value.txt new file mode 100644 index 0000000..d225c4c --- /dev/null +++ b/examples/misc/engine_flags_by_value.txt @@ -0,0 +1,54 @@ +// Output has been formatted for easier reading. + +{ + 1: "SZ_EXPORT_INCLUDE_MULTI_RECORD_ENTITIES", + 2: "SZ_EXPORT_INCLUDE_POSSIBLY_SAME", + 3: "SZ_SEARCH_BY_ATTRIBUTES_MINIMAL_STRONG", + 4: "SZ_EXPORT_INCLUDE_POSSIBLY_RELATED", + 8: "SZ_EXPORT_INCLUDE_NAME_ONLY", + 15: "SZ_SEARCH_INCLUDE_ALL_ENTITIES", + 16: "SZ_EXPORT_INCLUDE_DISCLOSED", + 30: "SZ_EXPORT_INCLUDE_ALL_HAVING_RELATIONSHIPS", + 32: "SZ_EXPORT_INCLUDE_SINGLE_RECORD_ENTITIES", + 33: "SZ_EXPORT_INCLUDE_ALL_ENTITIES", + 64: "SZ_ENTITY_INCLUDE_POSSIBLY_SAME_RELATIONS", + 128: "SZ_ENTITY_INCLUDE_POSSIBLY_RELATED_RELATIONS", + 256: "SZ_ENTITY_INCLUDE_NAME_ONLY_RELATIONS", + 512: "SZ_ENTITY_INCLUDE_DISCLOSED_RELATIONS", + 960: "SZ_ENTITY_INCLUDE_ALL_RELATIONS", + 1024: "SZ_ENTITY_INCLUDE_ALL_FEATURES", + 2048: "SZ_ENTITY_INCLUDE_REPRESENTATIVE_FEATURES", + 4096: "SZ_ENTITY_INCLUDE_ENTITY_NAME", + 8192: "SZ_ENTITY_INCLUDE_RECORD_SUMMARY", + 16384: "SZ_ENTITY_INCLUDE_RECORD_DATA", + 32768: "SZ_ENTITY_INCLUDE_RECORD_MATCHING_INFO", + 63488: "SZ_ENTITY_CORE_FLAGS", + 65536: "SZ_ENTITY_INCLUDE_RECORD_JSON_DATA", + 262144: "SZ_ENTITY_INCLUDE_RECORD_FEATURE_IDS", + 524288: "SZ_ENTITY_INCLUDE_RELATED_ENTITY_NAME", + 1048576: "SZ_ENTITY_INCLUDE_RELATED_MATCHING_INFO", + 1082304: "SZ_ENTITY_BRIEF_DEFAULT_FLAGS", + 2097152: "SZ_ENTITY_INCLUDE_RELATED_RECORD_SUMMARY", + 3734464: "SZ_ENTITY_DEFAULT_FLAGS", + 3734497: "SZ_EXPORT_DEFAULT_FLAGS", + 4194304: "SZ_ENTITY_INCLUDE_RELATED_RECORD_DATA", + 8388608: "SZ_ENTITY_INCLUDE_INTERNAL_FEATURES", + 16777216: "SZ_ENTITY_INCLUDE_FEATURE_STATS", + 33554432: "SZ_FIND_PATH_STRICT_AVOID", + 67108864: "SZ_INCLUDE_FEATURE_SCORES", + 67123203: "SZ_SEARCH_BY_ATTRIBUTES_STRONG", + 67123215: "SZ_SEARCH_BY_ATTRIBUTES_ALL", + 96009152: "SZ_WHY_ENTITIES_DEFAULT_FLAGS", + 134217728: "SZ_SEARCH_INCLUDE_STATS", + 268435456: "SZ_ENTITY_INCLUDE_RECORD_TYPES", + 536870912: "SZ_ENTITY_INCLUDE_RELATED_RECORD_TYPES", + 1073741824: "SZ_FIND_PATH_INCLUDE_MATCHING_INFO", + 1073754112: "SZ_FIND_PATH_DEFAULT_FLAGS", + 2147483648: "SZ_ENTITY_INCLUDE_RECORD_UNMAPPED_DATA", + 8589934592: "SZ_FIND_NETWORK_INCLUDE_MATCHING_INFO", + 8589946880: "SZ_FIND_NETWORK_DEFAULT_FLAGS", + 17179869184: "SZ_INCLUDE_MATCH_KEY_DETAILS", + 34359738368: "SZ_ENTITY_INCLUDE_RECORD_FEATURE_DETAILS", + 68719476736: "SZ_ENTITY_INCLUDE_RECORD_FEATURE_STATS", + 4611686018427387904: "SZ_WITH_INFO" +} \ No newline at end of file diff --git a/examples/misc/engine_flags_combine_flags.py b/examples/misc/engine_flags_combine_flags.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/misc/engine_flags_combine_flags.txt b/examples/misc/engine_flags_combine_flags.txt new file mode 100644 index 0000000..67130bb --- /dev/null +++ b/examples/misc/engine_flags_combine_flags.txt @@ -0,0 +1,5 @@ +// Output has been formatted for easier reading. + +{ + "DSRC_ID": 1001 +} \ No newline at end of file diff --git a/examples/szabstractfactory/__init__.py b/examples/szabstractfactory/__init__.py new file mode 100644 index 0000000..40337a0 --- /dev/null +++ b/examples/szabstractfactory/__init__.py @@ -0,0 +1,6 @@ +from ..helpers.setup_senzing import get_sz_abstract_factory, sz_abstract_factory + +__all__ = [ + "get_sz_abstract_factory", + "sz_abstract_factory", +] diff --git a/examples/szabstractfactory/a_header_szabstractfactory.py b/examples/szabstractfactory/a_header_szabstractfactory.py new file mode 100755 index 0000000..8440baf --- /dev/null +++ b/examples/szabstractfactory/a_header_szabstractfactory.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- szabstractfactory -----------------------------------------------\n") diff --git a/examples/szabstractfactory/create_config.py b/examples/szabstractfactory/create_config.py new file mode 100755 index 0000000..fcc41bd --- /dev/null +++ b/examples/szabstractfactory/create_config.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_config = sz_abstract_factory.create_config() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/create_config.txt b/examples/szabstractfactory/create_config.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/create_config.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/create_configmanager.py b/examples/szabstractfactory/create_configmanager.py new file mode 100755 index 0000000..8f892f4 --- /dev/null +++ b/examples/szabstractfactory/create_configmanager.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_configmanager = sz_abstract_factory.create_configmanager() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/create_configmanager.txt b/examples/szabstractfactory/create_configmanager.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/create_configmanager.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/create_diagnostic.py b/examples/szabstractfactory/create_diagnostic.py new file mode 100755 index 0000000..c386ff1 --- /dev/null +++ b/examples/szabstractfactory/create_diagnostic.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_diagnostic = sz_abstract_factory.create_diagnostic() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/create_diagnostic.txt b/examples/szabstractfactory/create_diagnostic.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/create_diagnostic.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/create_engine.py b/examples/szabstractfactory/create_engine.py new file mode 100755 index 0000000..18250cc --- /dev/null +++ b/examples/szabstractfactory/create_engine.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_engine = sz_abstract_factory.create_engine() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/create_engine.txt b/examples/szabstractfactory/create_engine.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/create_engine.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/create_product.py b/examples/szabstractfactory/create_product.py new file mode 100755 index 0000000..734fc5d --- /dev/null +++ b/examples/szabstractfactory/create_product.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_product = sz_abstract_factory.create_product() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/create_product.txt b/examples/szabstractfactory/create_product.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/create_product.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/initialize_with_config_id.py b/examples/szabstractfactory/initialize_with_config_id.py new file mode 100755 index 0000000..69b150f --- /dev/null +++ b/examples/szabstractfactory/initialize_with_config_id.py @@ -0,0 +1,19 @@ +from senzing_core import SzAbstractFactoryCore + +from senzing import SzError + +try: + # The value of config_id is made up. Any object created by this AbstractFactory will fail. + CONFIG_ID = 2787481550 + INSTANCE_NAME = "Example" + settings = { + "PIPELINE": { + "CONFIGPATH": "/etc/opt/senzing", + "RESOURCEPATH": "/opt/senzing/er/resources", + "SUPPORTPATH": "/opt/senzing/data", + }, + "SQL": {"CONNECTION": "sqlite3://na:na@/tmp/sqlite/G2C.db"}, + } + sz_abstract_factory = SzAbstractFactoryCore(INSTANCE_NAME, settings, CONFIG_ID) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/initialize_with_config_id.txt b/examples/szabstractfactory/initialize_with_config_id.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/initialize_with_config_id.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/initialize_with_debug.py b/examples/szabstractfactory/initialize_with_debug.py new file mode 100755 index 0000000..82a3438 --- /dev/null +++ b/examples/szabstractfactory/initialize_with_debug.py @@ -0,0 +1,20 @@ +from senzing_core import SzAbstractFactoryCore + +from senzing import SzError + +try: + INSTANCE_NAME = "Example" + settings = { + "PIPELINE": { + "CONFIGPATH": "/etc/opt/senzing", + "RESOURCEPATH": "/opt/senzing/er/resources", + "SUPPORTPATH": "/opt/senzing/data", + }, + "SQL": {"CONNECTION": "sqlite3://na:na@/tmp/sqlite/G2C.db"}, + } + VERBOSE_LOGGING = 1 + sz_abstract_factory = SzAbstractFactoryCore(INSTANCE_NAME, settings, verbose_logging=VERBOSE_LOGGING) + # Create an engine to show debug output + sz_abstract_factory.create_engine() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/initialize_with_debug.txt b/examples/szabstractfactory/initialize_with_debug.txt new file mode 100644 index 0000000..ce8fe99 --- /dev/null +++ b/examples/szabstractfactory/initialize_with_debug.txt @@ -0,0 +1,121 @@ +2025-01-17T22:20:27Z [:281473533707456] INFO: Searching for transliteration rules files in /opt/senzing/data +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/arabicTransRule.ibm +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/cyrillicTransRule.ibm +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/greekTransRule.ibm +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/hindiTransRule.ibm +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/japaneseTransRule.ibm +2025-01-17T22:20:27Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/koreanTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/chineseTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/latinTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/cyrillicOnTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/hindiOnTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/japaneseOnTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/koreanOnTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/chineseOnTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/thaiTransRules.sz +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/khmerTransRules.sz +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/burmeseTransRules.sz +2025-01-17T22:20:28Z [:281473533707456] INFO: Loading transliteration rule file: /opt/senzing/data/anyTransRule.ibm +2025-01-17T22:20:28Z [:281473533707456] DBUG: This instance is not expecting anonymized data +2025-01-17T22:20:28Z [:281473533707456] DBUG: Can not hash data +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading Default Token Library [/etc/opt/senzing/cfgVariant.json]. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Verifying data store version and config document. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Opening connection to database type sqlite3: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Connected to database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Shards are not used for the data store. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Opening connection to database type sqlite3: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Connected to database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Shards are not used for the data store. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Load parameters store... +2025-01-17T22:20:28Z [:281473533707456] DBUG: Populate active store data... +2025-01-17T22:20:28Z [:281473533707456] DBUG: Load containers... +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_FELEM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_FTYPE configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_FCLASS configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_ERFRAG configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_ERRULE configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_CFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_CFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_CFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_DFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_DFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_DFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_CFRTN configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_DSRC_INTEREST configuration. +2025-01-17T22:20:28Z [:281473533707456] WARN: Configuration [CFG_DSRC_INTEREST] returned an empty config +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_RCLASS configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_RTYPE configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_FBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading SYS_OOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_DSRC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_GPLAN configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_FBOVR configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_EFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_EFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_EFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_SFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_SFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_GENERIC_THRESHOLD configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Loading CFG_ATTR configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Finalize and verify integrity... +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_FTYPE configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_FBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_FBOVR configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_GPLAN configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_GENERIC_THRESHOLD configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_ERFRAG configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_ERRULE configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_SFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_SFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Initializing standardize feature plugins. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_EFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_EFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Initializing expressed feature plugins. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_EFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_CFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_CFRTN configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_CFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Initializing score feature plugins. +2025-01-17T22:20:28Z [:281473533707456] DBUG: PoBoxExclusive: false +2025-01-17T22:20:28Z [:281473533707456] DBUG: PoBoxExclusiveMode: 10 +2025-01-17T22:20:28Z [:281473533707456] DBUG: PoBoxExactNumber: true +2025-01-17T22:20:28Z [:281473533707456] DBUG: ExactLibFeatMatch: false +2025-01-17T22:20:28Z [:281473533707456] DBUG: ContextFreeMatchThreshold: -1 +2025-01-17T22:20:28Z [:281473533707456] DBUG: HouseNumberFloor: 80 +2025-01-17T22:20:28Z [:281473533707456] DBUG: UnitNumberFloor: 80 +2025-01-17T22:20:28Z [:281473533707456] DBUG: ConfusedPenaltyPercent: 5 +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_CFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_DFUNC configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_DFCALL configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Initializing distinct feature plugins. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_DFBOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying data encryption configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying CFG_DSRC_INTEREST configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying SYS_OOM configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Verifying ScoreCardBuilder configuration. +2025-01-17T22:20:28Z [:281473533707456] DBUG: ...Initializing expressed feature mapping configuration. +2025-01-17T22:20:28Z [:281473533707456] INFO: Specified Configuration Checksum = [] +2025-01-17T22:20:28Z [:281473533707456] INFO: This node will perform configuration checks on inbound data. +2025-01-17T22:20:28Z [:281473533707456] INFO: Calculated Configuration Checksum = [w+N3/Y6KVeoUvnrhqAmmI1EzAExM7QMHlw3mJ+u6Nqs=] +2025-01-17T22:20:28Z [:281473533707456] INFO: The specified configuration checksum matches the calculated configuration checksum. +2025-01-17T22:20:28Z [:281473533707456] INFO: This resolver node will perform configuration checks on inbound data. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Closing connection to database: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Disconnected from database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Closing connection to database: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Disconnected from database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Data store version and config document verified. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Verifying config integrity. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Opening connection to database type sqlite3: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Connected to database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Shards are not used for the data store. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Done verifying config integrity. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Closing connection to database: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Disconnected from database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Creating engine shared database connection. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Opening connection to database type sqlite3: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Connected to database. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Shards are not used for the data store. +2025-01-17T22:20:28Z [:281473533707456] DBUG: Done creating engine shared database connection. +2025-01-17T22:20:28Z [:281473533707456] TRCE: Sz_destroy() +2025-01-17T22:20:28Z [:281473533707456] DBUG: Closing connection to database: +2025-01-17T22:20:28Z [:281473533707456] DBUG: Disconnected from database. diff --git a/examples/szabstractfactory/initialize_without_debug.py b/examples/szabstractfactory/initialize_without_debug.py new file mode 100755 index 0000000..0a9d193 --- /dev/null +++ b/examples/szabstractfactory/initialize_without_debug.py @@ -0,0 +1,20 @@ +from senzing_core import SzAbstractFactoryCore + +from senzing import SzError + +try: + INSTANCE_NAME = "Example" + settings = { + "PIPELINE": { + "CONFIGPATH": "/etc/opt/senzing", + "RESOURCEPATH": "/opt/senzing/er/resources", + "SUPPORTPATH": "/opt/senzing/data", + }, + "SQL": {"CONNECTION": "sqlite3://na:na@/tmp/sqlite/G2C.db"}, + } + VERBOSE_LOGGING = 0 + sz_abstract_factory = SzAbstractFactoryCore(INSTANCE_NAME, settings, verbose_logging=VERBOSE_LOGGING) + # Create an engine to show debug output + sz_abstract_factory.create_engine() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/initialize_without_debug.txt b/examples/szabstractfactory/initialize_without_debug.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/initialize_without_debug.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szabstractfactory/reinitialize.py b/examples/szabstractfactory/reinitialize.py new file mode 100755 index 0000000..e0f2bdc --- /dev/null +++ b/examples/szabstractfactory/reinitialize.py @@ -0,0 +1,11 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + # Using get_active_config_id for demonstrations purposes. + sz_engine = sz_abstract_factory.create_engine() + config_id = sz_engine.get_active_config_id() + sz_abstract_factory.reinitialize(config_id) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szabstractfactory/reinitialize.txt b/examples/szabstractfactory/reinitialize.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szabstractfactory/reinitialize.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfig/__init__.py b/examples/szconfig/__init__.py new file mode 100644 index 0000000..f175aa5 --- /dev/null +++ b/examples/szconfig/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_config, + sz_abstract_factory, + sz_config, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_config", + "sz_abstract_factory", + "sz_config", +] diff --git a/examples/szconfig/a_header_szconfig.py b/examples/szconfig/a_header_szconfig.py new file mode 100755 index 0000000..853284e --- /dev/null +++ b/examples/szconfig/a_header_szconfig.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- szconfig --------------------------------------------------------\n") diff --git a/examples/szconfig/add_data_source.py b/examples/szconfig/add_data_source.py new file mode 100755 index 0000000..fa9747d --- /dev/null +++ b/examples/szconfig/add_data_source.py @@ -0,0 +1,12 @@ +from senzing import SzError + +from . import sz_config + +try: + DATA_SOURCE_CODE = "NAME_OF_DATASOURCE" + config_handle = sz_config.create_config() + result = sz_config.add_data_source(config_handle, DATA_SOURCE_CODE) + sz_config.close_config(config_handle) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/add_data_source.txt b/examples/szconfig/add_data_source.txt new file mode 100644 index 0000000..67130bb --- /dev/null +++ b/examples/szconfig/add_data_source.txt @@ -0,0 +1,5 @@ +// Output has been formatted for easier reading. + +{ + "DSRC_ID": 1001 +} \ No newline at end of file diff --git a/examples/szconfig/create_and_close.py b/examples/szconfig/create_and_close.py new file mode 100755 index 0000000..76035f6 --- /dev/null +++ b/examples/szconfig/create_and_close.py @@ -0,0 +1,12 @@ +from senzing import SzError + +from . import sz_config + +try: + config_handle = sz_config.create_config() + + # Do work. + + sz_config.close_config(config_handle) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/create_and_close.txt b/examples/szconfig/create_and_close.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfig/create_and_close.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfig/create_export_import_close.py b/examples/szconfig/create_export_import_close.py new file mode 100755 index 0000000..9b82f1d --- /dev/null +++ b/examples/szconfig/create_export_import_close.py @@ -0,0 +1,12 @@ +from senzing import SzError + +from . import sz_config + +try: + config_handle_1 = sz_config.create_config() # Create first in-memory. + config_definition = sz_config.export_config(config_handle_1) # Save in-memory to string. + config_handle_2 = sz_config.import_config(config_definition) # Create second in-memory. + sz_config.close_config(config_handle_1) + sz_config.close_config(config_handle_2) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/delete_data_source.py b/examples/szconfig/delete_data_source.py new file mode 100755 index 0000000..18f966f --- /dev/null +++ b/examples/szconfig/delete_data_source.py @@ -0,0 +1,11 @@ +from senzing import SzError + +from . import sz_config + +try: + DATA_SOURCE_CODE = "TEST" + config_handle = sz_config.create_config() + sz_config.delete_data_source(config_handle, DATA_SOURCE_CODE) + sz_config.close_config(config_handle) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/delete_data_source.txt b/examples/szconfig/delete_data_source.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfig/delete_data_source.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfig/export_config.py b/examples/szconfig/export_config.py new file mode 100755 index 0000000..fa64ab3 --- /dev/null +++ b/examples/szconfig/export_config.py @@ -0,0 +1,11 @@ +from senzing import SzError + +from . import sz_config + +try: + config_handle = sz_config.create_config() # Create first in-memory. + config_definition = sz_config.export_config(config_handle) # Save in-memory to string. + sz_config.close_config(config_handle) + print(f"\n{config_definition}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/export_config.txt b/examples/szconfig/export_config.txt new file mode 100644 index 0000000..42c8ac6 --- /dev/null +++ b/examples/szconfig/export_config.txt @@ -0,0 +1,47 @@ +// Output has been formatted and pruned for easier reading. +// To view a complete configuration, visit /opt/senzing/er/resources/templates/g2config.json + +{ + "G2_CONFIG": { + "CFG_ATTR": [], + "CFG_CFBOM": [], + "CFG_CFCALL": [], + "CFG_CFRTN": [], + "CFG_CFUNC": [], + "CFG_DFBOM": [], + "CFG_DFCALL": [], + "CFG_DFUNC": [], + "CFG_DSRC": [], + "CFG_DSRC_INTEREST": [], + "CFG_ECLASS": [], + "CFG_EFBOM": [], + "CFG_EFCALL": [], + "CFG_EFUNC": [], + "CFG_ERFRAG": [], + "CFG_ERRULE": [], + "CFG_ETYPE": [], + "CFG_FBOM": [], + "CFG_FBOVR": [], + "CFG_FCLASS": [], + "CFG_FELEM": [], + "CFG_FTYPE": [], + "CFG_GENERIC_THRESHOLD": [], + "CFG_GPLAN": [], + "CFG_LENS": [], + "CFG_LENSRL": [], + "CFG_RCLASS": [], + "CFG_RTYPE": [], + "CFG_SFCALL": [], + "CFG_SFUNC": [], + "SYS_OOM": [], + "CONFIG_BASE_VERSION": { + "VERSION": "4.0.0", + "BUILD_VERSION": "4.0.0.00000", + "BUILD_DATE": "2025-01-01", + "BUILD_NUMBER": "00000", + "COMPATIBILITY_VERSION": { + "CONFIG_VERSION": "11" + } + } + } +} \ No newline at end of file diff --git a/examples/szconfig/get_data_sources.py b/examples/szconfig/get_data_sources.py new file mode 100755 index 0000000..a34f847 --- /dev/null +++ b/examples/szconfig/get_data_sources.py @@ -0,0 +1,11 @@ +from senzing import SzError + +from . import sz_config + +try: + config_handle = sz_config.create_config() + result = sz_config.get_data_sources(config_handle) + sz_config.close_config(config_handle) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/get_data_sources.txt b/examples/szconfig/get_data_sources.txt new file mode 100644 index 0000000..397fcbd --- /dev/null +++ b/examples/szconfig/get_data_sources.txt @@ -0,0 +1,14 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCES": [ + { + "DSRC_ID": 1, + "DSRC_CODE": "TEST" + }, + { + "DSRC_ID": 2, + "DSRC_CODE": "SEARCH" + } + ] +} \ No newline at end of file diff --git a/examples/szconfig/import_config.py b/examples/szconfig/import_config.py new file mode 100755 index 0000000..3d52213 --- /dev/null +++ b/examples/szconfig/import_config.py @@ -0,0 +1,12 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_config = sz_abstract_factory.create_config() + sz_configmanager = sz_abstract_factory.create_configmanager() + config_id = sz_configmanager.get_default_config_id() + config_definition = sz_configmanager.get_config(config_id) + config_handle = sz_config.import_config(config_definition) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/import_config.txt b/examples/szconfig/import_config.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfig/import_config.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfig/szconfig_constructor.py b/examples/szconfig/szconfig_constructor.py new file mode 100755 index 0000000..fcc41bd --- /dev/null +++ b/examples/szconfig/szconfig_constructor.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_config = sz_abstract_factory.create_config() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfig/szconfig_initialize_and_destroy.py b/examples/szconfig/szconfig_initialize_and_destroy.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szconfigmanager/__init__.py b/examples/szconfigmanager/__init__.py new file mode 100644 index 0000000..ccec3a1 --- /dev/null +++ b/examples/szconfigmanager/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_configmanager, + sz_abstract_factory, + sz_configmanager, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_configmanager", + "sz_abstract_factory", + "sz_configmanager", +] diff --git a/examples/szconfigmanager/a_header_szconfigmanager.py b/examples/szconfigmanager/a_header_szconfigmanager.py new file mode 100755 index 0000000..77ec22c --- /dev/null +++ b/examples/szconfigmanager/a_header_szconfigmanager.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- szconfigmanager -------------------------------------------------\n") diff --git a/examples/szconfigmanager/add_config.py b/examples/szconfigmanager/add_config.py new file mode 100755 index 0000000..c204bd5 --- /dev/null +++ b/examples/szconfigmanager/add_config.py @@ -0,0 +1,13 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + CONFIG_COMMENT = "Just an empty example" + sz_config = sz_abstract_factory.create_config() + sz_configmanager = sz_abstract_factory.create_configmanager() + config_handle = sz_config.create_config() + config_definition = sz_config.export_config(config_handle) + config_id = sz_configmanager.add_config(config_definition, CONFIG_COMMENT) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/add_config.txt b/examples/szconfigmanager/add_config.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfigmanager/add_config.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfigmanager/get_config.py b/examples/szconfigmanager/get_config.py new file mode 100755 index 0000000..77ccf12 --- /dev/null +++ b/examples/szconfigmanager/get_config.py @@ -0,0 +1,10 @@ +from senzing import SzError + +from . import sz_configmanager + +try: + config_id = sz_configmanager.get_default_config_id() + config_definition = sz_configmanager.get_config(config_id) + print(f"\n{config_definition}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/get_config.txt b/examples/szconfigmanager/get_config.txt new file mode 100644 index 0000000..9352c05 --- /dev/null +++ b/examples/szconfigmanager/get_config.txt @@ -0,0 +1,266 @@ +// Output has been formatted and pruned for easier reading. + +{ + "G2_CONFIG": { + "CFG_ATTR": [ + { + "ATTR_ID": 1001, + "ATTR_CODE": "DATA_SOURCE", + "ATTR_CLASS": "OBSERVATION", + "FTYPE_CODE": null, + "FELEM_CODE": null, + "FELEM_REQ": "Yes", + "DEFAULT_VALUE": null, + "INTERNAL": "No" + } + ], + "CFG_CFBOM": [ + { + "CFCALL_ID": 1, + "FTYPE_ID": 1, + "FELEM_ID": 2, + "EXEC_ORDER": 1 + } + ], + "CFG_CFCALL": [ + { + "CFCALL_ID": 1, + "FTYPE_ID": 1, + "CFUNC_ID": 2 + } + ], + "CFG_CFRTN": [ + { + "CFRTN_ID": 1, + "CFUNC_ID": 1, + "FTYPE_ID": 0, + "CFUNC_RTNVAL": "FULL_SCORE", + "EXEC_ORDER": 1, + "SAME_SCORE": 100, + "CLOSE_SCORE": 90, + "LIKELY_SCORE": 80, + "PLAUSIBLE_SCORE": 70, + "UN_LIKELY_SCORE": 60 + } + ], + "CFG_CFUNC": [ + { + "CFUNC_ID": 1, + "CFUNC_CODE": "STR_COMP", + "CFUNC_DESC": "String comparison", + "CONNECT_STR": "g2StringComp", + "ANON_SUPPORT": "Yes", + "LANGUAGE": null + } + ], + "CFG_DFBOM": [ + { + "DFCALL_ID": 1, + "FTYPE_ID": 1, + "FELEM_ID": 2, + "EXEC_ORDER": 1 + } + ], + "CFG_DFCALL": [ + { + "DFCALL_ID": 1, + "FTYPE_ID": 1, + "DFUNC_ID": 5 + } + ], + "CFG_DFUNC": [ + { + "DFUNC_ID": 1, + "DFUNC_CODE": "FELEM_STRICT_SUBSET", + "DFUNC_DESC": "Strict subset of felems", + "CONNECT_STR": "g2StrictSubsetFelems", + "ANON_SUPPORT": "Yes", + "LANGUAGE": null + } + ], + "CFG_DSRC": [ + { + "DSRC_ID": 1, + "DSRC_CODE": "TEST", + "DSRC_DESC": "Test", + "RETENTION_LEVEL": "Remember" + } + ], + "CFG_DSRC_INTEREST": [], + "CFG_EFBOM": [ + { + "EFCALL_ID": 1, + "FTYPE_ID": 6, + "FELEM_ID": 60, + "EXEC_ORDER": 1, + "FELEM_REQ": "Yes" + } + ], + "CFG_EFCALL": [ + { + "EFCALL_ID": 1, + "FTYPE_ID": 6, + "FELEM_ID": -1, + "EFUNC_ID": 4, + "EXEC_ORDER": 1, + "EFEAT_FTYPE_ID": -1, + "IS_VIRTUAL": "No" + } + ], + "CFG_EFUNC": [ + { + "EFUNC_ID": 1, + "EFUNC_CODE": "EXPRESS_BOM", + "EFUNC_DESC": "General BOM Hasher", + "CONNECT_STR": "g2GenericHasher", + "LANGUAGE": null + } + ], + "CFG_ERFRAG": [ + { + "ERFRAG_ID": 11, + "ERFRAG_CODE": "SAME_NAME", + "ERFRAG_DESC": "SAME_NAME", + "ERFRAG_SOURCE": "./FRAGMENT[./GNR_SAME_NAME>0]", + "ERFRAG_DEPENDS": "301" + } + ], + "CFG_ERRULE": [ + { + "ERRULE_ID": 100, + "ERRULE_CODE": "SAME_A1", + "RESOLVE": "Yes", + "RELATE": "No", + "RTYPE_ID": 1, + "QUAL_ERFRAG_CODE": "SAME_A1", + "DISQ_ERFRAG_CODE": null, + "ERRULE_TIER": 10 + } + ], + "CFG_FBOM": [ + { + "FTYPE_ID": 1, + "FELEM_ID": 2, + "EXEC_ORDER": 1, + "DISPLAY_LEVEL": 1, + "DISPLAY_DELIM": null, + "DERIVED": "No" + } + ], + "CFG_FBOVR": [ + { + "FTYPE_ID": 5, + "UTYPE_CODE": "BUSINESS", + "FTYPE_FREQ": "FF", + "FTYPE_EXCL": "Yes", + "FTYPE_STAB": "No" + } + ], + "CFG_FCLASS": [ + { + "FCLASS_ID": 1, + "FCLASS_CODE": "NAME" + } + ], + "CFG_FELEM": [ + { + "FELEM_ID": 2, + "FELEM_CODE": "FULL_NAME", + "FELEM_DESC": "Full name", + "DATA_TYPE": "string" + } + ], + "CFG_FTYPE": [ + { + "FTYPE_ID": 1, + "FTYPE_CODE": "NAME", + "FTYPE_DESC": "Name", + "FCLASS_ID": 1, + "FTYPE_FREQ": "NAME", + "FTYPE_EXCL": "No", + "FTYPE_STAB": "No", + "PERSIST_HISTORY": "Yes", + "USED_FOR_CAND": "No", + "DERIVED": "No", + "RTYPE_ID": 0, + "ANONYMIZE": "No", + "VERSION": 2, + "SHOW_IN_MATCH_KEY": "Yes" + } + ], + "CFG_GENERIC_THRESHOLD": [ + { + "GPLAN_ID": 1, + "BEHAVIOR": "NAME", + "FTYPE_ID": 0, + "CANDIDATE_CAP": 10, + "SCORING_CAP": -1, + "SEND_TO_REDO": "Yes" + } + ], + "CFG_GPLAN": [ + { + "GPLAN_ID": 1, + "GPLAN_CODE": "INGEST", + "GPLAN_DESC": "Standard Ingestion" + } + ], + "CFG_RCLASS": [ + { + "RCLASS_ID": 1, + "RCLASS_CODE": "DERIVED", + "RCLASS_DESC": "Derived", + "IS_DISCLOSED": "No" + } + ], + "CFG_RTYPE": [ + { + "RTYPE_ID": 1, + "RTYPE_CODE": "RESOLVED", + "RTYPE_DESC": "Resolved", + "RCLASS_ID": 1, + "BREAK_RES": "No" + } + ], + "CFG_SFCALL": [ + { + "SFCALL_ID": 1, + "FTYPE_ID": 1, + "FELEM_ID": -1, + "SFUNC_ID": 1, + "EXEC_ORDER": 1 + } + ], + "CFG_SFUNC": [ + { + "SFUNC_ID": 1, + "SFUNC_CODE": "PARSE_NAME", + "SFUNC_DESC": "Parse name", + "CONNECT_STR": "g2ParseName", + "LANGUAGE": null + } + ], + "SYS_OOM": [ + { + "OOM_TYPE": "RF", + "OOM_LEVEL": "SYSDEFAULT", + "FTYPE_ID": 0, + "THRESH1_CNT": 100, + "THRESH1_OOM": 10, + "NEXT_THRESH": 1000 + } + ], + "SETTINGS": { + "METAPHONE_VERSION": 3 + }, + "CONFIG_BASE_VERSION": { + "VERSION": "4.0.0", + "BUILD_VERSION": "4.0.0.00000", + "BUILD_DATE": "2025-01-01", + "BUILD_NUMBER": "00000", + "COMPATIBILITY_VERSION": { + "CONFIG_VERSION": "11" + } + } + } +} \ No newline at end of file diff --git a/examples/szconfigmanager/get_configs.py b/examples/szconfigmanager/get_configs.py new file mode 100755 index 0000000..0f08735 --- /dev/null +++ b/examples/szconfigmanager/get_configs.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_configmanager + +try: + config_list = sz_configmanager.get_configs() + print(f"\n{config_list}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/get_configs.txt b/examples/szconfigmanager/get_configs.txt new file mode 100644 index 0000000..25550a7 --- /dev/null +++ b/examples/szconfigmanager/get_configs.txt @@ -0,0 +1,16 @@ +// Output has been formatted for easier reading. + +{ + "CONFIGS": [ + { + "CONFIG_ID": 41320074, + "CONFIG_COMMENTS": "Default Senzing configuration", + "SYS_CREATE_DT": "YYYY-MM-DD HH:MM:SS.mmm" + }, + { + "CONFIG_ID": 490826130, + "CONFIG_COMMENTS": "Test", + "SYS_CREATE_DT": "YYYY-MM-DD HH:MM:SS.mmm" + } + ] +} \ No newline at end of file diff --git a/examples/szconfigmanager/get_default_config_id.py b/examples/szconfigmanager/get_default_config_id.py new file mode 100755 index 0000000..c05a2f5 --- /dev/null +++ b/examples/szconfigmanager/get_default_config_id.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_configmanager + +try: + config_id = sz_configmanager.get_default_config_id() + print(f"\n{config_id}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/get_default_config_id.txt b/examples/szconfigmanager/get_default_config_id.txt new file mode 100644 index 0000000..fca2564 --- /dev/null +++ b/examples/szconfigmanager/get_default_config_id.txt @@ -0,0 +1 @@ +692503001 \ No newline at end of file diff --git a/examples/szconfigmanager/replace_default_config_id.py b/examples/szconfigmanager/replace_default_config_id.py new file mode 100755 index 0000000..e955b91 --- /dev/null +++ b/examples/szconfigmanager/replace_default_config_id.py @@ -0,0 +1,26 @@ +import time + +from senzing import SzError + +from . import sz_abstract_factory + +try: + CONFIG_COMMENT = "Just an example" + data_source_code = f"REPLACE_DEFAULT_CONFIG_ID_{time.time()}" + sz_config = sz_abstract_factory.create_config() + sz_configmanager = sz_abstract_factory.create_configmanager() + current_default_config_id = sz_configmanager.get_default_config_id() + + # Create a new config. + + current_config_definition = sz_configmanager.get_config(current_default_config_id) + current_config_handle = sz_config.import_config(current_config_definition) + sz_config.add_data_source(current_config_handle, data_source_code) + new_config_definition = sz_config.export_config(current_config_handle) + new_default_config_id = sz_configmanager.add_config(new_config_definition, CONFIG_COMMENT) + + # Replace default config id. + + sz_configmanager.replace_default_config_id(current_default_config_id, new_default_config_id) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/replace_default_config_id.txt b/examples/szconfigmanager/replace_default_config_id.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfigmanager/replace_default_config_id.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfigmanager/set_default_config_id.py b/examples/szconfigmanager/set_default_config_id.py new file mode 100755 index 0000000..8cd729e --- /dev/null +++ b/examples/szconfigmanager/set_default_config_id.py @@ -0,0 +1,26 @@ +import time + +from senzing import SzError + +from . import sz_abstract_factory + +try: + CONFIG_COMMENT = "Just an example" + data_source_code = f"REPLACE_DEFAULT_CONFIG_ID_{time.time()}" + sz_config = sz_abstract_factory.create_config() + sz_configmanager = sz_abstract_factory.create_configmanager() + old_config_id = sz_configmanager.get_default_config_id() + + # Create a new config. + + old_config_definition = sz_configmanager.get_config(old_config_id) + old_config_handle = sz_config.import_config(old_config_definition) + sz_config.add_data_source(old_config_handle, data_source_code) + new_config_definition = sz_config.export_config(old_config_handle) + config_id = sz_configmanager.add_config(new_config_definition, CONFIG_COMMENT) + + # Set default config id. + + sz_configmanager.set_default_config_id(config_id) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/set_default_config_id.txt b/examples/szconfigmanager/set_default_config_id.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szconfigmanager/set_default_config_id.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szconfigmanager/szconfigmanager_constructor.py b/examples/szconfigmanager/szconfigmanager_constructor.py new file mode 100755 index 0000000..8f892f4 --- /dev/null +++ b/examples/szconfigmanager/szconfigmanager_constructor.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_configmanager = sz_abstract_factory.create_configmanager() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szconfigmanager/szconfigmanager_initialize_and_destroy.py b/examples/szconfigmanager/szconfigmanager_initialize_and_destroy.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szdiagnostic/__init__.py b/examples/szdiagnostic/__init__.py new file mode 100644 index 0000000..7a2d879 --- /dev/null +++ b/examples/szdiagnostic/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_diagnostic, + sz_abstract_factory, + sz_diagnostic, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_diagnostic", + "sz_abstract_factory", + "sz_diagnostic", +] diff --git a/examples/szdiagnostic/a_header_szdiagnostic.py b/examples/szdiagnostic/a_header_szdiagnostic.py new file mode 100755 index 0000000..2b33ce8 --- /dev/null +++ b/examples/szdiagnostic/a_header_szdiagnostic.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- szdiagnostic ----------------------------------------------------\n") diff --git a/examples/szdiagnostic/check_datastore_performance.py b/examples/szdiagnostic/check_datastore_performance.py new file mode 100755 index 0000000..4b915c0 --- /dev/null +++ b/examples/szdiagnostic/check_datastore_performance.py @@ -0,0 +1,10 @@ +from senzing import SzError + +from . import sz_diagnostic + +try: + SECONDS_TO_RUN = 3 + result = sz_diagnostic.check_datastore_performance(SECONDS_TO_RUN) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szdiagnostic/check_datastore_performance.txt b/examples/szdiagnostic/check_datastore_performance.txt new file mode 100644 index 0000000..1bfcaf4 --- /dev/null +++ b/examples/szdiagnostic/check_datastore_performance.txt @@ -0,0 +1,6 @@ +// Output has been formatted for easier reading. + +{ + "numRecordsInserted": 0, + "insertTime": 0 +} \ No newline at end of file diff --git a/examples/szdiagnostic/get_datastore_info.py b/examples/szdiagnostic/get_datastore_info.py new file mode 100755 index 0000000..e458438 --- /dev/null +++ b/examples/szdiagnostic/get_datastore_info.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_diagnostic + +try: + result = sz_diagnostic.get_datastore_info() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szdiagnostic/get_datastore_info.txt b/examples/szdiagnostic/get_datastore_info.txt new file mode 100644 index 0000000..912a64e --- /dev/null +++ b/examples/szdiagnostic/get_datastore_info.txt @@ -0,0 +1,11 @@ +// Output has been formatted for easier reading. + +{ + "dataStores": [ + { + "id": "CORE", + "type": "sqlite3", + "location": "/tmp/sqlite/G2C.db" + } + ] +} \ No newline at end of file diff --git a/examples/szdiagnostic/get_feature.py b/examples/szdiagnostic/get_feature.py new file mode 100755 index 0000000..74b13ec --- /dev/null +++ b/examples/szdiagnostic/get_feature.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_diagnostic + +try: + result = sz_diagnostic.get_feature(1) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szdiagnostic/get_feature.txt b/examples/szdiagnostic/get_feature.txt new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/examples/szdiagnostic/get_feature.txt @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/examples/szdiagnostic/purge_repository.py b/examples/szdiagnostic/purge_repository.py new file mode 100755 index 0000000..679b924 --- /dev/null +++ b/examples/szdiagnostic/purge_repository.py @@ -0,0 +1,14 @@ +from senzing import SzError + +from . import get_sz_diagnostic + +try: + sz_diagnostic = get_sz_diagnostic() + # WARNING + # WARNING - This will remove all loaded and entity resolved data from the Senzing repository, use with caution! + # WARNING - Uncomment the purge_repository() call below to complete a purge + # WARNING + + # sz_diagnostic.purge_repository() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szdiagnostic/purge_repository.txt b/examples/szdiagnostic/purge_repository.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szdiagnostic/purge_repository.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szdiagnostic/szdiagnostic_constructor.py b/examples/szdiagnostic/szdiagnostic_constructor.py new file mode 100755 index 0000000..c386ff1 --- /dev/null +++ b/examples/szdiagnostic/szdiagnostic_constructor.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_diagnostic = sz_abstract_factory.create_diagnostic() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szdiagnostic/szdiagnostic_initialize_and_destroy.py b/examples/szdiagnostic/szdiagnostic_initialize_and_destroy.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szdiagnostic/szdiagnostic_initialize_with_config_id.py b/examples/szdiagnostic/szdiagnostic_initialize_with_config_id.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szdiagnostic/szdiagnostic_reinitialize.py b/examples/szdiagnostic/szdiagnostic_reinitialize.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/__init__.py b/examples/szengine/__init__.py new file mode 100644 index 0000000..faf47d9 --- /dev/null +++ b/examples/szengine/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_engine, + sz_abstract_factory, + sz_engine, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_engine", + "sz_abstract_factory", + "sz_engine", +] diff --git a/examples/szengine/a_header_szengine.py b/examples/szengine/a_header_szengine.py new file mode 100755 index 0000000..588aae5 --- /dev/null +++ b/examples/szengine/a_header_szengine.py @@ -0,0 +1,57 @@ +""" +Simply a header used in development. +""" + +from typing import List, Tuple + +from senzing import SZ_WITHOUT_INFO, SzAbstractFactory +from senzing_truthset import ( + TRUTHSET_CUSTOMER_RECORDS, + TRUTHSET_REFERENCE_RECORDS, + TRUTHSET_WATCHLIST_RECORDS, +) + +from . import sz_abstract_factory + +DATA_SOURCES = { + "CUSTOMERS": TRUTHSET_CUSTOMER_RECORDS, + "REFERENCE": TRUTHSET_REFERENCE_RECORDS, + "WATCHLIST": TRUTHSET_WATCHLIST_RECORDS, +} + + +TEST_RECORDS: List[Tuple[str, str]] = [ + ("CUSTOMERS", "1001"), + ("CUSTOMERS", "1002"), + ("CUSTOMERS", "1003"), + ("CUSTOMERS", "1009"), +] + +# ----------------------------------------------------------------------------- +# Internal functions +# ----------------------------------------------------------------------------- + + +def add_records(sz_abstract_factory_local: SzAbstractFactory, record_id_list: List[Tuple[str, str]]) -> None: + """Add all of the records in the list.""" + sz_engine_local = sz_abstract_factory_local.create_engine() + flags = SZ_WITHOUT_INFO + for record_identification in record_id_list: + datasource = record_identification[0] + record_id = record_identification[1] + record = DATA_SOURCES.get(datasource, {}).get(record_id, {}) + sz_engine_local.add_record( + record.get("DataSource", ""), + record.get("Id", ""), + record.get("Json", ""), + flags, + ) + + +# ----------------------------------------------------------------------------- +# Main +# ----------------------------------------------------------------------------- + +print("\n---- szengine --------------------------------------------------------\n") + +add_records(sz_abstract_factory, TEST_RECORDS) diff --git a/examples/szengine/add_record.py b/examples/szengine/add_record.py new file mode 100755 index 0000000..96c6490 --- /dev/null +++ b/examples/szengine/add_record.py @@ -0,0 +1,30 @@ +import json + +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "TEST" + flags = SzEngineFlags.SZ_WITH_INFO + record_definition = json.dumps( + { + "RECORD_TYPE": "PERSON", + "PRIMARY_NAME_LAST": "Smith", + "PRIMARY_NAME_FIRST": "Robert", + "DATE_OF_BIRTH": "12/11/1978", + "ADDR_TYPE": "MAILING", + "ADDR_LINE1": "123 Main Street, Las Vegas NV 89132", + "PHONE_TYPE": "HOME", + "PHONE_NUMBER": "702-919-1300", + "EMAIL_ADDRESS": "bsmith@work.com", + "DATE": "1/2/18", + "STATUS": "Active", + "AMOUNT": "100", + } + ) + RECORD_ID = "1" + result = sz_engine.add_record(DATA_SOURCE_CODE, RECORD_ID, record_definition, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/add_record.txt b/examples/szengine/add_record.txt new file mode 100644 index 0000000..178edc3 --- /dev/null +++ b/examples/szengine/add_record.txt @@ -0,0 +1,17 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "TEST", + "RECORD_ID": "1", + "AFFECTED_ENTITIES": [ + { + "ENTITY_ID": 1 + }, + { + "ENTITY_ID": 35 + } + ], + "INTERESTING_ENTITIES": { + "ENTITIES": [] + } +} \ No newline at end of file diff --git a/examples/szengine/count_redo_records.py b/examples/szengine/count_redo_records.py new file mode 100755 index 0000000..6c19c53 --- /dev/null +++ b/examples/szengine/count_redo_records.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_engine + +try: + result = sz_engine.count_redo_records() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/count_redo_records.txt b/examples/szengine/count_redo_records.txt new file mode 100644 index 0000000..d8263ee --- /dev/null +++ b/examples/szengine/count_redo_records.txt @@ -0,0 +1 @@ +2 \ No newline at end of file diff --git a/examples/szengine/delete_record.py b/examples/szengine/delete_record.py new file mode 100755 index 0000000..c0e429c --- /dev/null +++ b/examples/szengine/delete_record.py @@ -0,0 +1,12 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "TEST" + flags = SzEngineFlags.SZ_WITH_INFO + RECORD_ID = "1" + result = sz_engine.delete_record(DATA_SOURCE_CODE, RECORD_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/delete_record.txt b/examples/szengine/delete_record.txt new file mode 100644 index 0000000..76ae94a --- /dev/null +++ b/examples/szengine/delete_record.txt @@ -0,0 +1,14 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "TEST", + "RECORD_ID": "1", + "AFFECTED_ENTITIES": [ + { + "ENTITY_ID": 35 + } + ], + "INTERESTING_ENTITIES": { + "ENTITIES": [] + } +} \ No newline at end of file diff --git a/examples/szengine/export_csv_fetch_close.py b/examples/szengine/export_csv_fetch_close.py new file mode 100755 index 0000000..6ecbd40 --- /dev/null +++ b/examples/szengine/export_csv_fetch_close.py @@ -0,0 +1,18 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + CSV_COLUMN_LIST = ( + "RESOLVED_ENTITY_ID,RELATED_ENTITY_ID,RESOLVED_ENTITY_NAME,MATCH_LEVEL,MATCH_KEY,DATA_SOURCE,RECORD_ID" + ) + flags = SzEngineFlags.SZ_EXPORT_DEFAULT_FLAGS + export_handle = sz_engine.export_csv_entity_report(CSV_COLUMN_LIST, flags) + while True: + fragment = sz_engine.fetch_next(export_handle) + if not fragment: + break + print(fragment, end="") + sz_engine.close_export(export_handle) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/export_csv_fetch_close.txt b/examples/szengine/export_csv_fetch_close.txt new file mode 100644 index 0000000..81b115c --- /dev/null +++ b/examples/szengine/export_csv_fetch_close.txt @@ -0,0 +1,6 @@ +RESOLVED_ENTITY_ID,RESOLVED_ENTITY_NAME,RELATED_ENTITY_ID,MATCH_LEVEL,MATCH_KEY,DATA_SOURCE,RECORD_ID +1,"",0,0,"","TEST","2" +35,"Robert Smith",0,0,"","CUSTOMERS","1001" +35,"Robert Smith",0,1,"+NAME+DOB+PHONE","CUSTOMERS","1002" +35,"Robert Smith",0,1,"+NAME+DOB+EMAIL","CUSTOMERS","1003" +38,"Edward Kusha",0,0,"","CUSTOMERS","1009" diff --git a/examples/szengine/export_json_fetch_close.py b/examples/szengine/export_json_fetch_close.py new file mode 100755 index 0000000..f092046 --- /dev/null +++ b/examples/szengine/export_json_fetch_close.py @@ -0,0 +1,15 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + flags = SzEngineFlags.SZ_EXPORT_DEFAULT_FLAGS + export_handle = sz_engine.export_json_entity_report(flags) + while True: + fragment = sz_engine.fetch_next(export_handle) + if not fragment: + break + print(fragment, end="") + sz_engine.close_export(export_handle) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/export_json_fetch_close.txt b/examples/szengine/export_json_fetch_close.txt new file mode 100644 index 0000000..5782edf --- /dev/null +++ b/examples/szengine/export_json_fetch_close.txt @@ -0,0 +1,3 @@ +{"RESOLVED_ENTITY":{"ENTITY_ID":1,"ENTITY_NAME":"","FEATURES":{},"RECORD_SUMMARY":[{"DATA_SOURCE":"TEST","RECORD_COUNT":1}],"RECORDS":[{"DATA_SOURCE":"TEST","RECORD_ID":"2","INTERNAL_ID":1,"MATCH_KEY":"","MATCH_LEVEL_CODE":"","ERRULE_CODE":"","FIRST_SEEN_DT":"2024-10-25T17:38:57Z","LAST_SEEN_DT":"2024-10-25T17:38:57Z"}]},"RELATED_ENTITIES":[]} +{"RESOLVED_ENTITY":{"ENTITY_ID":35,"ENTITY_NAME":"Robert Smith","FEATURES":{"ADDRESS":[{"FEAT_DESC":"1515 Adela Lane Las Vegas NV 89111","LIB_FEAT_ID":22,"USAGE_TYPE":"HOME","FEAT_DESC_VALUES":[{"FEAT_DESC":"1515 Adela Lane Las Vegas NV 89111","LIB_FEAT_ID":22}]},{"FEAT_DESC":"123 Main Street, Las Vegas NV 89132","LIB_FEAT_ID":3,"USAGE_TYPE":"MAILING","FEAT_DESC_VALUES":[{"FEAT_DESC":"123 Main Street, Las Vegas NV 89132","LIB_FEAT_ID":3}]}],"DOB":[{"FEAT_DESC":"12/11/1978","LIB_FEAT_ID":2,"FEAT_DESC_VALUES":[{"FEAT_DESC":"12/11/1978","LIB_FEAT_ID":2},{"FEAT_DESC":"11/12/1978","LIB_FEAT_ID":21}]}],"EMAIL":[{"FEAT_DESC":"bsmith@work.com","LIB_FEAT_ID":5,"FEAT_DESC_VALUES":[{"FEAT_DESC":"bsmith@work.com","LIB_FEAT_ID":5}]}],"NAME":[{"FEAT_DESC":"Robert Smith","LIB_FEAT_ID":1,"USAGE_TYPE":"PRIMARY","FEAT_DESC_VALUES":[{"FEAT_DESC":"Robert Smith","LIB_FEAT_ID":1},{"FEAT_DESC":"Bob J Smith","LIB_FEAT_ID":38},{"FEAT_DESC":"Bob Smith","LIB_FEAT_ID":20}]}],"PHONE":[{"FEAT_DESC":"702-919-1300","LIB_FEAT_ID":4,"USAGE_TYPE":"HOME","FEAT_DESC_VALUES":[{"FEAT_DESC":"702-919-1300","LIB_FEAT_ID":4}]},{"FEAT_DESC":"702-919-1300","LIB_FEAT_ID":4,"USAGE_TYPE":"MOBILE","FEAT_DESC_VALUES":[{"FEAT_DESC":"702-919-1300","LIB_FEAT_ID":4}]}],"RECORD_TYPE":[{"FEAT_DESC":"PERSON","LIB_FEAT_ID":10,"FEAT_DESC_VALUES":[{"FEAT_DESC":"PERSON","LIB_FEAT_ID":10}]}]},"RECORD_SUMMARY":[{"DATA_SOURCE":"CUSTOMERS","RECORD_COUNT":3}],"RECORDS":[{"DATA_SOURCE":"CUSTOMERS","RECORD_ID":"1001","INTERNAL_ID":35,"MATCH_KEY":"","MATCH_LEVEL_CODE":"","ERRULE_CODE":"","FIRST_SEEN_DT":"2024-10-25T17:39:00Z","LAST_SEEN_DT":"2024-10-25T17:39:00Z"},{"DATA_SOURCE":"CUSTOMERS","RECORD_ID":"1002","INTERNAL_ID":36,"MATCH_KEY":"+NAME+DOB+PHONE","MATCH_LEVEL_CODE":"RESOLVED","ERRULE_CODE":"CNAME_CFF_CEXCL","FIRST_SEEN_DT":"2024-10-25T17:39:00Z","LAST_SEEN_DT":"2024-10-25T17:39:00Z"},{"DATA_SOURCE":"CUSTOMERS","RECORD_ID":"1003","INTERNAL_ID":37,"MATCH_KEY":"+NAME+DOB+EMAIL","MATCH_LEVEL_CODE":"RESOLVED","ERRULE_CODE":"SF1_PNAME_CSTAB","FIRST_SEEN_DT":"2024-10-25T17:39:00Z","LAST_SEEN_DT":"2024-10-25T17:39:00Z"}]},"RELATED_ENTITIES":[]} +{"RESOLVED_ENTITY":{"ENTITY_ID":38,"ENTITY_NAME":"Edward Kusha","FEATURES":{"ADDRESS":[{"FEAT_DESC":"1304 Poppy Hills Dr Blacklick OH 43004","LIB_FEAT_ID":46,"USAGE_TYPE":"HOME","FEAT_DESC_VALUES":[{"FEAT_DESC":"1304 Poppy Hills Dr Blacklick OH 43004","LIB_FEAT_ID":46}]}],"DOB":[{"FEAT_DESC":"3/1/1970","LIB_FEAT_ID":45,"FEAT_DESC_VALUES":[{"FEAT_DESC":"3/1/1970","LIB_FEAT_ID":45}]}],"EMAIL":[{"FEAT_DESC":"Kusha123@hmail.com","LIB_FEAT_ID":48,"FEAT_DESC_VALUES":[{"FEAT_DESC":"Kusha123@hmail.com","LIB_FEAT_ID":48}]}],"NAME":[{"FEAT_DESC":"Edward Kusha","LIB_FEAT_ID":44,"USAGE_TYPE":"PRIMARY","FEAT_DESC_VALUES":[{"FEAT_DESC":"Edward Kusha","LIB_FEAT_ID":44}]}],"RECORD_TYPE":[{"FEAT_DESC":"PERSON","LIB_FEAT_ID":10,"FEAT_DESC_VALUES":[{"FEAT_DESC":"PERSON","LIB_FEAT_ID":10}]}],"SSN":[{"FEAT_DESC":"294-66-9999","LIB_FEAT_ID":47,"FEAT_DESC_VALUES":[{"FEAT_DESC":"294-66-9999","LIB_FEAT_ID":47}]}]},"RECORD_SUMMARY":[{"DATA_SOURCE":"CUSTOMERS","RECORD_COUNT":1}],"RECORDS":[{"DATA_SOURCE":"CUSTOMERS","RECORD_ID":"1009","INTERNAL_ID":38,"MATCH_KEY":"","MATCH_LEVEL_CODE":"","ERRULE_CODE":"","FIRST_SEEN_DT":"2024-10-25T17:39:00Z","LAST_SEEN_DT":"2024-10-25T17:39:00Z"}]},"RELATED_ENTITIES":[]} diff --git a/examples/szengine/find_interesting_entities_by_entity_id.py b/examples/szengine/find_interesting_entities_by_entity_id.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/find_interesting_entities_by_entity_id.txt b/examples/szengine/find_interesting_entities_by_entity_id.txt new file mode 100644 index 0000000..e69de29 diff --git a/examples/szengine/find_interesting_entities_by_record_id.py b/examples/szengine/find_interesting_entities_by_record_id.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/find_interesting_entities_by_record_id.txt b/examples/szengine/find_interesting_entities_by_record_id.txt new file mode 100644 index 0000000..e69de29 diff --git a/examples/szengine/find_network_by_entity_id.py b/examples/szengine/find_network_by_entity_id.py new file mode 100755 index 0000000..8d9227c --- /dev/null +++ b/examples/szengine/find_network_by_entity_id.py @@ -0,0 +1,14 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + BUILD_OUT_DEGREES = 1 + entity_list = [1, 4] + flags = SzEngineFlags.SZ_FIND_NETWORK_DEFAULT_FLAGS + MAX_DEGREES = 2 + MAX_ENTITIES = 10 + result = sz_engine.find_network_by_entity_id(entity_list, MAX_DEGREES, BUILD_OUT_DEGREES, MAX_ENTITIES, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/find_network_by_entity_id.txt b/examples/szengine/find_network_by_entity_id.txt new file mode 100644 index 0000000..81a05ab --- /dev/null +++ b/examples/szengine/find_network_by_entity_id.txt @@ -0,0 +1,38 @@ +// Output has been formatted for easier reading. + +{ + "ENTITY_PATHS": [ + { + "START_ENTITY_ID": 1, + "END_ENTITY_ID": 35, + "ENTITIES": [] + } + ], + "ENTITY_NETWORK_LINKS": [], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 1, + "ENTITY_NAME": "", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "TEST", + "RECORD_COUNT": 1 + } + ] + } + }, + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ] + } + } + ] +} \ No newline at end of file diff --git a/examples/szengine/find_network_by_record_id.py b/examples/szengine/find_network_by_record_id.py new file mode 100755 index 0000000..24621a5 --- /dev/null +++ b/examples/szengine/find_network_by_record_id.py @@ -0,0 +1,14 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + BUILD_OUT_DEGREES = 1 + flags = SzEngineFlags.SZ_FIND_NETWORK_DEFAULT_FLAGS + MAX_DEGREES = 2 + MAX_ENTITIES = 10 + record_list = [("CUSTOMERS", "1001"), ("CUSTOMERS", "1009")] + result = sz_engine.find_network_by_record_id(record_list, MAX_DEGREES, BUILD_OUT_DEGREES, MAX_ENTITIES, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/find_network_by_record_id.txt b/examples/szengine/find_network_by_record_id.txt new file mode 100644 index 0000000..45ed88a --- /dev/null +++ b/examples/szengine/find_network_by_record_id.txt @@ -0,0 +1,38 @@ +// Output has been formatted for easier reading. + +{ + "ENTITY_PATHS": [ + { + "START_ENTITY_ID": 35, + "END_ENTITY_ID": 38, + "ENTITIES": [] + } + ], + "ENTITY_NETWORK_LINKS": [], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ] + } + }, + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 38, + "ENTITY_NAME": "Edward Kusha", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 1 + } + ] + } + } + ] +} \ No newline at end of file diff --git a/examples/szengine/find_path_by_entity_id.py b/examples/szengine/find_path_by_entity_id.py new file mode 100755 index 0000000..0167c33 --- /dev/null +++ b/examples/szengine/find_path_by_entity_id.py @@ -0,0 +1,24 @@ +from typing import List + +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + avoid_entity_ids: List[int] = [] + END_ENTITY_ID = 4 + flags = SzEngineFlags.SZ_FIND_PATH_DEFAULT_FLAGS + MAX_DEGREES = 2 + required_data_sources: List[str] = [] + START_ENTITY_ID = 1 + result = sz_engine.find_path_by_entity_id( + START_ENTITY_ID, + END_ENTITY_ID, + MAX_DEGREES, + avoid_entity_ids, + required_data_sources, + flags, + ) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/find_path_by_entity_id.txt b/examples/szengine/find_path_by_entity_id.txt new file mode 100644 index 0000000..49b2ccd --- /dev/null +++ b/examples/szengine/find_path_by_entity_id.txt @@ -0,0 +1,38 @@ +// Output has been formatted for easier reading. + +{ + "ENTITY_PATHS": [ + { + "START_ENTITY_ID": 1, + "END_ENTITY_ID": 35, + "ENTITIES": [] + } + ], + "ENTITY_PATH_LINKS": [], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 1, + "ENTITY_NAME": "", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "TEST", + "RECORD_COUNT": 1 + } + ] + } + }, + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ] + } + } + ] +} \ No newline at end of file diff --git a/examples/szengine/find_path_by_record_id.py b/examples/szengine/find_path_by_record_id.py new file mode 100755 index 0000000..4b4b958 --- /dev/null +++ b/examples/szengine/find_path_by_record_id.py @@ -0,0 +1,28 @@ +from typing import List, Tuple + +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + avoid_record_keys: List[Tuple[str, str]] = [] + END_DATA_SOURCE_CODE = "CUSTOMERS" + END_RECORD_ID = "1009" + flags = SzEngineFlags.SZ_FIND_PATH_DEFAULT_FLAGS + MAX_DEGREES = 2 + required_data_sources: List[str] = [] + START_DATA_SOURCE_CODE = "CUSTOMERS" + START_RECORD_ID = "1001" + result = sz_engine.find_path_by_record_id( + START_DATA_SOURCE_CODE, + START_RECORD_ID, + END_DATA_SOURCE_CODE, + END_RECORD_ID, + MAX_DEGREES, + avoid_record_keys, + required_data_sources, + flags, + ) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/find_path_by_record_id.txt b/examples/szengine/find_path_by_record_id.txt new file mode 100644 index 0000000..dce02bf --- /dev/null +++ b/examples/szengine/find_path_by_record_id.txt @@ -0,0 +1,38 @@ +// Output has been formatted for easier reading. + +{ + "ENTITY_PATHS": [ + { + "START_ENTITY_ID": 35, + "END_ENTITY_ID": 38, + "ENTITIES": [] + } + ], + "ENTITY_PATH_LINKS": [], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ] + } + }, + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 38, + "ENTITY_NAME": "Edward Kusha", + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 1 + } + ] + } + } + ] +} \ No newline at end of file diff --git a/examples/szengine/get_active_config_id.py b/examples/szengine/get_active_config_id.py new file mode 100755 index 0000000..f321bc5 --- /dev/null +++ b/examples/szengine/get_active_config_id.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_engine + +try: + result = sz_engine.get_active_config_id() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_active_config_id.txt b/examples/szengine/get_active_config_id.txt new file mode 100644 index 0000000..6d8920b --- /dev/null +++ b/examples/szengine/get_active_config_id.txt @@ -0,0 +1 @@ +4030462317 \ No newline at end of file diff --git a/examples/szengine/get_entity_by_entity_id.py b/examples/szengine/get_entity_by_entity_id.py new file mode 100755 index 0000000..5cd96f9 --- /dev/null +++ b/examples/szengine/get_entity_by_entity_id.py @@ -0,0 +1,11 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + ENTITY_ID = 1 + flags = SzEngineFlags.SZ_ENTITY_DEFAULT_FLAGS + result = sz_engine.get_entity_by_entity_id(ENTITY_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_entity_by_entity_id.txt b/examples/szengine/get_entity_by_entity_id.txt new file mode 100644 index 0000000..1eeb53e --- /dev/null +++ b/examples/szengine/get_entity_by_entity_id.txt @@ -0,0 +1,28 @@ +// Output has been formatted for easier reading. + +{ + "RESOLVED_ENTITY": { + "ENTITY_ID": 1, + "ENTITY_NAME": "", + "FEATURES": {}, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "TEST", + "RECORD_COUNT": 1 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "TEST", + "RECORD_ID": "2", + "INTERNAL_ID": 1, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "YYYY-MM-DDThh:mm:ssZ", + "LAST_SEEN_DT": "YYYY-MM-DDThh:mm:ssZ" + } + ] + }, + "RELATED_ENTITIES": [] +} \ No newline at end of file diff --git a/examples/szengine/get_entity_by_record_id.py b/examples/szengine/get_entity_by_record_id.py new file mode 100755 index 0000000..c71c5fc --- /dev/null +++ b/examples/szengine/get_entity_by_record_id.py @@ -0,0 +1,12 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "CUSTOMERS" + flags = SzEngineFlags.SZ_ENTITY_DEFAULT_FLAGS + RECORD_ID = "1001" + result = sz_engine.get_entity_by_record_id(DATA_SOURCE_CODE, RECORD_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_entity_by_record_id.txt b/examples/szengine/get_entity_by_record_id.txt new file mode 100644 index 0000000..16ddc53 --- /dev/null +++ b/examples/szengine/get_entity_by_record_id.txt @@ -0,0 +1,158 @@ +// Output has been formatted for easier reading. + +{ + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22 + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3 + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2 + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21 + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5 + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1 + }, + { + "FEAT_DESC": "Bob J Smith", + "LIB_FEAT_ID": 38 + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20 + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10 + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "INTERNAL_ID": 35, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002", + "INTERNAL_ID": 36, + "MATCH_KEY": "+NAME+DOB+PHONE", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "CNAME_CFF_CEXCL", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1003", + "INTERNAL_ID": 37, + "MATCH_KEY": "+NAME+DOB+EMAIL", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "SF1_PNAME_CSTAB", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + }, + "RELATED_ENTITIES": [] +} \ No newline at end of file diff --git a/examples/szengine/get_record.py b/examples/szengine/get_record.py new file mode 100755 index 0000000..48378a9 --- /dev/null +++ b/examples/szengine/get_record.py @@ -0,0 +1,12 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "CUSTOMERS" + flags = SzEngineFlags.SZ_RECORD_DEFAULT_FLAGS + RECORD_ID = "1001" + result = sz_engine.get_record(DATA_SOURCE_CODE, RECORD_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_record.txt b/examples/szengine/get_record.txt new file mode 100644 index 0000000..9c97905 --- /dev/null +++ b/examples/szengine/get_record.txt @@ -0,0 +1,22 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "JSON_DATA": { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "RECORD_TYPE": "PERSON", + "PRIMARY_NAME_LAST": "Smith", + "PRIMARY_NAME_FIRST": "Robert", + "DATE_OF_BIRTH": "12/11/1978", + "ADDR_TYPE": "MAILING", + "ADDR_LINE1": "123 Main Street, Las Vegas NV 89132", + "PHONE_TYPE": "HOME", + "PHONE_NUMBER": "702-919-1300", + "EMAIL_ADDRESS": "bsmith@work.com", + "DATE": "1/2/18", + "STATUS": "Active", + "AMOUNT": "100" + } +} \ No newline at end of file diff --git a/examples/szengine/get_redo_record.py b/examples/szengine/get_redo_record.py new file mode 100755 index 0000000..e8b03a4 --- /dev/null +++ b/examples/szengine/get_redo_record.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_engine + +try: + result = sz_engine.get_redo_record() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_redo_record.txt b/examples/szengine/get_redo_record.txt new file mode 100644 index 0000000..4044166 --- /dev/null +++ b/examples/szengine/get_redo_record.txt @@ -0,0 +1,8 @@ +// Output has been formatted for easier reading. + +{ + "REASON": "deferred delete", + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "DSRC_ACTION": "X" +} \ No newline at end of file diff --git a/examples/szengine/get_stats.py b/examples/szengine/get_stats.py new file mode 100755 index 0000000..e355e22 --- /dev/null +++ b/examples/szengine/get_stats.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_engine + +try: + result = sz_engine.get_stats() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_stats.txt b/examples/szengine/get_stats.txt new file mode 100644 index 0000000..8954ec4 --- /dev/null +++ b/examples/szengine/get_stats.txt @@ -0,0 +1,346 @@ +// Output has been formatted for easier reading. + +{ + "workload": { + "apiVersion": "4.0.0.24289", + "loadedRecords": 6, + "addedRecords": 20, + "bulkAddedRecords": 0, + "optimizedOut": 3, + "optimizedOutSkipped": 6, + "newObsEnt": 18, + "obsEntHashSame": 4, + "obsEntHashDiff": 1, + "partiallyResolved": 0, + "deletedRecords": 15, + "changeDeletes": 4, + "reevaluations": 4, + "repairedEntities": 6, + "duration": 96, + "retries": 0, + "candidates": 11, + "actualAmbiguousTest": 0, + "cachedAmbiguousTest": 0, + "libFeatCacheHit": 706, + "libFeatCacheMiss": 589, + "resFeatStatCacheHit": 6211, + "resFeatStatCacheMiss": 1052, + "libFeatInsert": 28, + "resFeatStatInsert": 28, + "resFeatStatUpdateAttempt": 522, + "resFeatStatUpdateFail": 0, + "unresolveTest": 4, + "abortedUnresolve": 0, + "lockWaits": { + "maxRefreshLocksMS": 0, + "totalRefreshLocksMS": 0, + "countRefreshLocks": 0 + }, + "unresolveTriggers": { + "normalResolve": 0, + "update": 0, + "relLink": 0, + "extensiveResolve": 4, + "ambiguousNoResolve": 0, + "ambiguousMultiResolve": 0 + }, + "reresolveTriggers": { + "abortRetry": 0, + "unresolveMovement": 0, + "multipleResolvableCandidates": 0, + "resolveNewFeatures": 7, + "newFeatureFTypes": [ + { + "ADDRESS": 5 + }, + { + "ADDR_KEY": 5 + }, + { + "DOB": 5 + }, + { + "NAME": 7 + }, + { + "NAMEADDR_KEY": 5 + }, + { + "NAMEDATE_KEY": 7 + }, + { + "NAMEPHONE_KEY": 5 + }, + { + "NAMEREGION_KEY": 5 + }, + { + "NAME_KEY": 7 + }, + { + "PHONE": 5 + } + ] + }, + "reresolveSkipped": 1, + "filteredObsFeat": 0, + "expressedFeatureCalls": [ + { + "EFCALL_ID": 1, + "EFUNC_CODE": "PHONE_HASHER", + "numCalls": 20 + }, + { + "EFCALL_ID": 7, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 45 + }, + { + "EFCALL_ID": 9, + "EFUNC_CODE": "ADDR_HASHER", + "numCalls": 21 + }, + { + "EFCALL_ID": 10, + "EFUNC_CODE": "EXPRESS_BOM", + "numCalls": 1 + }, + { + "EFCALL_ID": 16, + "EFUNC_CODE": "EXPRESS_ID", + "numCalls": 1 + }, + { + "EFCALL_ID": 34, + "EFUNC_CODE": "FEAT_BUILDER", + "numCalls": 19 + }, + { + "EFCALL_ID": 92, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 21 + }, + { + "EFCALL_ID": 94, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 45 + }, + { + "EFCALL_ID": 95, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 2 + }, + { + "EFCALL_ID": 96, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 45 + }, + { + "EFCALL_ID": 97, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 45 + }, + { + "EFCALL_ID": 98, + "EFUNC_CODE": "NAME_HASHER", + "numCalls": 45 + } + ], + "expressedFeaturesCreated": [ + { + "ADDR_KEY": 42 + }, + { + "EMAIL_KEY": 19 + }, + { + "ID_KEY": 1 + }, + { + "NAMEADDR_KEY": 54 + }, + { + "NAMEDATE_KEY": 99 + }, + { + "NAMEID_KEY": 2 + }, + { + "NAMEPHONE_KEY": 25 + }, + { + "NAMEREGION_KEY": 54 + }, + { + "NAME_KEY": 35 + }, + { + "PHONE_KEY": 20 + }, + { + "SEARCH_KEY": 1 + } + ], + "scoredPairs": [ + { + "ADDRESS": 8 + }, + { + "DOB": 18 + }, + { + "EMAIL": 5 + }, + { + "NAME": 29 + }, + { + "PHONE": 9 + }, + { + "RECORD_TYPE": 10 + } + ], + "cacheHit": [ + { + "DOB": 1 + }, + { + "NAME": 3 + } + ], + "cacheMiss": [ + { + "ADDRESS": 8 + }, + { + "DOB": 17 + }, + { + "EMAIL": 5 + }, + { + "NAME": 26 + }, + { + "PHONE": 9 + } + ], + "redoTriggers": [ + { + "DEFERRED_DELETE": 6 + } + ], + "latchContention": [], + "highContentionFeat": [], + "highContentionResEnt": [], + "genericDetect": [], + "candidateBuilders": [ + { + "ADDR_KEY": 34 + }, + { + "DOB": 36 + }, + { + "EMAIL_KEY": 32 + }, + { + "ID_KEY": 1 + }, + { + "NAMEADDR_KEY": 34 + }, + { + "NAMEDATE_KEY": 36 + }, + { + "NAMEID_KEY": 1 + }, + { + "NAMEPHONE_KEY": 33 + }, + { + "NAMEREGION_KEY": 34 + }, + { + "NAME_KEY": 37 + }, + { + "PHONE_KEY": 33 + }, + { + "SEARCH_KEY": 1 + }, + { + "SSN": 1 + } + ], + "suppressedCandidateBuilders": [], + "suppressedScoredFeatureType": [], + "suppressedCandidateBuildersForReresolve": [], + "suppressedScoredFeatureTypeForReresolve": [], + "suppressedDisclosedRelationshipDomainCount": 0, + "corruptEntityTestDiagnosis": { + "corruptionTypes": 0 + }, + "threadState": { + "active": 0, + "idle": 8, + "governorContention": 0, + "sqlExecuting": 0, + "loader": 0, + "resolver": 0, + "scoring": 0, + "dataLatchContention": 0, + "obsEntContention": 0, + "resEntContention": 0 + }, + "systemResources": { + "initResources": [ + { + "physicalCores": 16 + }, + { + "logicalCores": 16 + }, + { + "totalMemory": "62.6GB" + }, + { + "availableMemory": "52.7GB" + } + ], + "currResources": [ + { + "availableMemory": "48.5GB" + }, + { + "activeThreads": 0 + }, + { + "workerThreads": 8 + }, + { + "systemLoad": [ + { + "cpuUser": 5.160142 + }, + { + "cpuSystem": 3.932384 + }, + { + "cpuIdle": 90.800713 + }, + { + "cpuWait": 0.071174 + }, + { + "cpuSoftIrq": 0.035587 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/examples/szengine/get_virtual_entity_by_record_id.py b/examples/szengine/get_virtual_entity_by_record_id.py new file mode 100755 index 0000000..9b5a760 --- /dev/null +++ b/examples/szengine/get_virtual_entity_by_record_id.py @@ -0,0 +1,14 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + flags = SzEngineFlags.SZ_VIRTUAL_ENTITY_DEFAULT_FLAGS + record_list = [ + ("CUSTOMERS", "1001"), + ("CUSTOMERS", "1002"), + ] + result = sz_engine.get_virtual_entity_by_record_id(record_list, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/get_virtual_entity_by_record_id.txt b/examples/szengine/get_virtual_entity_by_record_id.txt new file mode 100644 index 0000000..809f032 --- /dev/null +++ b/examples/szengine/get_virtual_entity_by_record_id.txt @@ -0,0 +1,137 @@ +// Output has been formatted for easier reading. + +{ + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22 + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3 + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2 + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21 + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5 + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1 + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20 + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10 + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 2 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "INTERNAL_ID": 35, + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002", + "INTERNAL_ID": 36, + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + } +} \ No newline at end of file diff --git a/examples/szengine/how_entity_by_entity_id.py b/examples/szengine/how_entity_by_entity_id.py new file mode 100755 index 0000000..0fe2727 --- /dev/null +++ b/examples/szengine/how_entity_by_entity_id.py @@ -0,0 +1,11 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + ENTITY_ID = 1 + flags = SzEngineFlags.SZ_HOW_ENTITY_DEFAULT_FLAGS + result = sz_engine.how_entity_by_entity_id(ENTITY_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/how_entity_by_entity_id.txt b/examples/szengine/how_entity_by_entity_id.txt new file mode 100644 index 0000000..51035bf --- /dev/null +++ b/examples/szengine/how_entity_by_entity_id.txt @@ -0,0 +1,26 @@ +// Output has been formatted for easier reading. + +{ + "HOW_RESULTS": { + "RESOLUTION_STEPS": [], + "FINAL_STATE": { + "NEED_REEVALUATION": 0, + "VIRTUAL_ENTITIES": [ + { + "VIRTUAL_ENTITY_ID": "V1", + "MEMBER_RECORDS": [ + { + "INTERNAL_ID": 1, + "RECORDS": [ + { + "DATA_SOURCE": "TEST", + "RECORD_ID": "2" + } + ] + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/examples/szengine/preprocess_record.py b/examples/szengine/preprocess_record.py new file mode 100755 index 0000000..4bdb624 --- /dev/null +++ b/examples/szengine/preprocess_record.py @@ -0,0 +1,28 @@ +import json + +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + flags = SzEngineFlags.SZ_RECORD_DEFAULT_FLAGS + record_definition = json.dumps( + { + "RECORD_TYPE": "PERSON", + "PRIMARY_NAME_LAST": "Smith", + "PRIMARY_NAME_FIRST": "Robert", + "DATE_OF_BIRTH": "12/11/1978", + "ADDR_TYPE": "MAILING", + "ADDR_LINE1": "123 Main Street, Las Vegas NV 89132", + "PHONE_TYPE": "HOME", + "PHONE_NUMBER": "702-919-1300", + "EMAIL_ADDRESS": "bsmith@work.com", + "DATE": "1/2/18", + "STATUS": "Active", + "AMOUNT": "100", + } + ) + result = sz_engine.preprocess_record(record_definition, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/preprocess_record.txt b/examples/szengine/preprocess_record.txt new file mode 100644 index 0000000..0181b74 --- /dev/null +++ b/examples/szengine/preprocess_record.txt @@ -0,0 +1,18 @@ +// Output has been formatted for easier reading. + +{ + "JSON_DATA": { + "RECORD_TYPE": "PERSON", + "PRIMARY_NAME_LAST": "Smith", + "PRIMARY_NAME_FIRST": "Robert", + "DATE_OF_BIRTH": "12/11/1978", + "ADDR_TYPE": "MAILING", + "ADDR_LINE1": "123 Main Street, Las Vegas NV 89132", + "PHONE_TYPE": "HOME", + "PHONE_NUMBER": "702-919-1300", + "EMAIL_ADDRESS": "bsmith@work.com", + "DATE": "1/2/18", + "STATUS": "Active", + "AMOUNT": "100" + } +} \ No newline at end of file diff --git a/examples/szengine/prime_engine.py b/examples/szengine/prime_engine.py new file mode 100755 index 0000000..93fd950 --- /dev/null +++ b/examples/szengine/prime_engine.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_engine + +try: + sz_engine.prime_engine() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/prime_engine.txt b/examples/szengine/prime_engine.txt new file mode 100644 index 0000000..602ea98 --- /dev/null +++ b/examples/szengine/prime_engine.txt @@ -0,0 +1 @@ +// No output from this example. \ No newline at end of file diff --git a/examples/szengine/process.py b/examples/szengine/process.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/process_redo_record.py b/examples/szengine/process_redo_record.py new file mode 100755 index 0000000..5e0a143 --- /dev/null +++ b/examples/szengine/process_redo_record.py @@ -0,0 +1,14 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + flags = SzEngineFlags.SZ_WITH_INFO + while True: + redo_record = sz_engine.get_redo_record() + if not redo_record: + break + RESULT = sz_engine.process_redo_record(redo_record, flags) + print(RESULT) +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/process_redo_record.txt b/examples/szengine/process_redo_record.txt new file mode 100644 index 0000000..91a70cf --- /dev/null +++ b/examples/szengine/process_redo_record.txt @@ -0,0 +1,14 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "2207", + "AFFECTED_ENTITIES": [ + { + "ENTITY_ID": 305 + } + ], + "INTERESTING_ENTITIES": { + "ENTITIES": [] + } +} diff --git a/examples/szengine/reevaluate_entity.py b/examples/szengine/reevaluate_entity.py new file mode 100755 index 0000000..d2f6638 --- /dev/null +++ b/examples/szengine/reevaluate_entity.py @@ -0,0 +1,11 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + ENTITY_ID = 1 + flags = SzEngineFlags.SZ_WITH_INFO + result = sz_engine.reevaluate_entity(ENTITY_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/reevaluate_entity.txt b/examples/szengine/reevaluate_entity.txt new file mode 100644 index 0000000..b424013 --- /dev/null +++ b/examples/szengine/reevaluate_entity.txt @@ -0,0 +1,14 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "TEST", + "RECORD_ID": "2", + "AFFECTED_ENTITIES": [ + { + "ENTITY_ID": 1 + } + ], + "INTERESTING_ENTITIES": { + "ENTITIES": [] + } +} \ No newline at end of file diff --git a/examples/szengine/reevaluate_record.py b/examples/szengine/reevaluate_record.py new file mode 100755 index 0000000..8a0cbee --- /dev/null +++ b/examples/szengine/reevaluate_record.py @@ -0,0 +1,12 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "CUSTOMERS" + flags = SzEngineFlags.SZ_WITH_INFO + RECORD_ID = "1001" + result = sz_engine.reevaluate_record(DATA_SOURCE_CODE, RECORD_ID, flags) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/reevaluate_record.txt b/examples/szengine/reevaluate_record.txt new file mode 100644 index 0000000..81640f2 --- /dev/null +++ b/examples/szengine/reevaluate_record.txt @@ -0,0 +1,14 @@ +// Output has been formatted for easier reading. + +{ + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "AFFECTED_ENTITIES": [ + { + "ENTITY_ID": 35 + } + ], + "INTERESTING_ENTITIES": { + "ENTITIES": [] + } +} \ No newline at end of file diff --git a/examples/szengine/search_by_attributes.py b/examples/szengine/search_by_attributes.py new file mode 100755 index 0000000..80cb9bd --- /dev/null +++ b/examples/szengine/search_by_attributes.py @@ -0,0 +1,14 @@ +import json + +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + attributes = json.dumps({"NAME_FULL": "BOB SMITH", "EMAIL_ADDRESS": "bsmith@work.com"}) + flags = SzEngineFlags.SZ_SEARCH_BY_ATTRIBUTES_DEFAULT_FLAGS + SEARCH_PROFILE = "" + result = sz_engine.search_by_attributes(attributes, flags, SEARCH_PROFILE) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/search_by_attributes.txt b/examples/szengine/search_by_attributes.txt new file mode 100644 index 0000000..5c7fdcd --- /dev/null +++ b/examples/szengine/search_by_attributes.txt @@ -0,0 +1,191 @@ +// Output has been formatted for easier reading. +{ + "RESOLVED_ENTITIES": [ + { + "MATCH_INFO": { + "MATCH_LEVEL_CODE": "RESOLVED", + "MATCH_KEY": "+NAME+EMAIL", + "ERRULE_CODE": "SF1_CNAME", + "FEATURE_SCORES": { + "EMAIL": [ + { + "INBOUND_FEAT_ID": 5, + "INBOUND_FEAT_DESC": "bsmith@work.com", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 5, + "CANDIDATE_FEAT_DESC": "bsmith@work.com", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "F1" + } + ], + "NAME": [ + { + "INBOUND_FEAT_ID": -2, + "INBOUND_FEAT_DESC": "BOB SMITH", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 38, + "CANDIDATE_FEAT_DESC": "Bob J Smith", + "CANDIDATE_FEAT_USAGE_TYPE": "PRIMARY", + "SCORE": 93, + "ADDITIONAL_SCORES": { + "GENERATION_MATCH": -1, + "GNR_FN": 93, + "GNR_GN": -1, + "GNR_ON": -1, + "GNR_SN": -1 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "NAME" + }, + { + "INBOUND_FEAT_ID": -2, + "INBOUND_FEAT_DESC": "BOB SMITH", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 1, + "CANDIDATE_FEAT_DESC": "Robert Smith", + "CANDIDATE_FEAT_USAGE_TYPE": "PRIMARY", + "SCORE": 97, + "ADDITIONAL_SCORES": { + "GENERATION_MATCH": -1, + "GNR_FN": 97, + "GNR_GN": -1, + "GNR_ON": -1, + "GNR_SN": -1 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "NAME" + } + ] + } + }, + "ENTITY": { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22 + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3 + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2 + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21 + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5 + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1 + }, + { + "FEAT_DESC": "Bob J Smith", + "LIB_FEAT_ID": 38 + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20 + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4 + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10 + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/examples/szengine/szengine_constructor.py b/examples/szengine/szengine_constructor.py new file mode 100755 index 0000000..18250cc --- /dev/null +++ b/examples/szengine/szengine_constructor.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_engine = sz_abstract_factory.create_engine() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/szengine_initialize_and_destroy.py b/examples/szengine/szengine_initialize_and_destroy.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/szengine_initialize_with_config_id.py b/examples/szengine/szengine_initialize_with_config_id.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/szengine_reinitialize.py b/examples/szengine/szengine_reinitialize.py new file mode 100755 index 0000000..e69de29 diff --git a/examples/szengine/why_entities.py b/examples/szengine/why_entities.py new file mode 100755 index 0000000..2b297c3 --- /dev/null +++ b/examples/szengine/why_entities.py @@ -0,0 +1,16 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + ENTITY_ID_1 = 1 + ENTITY_ID_2 = 4 + flags = SzEngineFlags.SZ_WHY_ENTITIES_DEFAULT_FLAGS + result = sz_engine.why_entities( + ENTITY_ID_1, + ENTITY_ID_2, + flags, + ) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/why_entities.txt b/examples/szengine/why_entities.txt new file mode 100644 index 0000000..6864235 --- /dev/null +++ b/examples/szengine/why_entities.txt @@ -0,0 +1,812 @@ +// Output has been formatted for easier reading. + +{ + "WHY_RESULTS": [ + { + "ENTITY_ID": 1, + "ENTITY_ID_2": 35, + "MATCH_INFO": { + "WHY_KEY": "", + "WHY_ERRULE_CODE": "", + "MATCH_LEVEL_CODE": "", + "CANDIDATE_KEYS": {}, + "DISCLOSED_RELATIONS": {}, + "FEATURE_SCORES": {} + } + } + ], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 1, + "ENTITY_NAME": "", + "FEATURES": {}, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "TEST", + "RECORD_COUNT": 1 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "TEST", + "RECORD_ID": "2", + "INTERNAL_ID": 1, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "2024-10-25T17:38:57Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + }, + "RELATED_ENTITIES": [] + }, + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "ADDR_KEY": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL_KEY": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob J Smith", + "LIB_FEAT_ID": 38, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "Y" + } + ] + } + ], + "NAMEADDR_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEDATE_KEY": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEPHONE_KEY": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEREGION_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME_KEY": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE_KEY": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 100, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "INTERNAL_ID": 35, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002", + "INTERNAL_ID": 36, + "MATCH_KEY": "+NAME+DOB+PHONE", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "CNAME_CFF_CEXCL", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1003", + "INTERNAL_ID": 37, + "MATCH_KEY": "+NAME+DOB+EMAIL", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "SF1_PNAME_CSTAB", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + }, + "RELATED_ENTITIES": [] + } + ] +} \ No newline at end of file diff --git a/examples/szengine/why_record_in_entity.py b/examples/szengine/why_record_in_entity.py new file mode 100755 index 0000000..bc8b389 --- /dev/null +++ b/examples/szengine/why_record_in_entity.py @@ -0,0 +1,16 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE = "CUSTOMERS" + flags = SzEngineFlags.SZ_WHY_RECORDS_DEFAULT_FLAGS + RECORD_ID = "1001" + result = sz_engine.why_record_in_entity( + DATA_SOURCE_CODE, + RECORD_ID, + flags, + ) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/why_record_in_entity.txt b/examples/szengine/why_record_in_entity.txt new file mode 100644 index 0000000..0577b9e --- /dev/null +++ b/examples/szengine/why_record_in_entity.txt @@ -0,0 +1,960 @@ +// Output has been formatted for easier reading. +{ + "WHY_RESULTS": [ + { + "INTERNAL_ID": 35, + "ENTITY_ID": 35, + "FOCUS_RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001" + } + ], + "MATCH_INFO": { + "WHY_KEY": "+NAME+DOB+PHONE+EMAIL", + "WHY_ERRULE_CODE": "SF1_SNAME_CFF_CSTAB", + "MATCH_LEVEL_CODE": "RESOLVED", + "CANDIDATE_KEYS": { + "DOB": [ + { + "FEAT_ID": 2, + "FEAT_DESC": "12/11/1978" + } + ], + "EMAIL_KEY": [ + { + "FEAT_ID": 11, + "FEAT_DESC": "bsmith@WORK.COM" + } + ], + "NAMEDATE_KEY": [ + { + "FEAT_ID": 14, + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211" + }, + { + "FEAT_ID": 15, + "FEAT_DESC": "RPRT|SM0|DOB=71211" + }, + { + "FEAT_ID": 16, + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278" + } + ], + "NAMEPHONE_KEY": [ + { + "FEAT_ID": 19, + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300" + } + ], + "NAMEREGION_KEY": [ + { + "FEAT_ID": 18, + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS" + } + ], + "NAME_KEY": [ + { + "FEAT_ID": 6, + "FEAT_DESC": "RPRT|SM0" + } + ], + "PHONE_KEY": [ + { + "FEAT_ID": 9, + "FEAT_DESC": "7029191300" + } + ] + }, + "FEATURE_SCORES": { + "ADDRESS": [ + { + "INBOUND_FEAT_ID": 3, + "INBOUND_FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "INBOUND_FEAT_USAGE_TYPE": "MAILING", + "CANDIDATE_FEAT_ID": 22, + "CANDIDATE_FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "CANDIDATE_FEAT_USAGE_TYPE": "HOME", + "SCORE": 42, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 42 + }, + "SCORE_BUCKET": "NO_CHANCE", + "SCORE_BEHAVIOR": "FF" + } + ], + "DOB": [ + { + "INBOUND_FEAT_ID": 2, + "INBOUND_FEAT_DESC": "12/11/1978", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 2, + "CANDIDATE_FEAT_DESC": "12/11/1978", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "FMES" + } + ], + "EMAIL": [ + { + "INBOUND_FEAT_ID": 5, + "INBOUND_FEAT_DESC": "bsmith@work.com", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 5, + "CANDIDATE_FEAT_DESC": "bsmith@work.com", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "F1" + } + ], + "NAME": [ + { + "INBOUND_FEAT_ID": 1, + "INBOUND_FEAT_DESC": "Robert Smith", + "INBOUND_FEAT_USAGE_TYPE": "PRIMARY", + "CANDIDATE_FEAT_ID": 38, + "CANDIDATE_FEAT_DESC": "Bob J Smith", + "CANDIDATE_FEAT_USAGE_TYPE": "PRIMARY", + "SCORE": 90, + "ADDITIONAL_SCORES": { + "GENERATION_MATCH": -1, + "GNR_FN": 90, + "GNR_GN": 88, + "GNR_ON": -1, + "GNR_SN": 100 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "NAME" + }, + { + "INBOUND_FEAT_ID": 1, + "INBOUND_FEAT_DESC": "Robert Smith", + "INBOUND_FEAT_USAGE_TYPE": "PRIMARY", + "CANDIDATE_FEAT_ID": 20, + "CANDIDATE_FEAT_DESC": "Bob Smith", + "CANDIDATE_FEAT_USAGE_TYPE": "PRIMARY", + "SCORE": 97, + "ADDITIONAL_SCORES": { + "GENERATION_MATCH": -1, + "GNR_FN": 97, + "GNR_GN": 95, + "GNR_ON": -1, + "GNR_SN": 100 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "NAME" + } + ], + "PHONE": [ + { + "INBOUND_FEAT_ID": 4, + "INBOUND_FEAT_DESC": "702-919-1300", + "INBOUND_FEAT_USAGE_TYPE": "HOME", + "CANDIDATE_FEAT_ID": 4, + "CANDIDATE_FEAT_DESC": "702-919-1300", + "CANDIDATE_FEAT_USAGE_TYPE": "MOBILE", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "FF" + } + ], + "RECORD_TYPE": [ + { + "INBOUND_FEAT_ID": 10, + "INBOUND_FEAT_DESC": "PERSON", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 10, + "CANDIDATE_FEAT_DESC": "PERSON", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "FVME" + } + ] + } + } + } + ], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "ADDR_KEY": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL_KEY": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob J Smith", + "LIB_FEAT_ID": 38, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "Y" + } + ] + } + ], + "NAMEADDR_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEDATE_KEY": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEPHONE_KEY": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEREGION_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME_KEY": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE_KEY": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 100, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "INTERNAL_ID": 35, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002", + "INTERNAL_ID": 36, + "MATCH_KEY": "+NAME+DOB+PHONE", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "CNAME_CFF_CEXCL", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1003", + "INTERNAL_ID": 37, + "MATCH_KEY": "+NAME+DOB+EMAIL", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "SF1_PNAME_CSTAB", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + }, + "RELATED_ENTITIES": [] + } + ] +} \ No newline at end of file diff --git a/examples/szengine/why_records.py b/examples/szengine/why_records.py new file mode 100755 index 0000000..0dd974e --- /dev/null +++ b/examples/szengine/why_records.py @@ -0,0 +1,20 @@ +from senzing import SzEngineFlags, SzError + +from . import sz_engine + +try: + DATA_SOURCE_CODE_1 = "CUSTOMERS" + DATA_SOURCE_CODE_2 = "CUSTOMERS" + flags = SzEngineFlags.SZ_WHY_ENTITIES_DEFAULT_FLAGS + RECORD_ID_1 = "1001" + RECORD_ID_2 = "1002" + result = sz_engine.why_records( + DATA_SOURCE_CODE_1, + RECORD_ID_1, + DATA_SOURCE_CODE_2, + RECORD_ID_2, + flags, + ) + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szengine/why_records.txt b/examples/szengine/why_records.txt new file mode 100644 index 0000000..0e8e9e9 --- /dev/null +++ b/examples/szengine/why_records.txt @@ -0,0 +1,920 @@ +// Output has been formatted and pruned for easier reading. + +{ + "WHY_RESULTS": [ + { + "INTERNAL_ID": 35, + "ENTITY_ID": 35, + "FOCUS_RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001" + } + ], + "INTERNAL_ID_2": 36, + "ENTITY_ID_2": 35, + "FOCUS_RECORDS_2": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002" + } + ], + "MATCH_INFO": { + "WHY_KEY": "+NAME+DOB+PHONE", + "WHY_ERRULE_CODE": "CNAME_CFF_CEXCL", + "MATCH_LEVEL_CODE": "RESOLVED", + "CANDIDATE_KEYS": { + "NAMEDATE_KEY": [ + { + "FEAT_ID": 14, + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211" + }, + { + "FEAT_ID": 15, + "FEAT_DESC": "RPRT|SM0|DOB=71211" + } + ], + "NAMEPHONE_KEY": [ + { + "FEAT_ID": 19, + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300" + } + ], + "NAMEREGION_KEY": [ + { + "FEAT_ID": 18, + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS" + } + ], + "NAME_KEY": [ + { + "FEAT_ID": 6, + "FEAT_DESC": "RPRT|SM0" + } + ], + "PHONE_KEY": [ + { + "FEAT_ID": 9, + "FEAT_DESC": "7029191300" + } + ] + }, + "DISCLOSED_RELATIONS": {}, + "FEATURE_SCORES": { + "ADDRESS": [ + { + "INBOUND_FEAT_ID": 3, + "INBOUND_FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "INBOUND_FEAT_USAGE_TYPE": "MAILING", + "CANDIDATE_FEAT_ID": 22, + "CANDIDATE_FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "CANDIDATE_FEAT_USAGE_TYPE": "HOME", + "SCORE": 42, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 42 + }, + "SCORE_BUCKET": "NO_CHANCE", + "SCORE_BEHAVIOR": "FF" + } + ], + "DOB": [ + { + "INBOUND_FEAT_ID": 2, + "INBOUND_FEAT_DESC": "12/11/1978", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 21, + "CANDIDATE_FEAT_DESC": "11/12/1978", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 95, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 95 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "FMES" + } + ], + "NAME": [ + { + "INBOUND_FEAT_ID": 1, + "INBOUND_FEAT_DESC": "Robert Smith", + "INBOUND_FEAT_USAGE_TYPE": "PRIMARY", + "CANDIDATE_FEAT_ID": 20, + "CANDIDATE_FEAT_DESC": "Bob Smith", + "CANDIDATE_FEAT_USAGE_TYPE": "PRIMARY", + "SCORE": 97, + "ADDITIONAL_SCORES": { + "GENERATION_MATCH": -1, + "GNR_FN": 97, + "GNR_GN": 95, + "GNR_ON": -1, + "GNR_SN": 100 + }, + "SCORE_BUCKET": "CLOSE", + "SCORE_BEHAVIOR": "NAME" + } + ], + "PHONE": [ + { + "INBOUND_FEAT_ID": 4, + "INBOUND_FEAT_DESC": "702-919-1300", + "INBOUND_FEAT_USAGE_TYPE": "HOME", + "CANDIDATE_FEAT_ID": 4, + "CANDIDATE_FEAT_DESC": "702-919-1300", + "CANDIDATE_FEAT_USAGE_TYPE": "MOBILE", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "FF" + } + ], + "RECORD_TYPE": [ + { + "INBOUND_FEAT_ID": 10, + "INBOUND_FEAT_DESC": "PERSON", + "INBOUND_FEAT_USAGE_TYPE": "", + "CANDIDATE_FEAT_ID": 10, + "CANDIDATE_FEAT_DESC": "PERSON", + "CANDIDATE_FEAT_USAGE_TYPE": "", + "SCORE": 100, + "ADDITIONAL_SCORES": { + "FULL_SCORE": 100 + }, + "SCORE_BUCKET": "SAME", + "SCORE_BEHAVIOR": "FVME" + } + ] + } + } + } + ], + "ENTITIES": [ + { + "RESOLVED_ENTITY": { + "ENTITY_ID": 35, + "ENTITY_NAME": "Robert Smith", + "FEATURES": { + "ADDRESS": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515 Adela Lane Las Vegas NV 89111", + "LIB_FEAT_ID": 22, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USAGE_TYPE": "MAILING", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123 Main Street, Las Vegas NV 89132", + "LIB_FEAT_ID": 3, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "ADDR_KEY": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||89132", + "LIB_FEAT_ID": 8, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "123|MN||LS FKS", + "LIB_FEAT_ID": 7, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||89111", + "LIB_FEAT_ID": 24, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "1515|ATL||LS FKS", + "LIB_FEAT_ID": 25, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "DOB": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "12/11/1978", + "LIB_FEAT_ID": 2, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "11/12/1978", + "LIB_FEAT_ID": 21, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@work.com", + "LIB_FEAT_ID": 5, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "EMAIL_KEY": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "bsmith@WORK.COM", + "LIB_FEAT_ID": 11, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USAGE_TYPE": "PRIMARY", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "Robert Smith", + "LIB_FEAT_ID": 1, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob J Smith", + "LIB_FEAT_ID": 38, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + }, + { + "FEAT_DESC": "Bob Smith", + "LIB_FEAT_ID": 20, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "Y" + } + ] + } + ], + "NAMEADDR_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 27, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 28, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||89132", + "LIB_FEAT_ID": 12, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=123|MN||LS FKS", + "LIB_FEAT_ID": 13, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||89111", + "LIB_FEAT_ID": 29, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDR_KEY.EXPRESSION=1515|ATL||LS FKS", + "LIB_FEAT_ID": 26, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEDATE_KEY": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 43, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 41, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0|DOB=71211", + "LIB_FEAT_ID": 40, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 32, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 33, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 42, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|DOB=71211", + "LIB_FEAT_ID": 31, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMDD_HASH=1211", + "LIB_FEAT_ID": 14, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1178", + "LIB_FEAT_ID": 30, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB.MMYY_HASH=1278", + "LIB_FEAT_ID": 16, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|DOB=71211", + "LIB_FEAT_ID": 15, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEPHONE_KEY": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 37, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|PHONE.PHONE_LAST_5=91300", + "LIB_FEAT_ID": 19, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAMEREGION_KEY": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 36, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0|POST=89111", + "LIB_FEAT_ID": 35, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|ADDRESS.CITY_STD=LS FKS", + "LIB_FEAT_ID": 18, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89111", + "LIB_FEAT_ID": 34, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0|POST=89132", + "LIB_FEAT_ID": 17, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "NAME_KEY": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "J|PP|SM0", + "LIB_FEAT_ID": 39, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PP|SM0", + "LIB_FEAT_ID": 23, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "RPRT|SM0", + "LIB_FEAT_ID": 6, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "HOME", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + }, + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USAGE_TYPE": "MOBILE", + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "702-919-1300", + "LIB_FEAT_ID": 4, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "PHONE_KEY": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "7029191300", + "LIB_FEAT_ID": 9, + "USED_FOR_CAND": "Y", + "USED_FOR_SCORING": "N", + "ENTITY_COUNT": 1, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ], + "RECORD_TYPE": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "FEAT_DESC_VALUES": [ + { + "FEAT_DESC": "PERSON", + "LIB_FEAT_ID": 10, + "USED_FOR_CAND": "N", + "USED_FOR_SCORING": "Y", + "ENTITY_COUNT": 100, + "CANDIDATE_CAP_REACHED": "N", + "SCORING_CAP_REACHED": "N", + "SUPPRESSED": "N" + } + ] + } + ] + }, + "RECORD_SUMMARY": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_COUNT": 3 + } + ], + "RECORDS": [ + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1001", + "INTERNAL_ID": 35, + "MATCH_KEY": "", + "MATCH_LEVEL_CODE": "", + "ERRULE_CODE": "", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1002", + "INTERNAL_ID": 36, + "MATCH_KEY": "+NAME+DOB+PHONE", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "CNAME_CFF_CEXCL", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + }, + { + "DATA_SOURCE": "CUSTOMERS", + "RECORD_ID": "1003", + "INTERNAL_ID": 37, + "MATCH_KEY": "+NAME+DOB+EMAIL", + "MATCH_LEVEL_CODE": "RESOLVED", + "ERRULE_CODE": "SF1_PNAME_CSTAB", + "FIRST_SEEN_DT": "2024-10-25T17:39:00Z", + "LAST_SEEN_DT": "2024-10-25T17:39:00Z" + } + ] + }, + "RELATED_ENTITIES": [] + } + ] +} \ No newline at end of file diff --git a/examples/szproduct/__init__.py b/examples/szproduct/__init__.py new file mode 100644 index 0000000..b34934c --- /dev/null +++ b/examples/szproduct/__init__.py @@ -0,0 +1,13 @@ +from ..helpers.setup_senzing import ( + get_sz_abstract_factory, + get_sz_product, + sz_abstract_factory, + sz_product, +) + +__all__ = [ + "get_sz_abstract_factory", + "get_sz_product", + "sz_abstract_factory", + "sz_product", +] diff --git a/examples/szproduct/a_header_szproduct.py b/examples/szproduct/a_header_szproduct.py new file mode 100755 index 0000000..29e4887 --- /dev/null +++ b/examples/szproduct/a_header_szproduct.py @@ -0,0 +1,5 @@ +""" +Simply a header used in development. +""" + +print("\n---- szproduct -------------------------------------------------------\n") diff --git a/examples/szproduct/get_license.py b/examples/szproduct/get_license.py new file mode 100755 index 0000000..3709b05 --- /dev/null +++ b/examples/szproduct/get_license.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_product + +try: + result = sz_product.get_license() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szproduct/get_license.txt b/examples/szproduct/get_license.txt new file mode 100644 index 0000000..abe3c3f --- /dev/null +++ b/examples/szproduct/get_license.txt @@ -0,0 +1,12 @@ +// Output has been formatted for easier reading. + +{ + "customer": "Senzing Public Test License", + "contract": "EVALUATION - support@senzing.com", + "issueDate": "2024-10-15", + "licenseType": "EVAL (Solely for non-productive use)", + "licenseLevel": "STANDARD", + "billing": "MONTHLY", + "expireDate": "2025-10-16", + "recordLimit": 500 +} \ No newline at end of file diff --git a/examples/szproduct/get_version.py b/examples/szproduct/get_version.py new file mode 100755 index 0000000..7875165 --- /dev/null +++ b/examples/szproduct/get_version.py @@ -0,0 +1,9 @@ +from senzing import SzError + +from . import sz_product + +try: + result = sz_product.get_version() + print(f"\n{result}\n") +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szproduct/get_version.txt b/examples/szproduct/get_version.txt new file mode 100644 index 0000000..a0962f0 --- /dev/null +++ b/examples/szproduct/get_version.txt @@ -0,0 +1,17 @@ +// Output has been formatted for easier reading. + +{ + "PRODUCT_NAME": "Senzing SDK", + "VERSION": "4.0.0", + "BUILD_VERSION": "4.0.0.24289", + "BUILD_DATE": "2024-10-15", + "BUILD_NUMBER": "2024_10_15__14_21", + "COMPATIBILITY_VERSION": { + "CONFIG_VERSION": "11" + }, + "SCHEMA_VERSION": { + "ENGINE_SCHEMA_VERSION": "4.0", + "MINIMUM_REQUIRED_SCHEMA_VERSION": "4.0", + "MAXIMUM_REQUIRED_SCHEMA_VERSION": "4.99" + } +} \ No newline at end of file diff --git a/examples/szproduct/szproduct_constructor.py b/examples/szproduct/szproduct_constructor.py new file mode 100755 index 0000000..734fc5d --- /dev/null +++ b/examples/szproduct/szproduct_constructor.py @@ -0,0 +1,8 @@ +from senzing import SzError + +from . import sz_abstract_factory + +try: + sz_product = sz_abstract_factory.create_product() +except SzError as err: + print(f"\nERROR: {err}\n") diff --git a/examples/szproduct/szproduct_initialize_and_destroy.py b/examples/szproduct/szproduct_initialize_and_destroy.py new file mode 100755 index 0000000..e69de29 diff --git a/makefiles/darwin.mk b/makefiles/darwin.mk index 5c6d913..b1d2850 100644 --- a/makefiles/darwin.mk +++ b/makefiles/darwin.mk @@ -4,14 +4,21 @@ # Variables # ----------------------------------------------------------------------------- +LD_LIBRARY_PATH ?= $(SENZING_TOOLS_SENZING_DIRECTORY)/lib:$(SENZING_TOOLS_SENZING_DIRECTORY)/lib/macos +DYLD_LIBRARY_PATH := $(LD_LIBRARY_PATH) PATH := $(MAKEFILE_DIRECTORY)/bin:$(PATH) +SENZING_DIR ?= /opt/senzing/er +SENZING_TOOLS_SENZING_DIRECTORY ?= $(SENZING_DIR) +SENZING_TOOLS_DATABASE_URL ?= sqlite3://na:na@/tmp/sqlite/G2C.db + # ----------------------------------------------------------------------------- # OS specific targets # ----------------------------------------------------------------------------- .PHONY: clean-osarch-specific clean-osarch-specific: + @rm -fr /tmp/sqlite || true @rm -f $(MAKEFILE_DIRECTORY)/.coverage || true @rm -f $(MAKEFILE_DIRECTORY)/coverage.xml || true @rm -fr $(DIST_DIRECTORY) || true @@ -53,7 +60,16 @@ package-osarch-specific: .PHONY: setup-osarch-specific setup-osarch-specific: - $(info No setup required.) + @mkdir /tmp/sqlite + @cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db + + +.PHONY: test-osarch-specific +test-osarch-specific: + $(info --- Unit tests -------------------------------------------------------) + @pytest tests/ --verbose --capture=no --cov=src/senzing_core + $(info --- Test examples ----------------------------------------------------) + @pytest examples/ --verbose --capture=no --cov=src/senzing_core .PHONY: venv-osarch-specific diff --git a/makefiles/linux.mk b/makefiles/linux.mk index 9ba9eb0..7ee21af 100644 --- a/makefiles/linux.mk +++ b/makefiles/linux.mk @@ -5,6 +5,7 @@ # ----------------------------------------------------------------------------- PATH := $(MAKEFILE_DIRECTORY)/bin:$(PATH) +SENZING_TOOLS_DATABASE_URL ?= sqlite3://na:na@/tmp/sqlite/G2C.db # ----------------------------------------------------------------------------- # OS specific targets @@ -12,6 +13,7 @@ PATH := $(MAKEFILE_DIRECTORY)/bin:$(PATH) .PHONY: clean-osarch-specific clean-osarch-specific: + @rm -fr /tmp/sqlite || true @rm -f $(MAKEFILE_DIRECTORY)/.coverage || true @rm -f $(MAKEFILE_DIRECTORY)/coverage.xml || true @rm -fr $(DIST_DIRECTORY) || true @@ -25,18 +27,21 @@ clean-osarch-specific: .PHONY: coverage-osarch-specific +coverage-osarch-specific: export SENZING_LOG_LEVEL=TRACE coverage-osarch-specific: - @$(activate-venv); pytest --cov=src --cov-report=xml $(shell git ls-files '*.py' ':!:examples/*') + @$(activate-venv); pytest --cov=src --cov-report=xml $(shell git ls-files '*.py') @$(activate-venv); coverage html - @xdg-open $(MAKEFILE_DIRECTORY)/htmlcov/index.html 1>/dev/null 2>&1 + @xdg-open $(MAKEFILE_DIRECTORY)/htmlcov/index.html 1>/dev/null 2>&1 .PHONY: dependencies-for-development-osarch-specific dependencies-for-development-osarch-specific: + .PHONY: dependencies-for-documentation-osarch-specific dependencies-for-documentation-osarch-specific: + .PHONY: documentation-osarch-specific documentation-osarch-specific: @$(activate-venv); cd docs; rm -rf build; make html @@ -55,22 +60,35 @@ package-osarch-specific: .PHONY: setup-osarch-specific setup-osarch-specific: - $(info No setup required.) + @mkdir /tmp/sqlite + @cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db -.PHONY: test-osarch-specific-2 -test-osarch-specific-2: +.PHONY: test-osarch-specific +test-osarch-specific: $(info --- Unit tests -------------------------------------------------------) - @pytest tests/ --verbose --capture=no --cov=src/senzing --cov-report xml:coverage.xml -# $(info --- Test examples ----------------------------------------------------) -# @pytest examples/ --verbose --capture=no --cov=src/senzing -# $(info --- Test examples using unittest -------------------------------------) -# @python3 -m unittest \ -# examples/szconfig/*.py \ -# examples/szconfigmanager/*.py \ -# examples/szdiagnostic/*.py \ -# examples/szengine/*.py \ -# examples/szproduct/*.py + @$(activate-venv); pytest tests/ --verbose --capture=no --cov=src --cov-report xml:coverage.xml + $(info --- Test examples using pytest -------------------------------------) + @$(activate-venv); pytest \ + examples/misc/ \ + examples/docs/ \ + examples/extras/ \ + examples/szabstractfactory/ \ + examples/szconfig/ \ + examples/szconfigmanager/ \ + examples/szdiagnostic/ \ + examples/szengine/ \ + examples/szproduct/ \ + --capture=no \ + -o python_files=*.py \ + --verbose; \ + pytest_exit_code="$$?"; \ + if [ "$$pytest_exit_code" -eq 5 ]; then \ + printf '\nExit code from pytest was %s, this is expected testing the examples if there were no Python errors\n' "$$pytest_exit_code"; \ + exit 0; \ + else \ + exit "$$pytest_exit_code"; \ + fi .PHONY: venv-osarch-specific diff --git a/makefiles/windows.mk b/makefiles/windows.mk index dfd4ab2..c617823 100644 --- a/makefiles/windows.mk +++ b/makefiles/windows.mk @@ -4,6 +4,7 @@ # Variables # ----------------------------------------------------------------------------- +SENZING_TOOLS_DATABASE_URL ?= sqlite3://na:na@nowhere/C:\Temp\sqlite\G2C.db # ----------------------------------------------------------------------------- # OS specific targets @@ -24,12 +25,19 @@ clean-osarch-specific: .PHONY: coverage-osarch-specific +coverage-osarch-specific: export SENZING_LOG_LEVEL=TRACE coverage-osarch-specific: @pytest --cov=src --cov-report=xml $(shell git ls-files '*.py') @coverage html @explorer $(MAKEFILE_DIRECTORY)/htmlcov/index.html +.PHONY: dependencies-osarch-specific +dependencies-osarch-specific: + python3 -m pip install --upgrade pip + pip install psutil pytest pytest-cov pytest-schema + + .PHONY: documentation-osarch-specific documentation-osarch-specific: # @cd docs; rm -rf build; make html @@ -48,7 +56,16 @@ package-osarch-specific: .PHONY: setup-osarch-specific setup-osarch-specific: - $(info No setup required.) + @mkdir C:\Temp\sqlite + @type nul > C:\Temp\sqlite\G2C.db + + +.PHONY: test-osarch-specific +test-osarch-specific: + $(info --- Unit tests -------------------------------------------------------) + @pytest tests/ --verbose --capture=no --cov=src/senzing_core + $(info --- Test examples ----------------------------------------------------) + @pytest examples/ --verbose --capture=no --cov=src/senzing_core .PHONY: venv-osarch-specific diff --git a/pyproject.toml b/pyproject.toml index 6041d03..f8a8b38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,6 @@ ignore_missing_imports = "true" [tool.pylint] disable = [ "duplicate-code", - "import-error", "line-too-long", "missing-module-docstring", "too-many-arguments", diff --git a/setup.cfg b/setup.cfg index 62693d7..4356aee 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = senzing -version = 0.2.3 +version = 0.2.4 author = senzing author_email = support@senzing.com description = Python SDK method definitions diff --git a/src/senzing/constants.py b/src/senzing/constants.py index 2f2d0f1..4de2709 100644 --- a/src/senzing/constants.py +++ b/src/senzing/constants.py @@ -1,11 +1,22 @@ """ -TODO: szconstants.py +szconstants.py has convenience constant declarations. """ # Metadata # TODO -# __all__ = [] +__all__ = [ + "SZ_INITIALIZE_WITH_DEFAULT_CONFIGURATION", + "SZ_NO_ATTRIBUTES", + "SZ_NO_AVOIDANCES", + "SZ_NO_FLAGS", + "SZ_NO_INFO", + "SZ_NO_LOGGING", + "SZ_NO_REQUIRED_DATASOURCES", + "SZ_NO_SEARCH_PROFILE", + "SZ_VERBOSE_LOGGING", + "SZ_WITHOUT_INFO", +] __version__ = "0.0.1" # See https://www.python.org/dev/peps/pep-0396/ __date__ = "2023-10-30" __updated__ = "2023-10-30" @@ -17,7 +28,6 @@ SZ_NO_FLAGS = 0 SZ_WITHOUT_INFO = 0 - # ----------------------------------------------------------------------------- # Constant helper values # ----------------------------------------------------------------------------- diff --git a/src/senzing/szabstractfactory.py b/src/senzing/szabstractfactory.py index e244298..acdd1a3 100644 --- a/src/senzing/szabstractfactory.py +++ b/src/senzing/szabstractfactory.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -szabstractfactory_abstract.py is the abstract class for all implementations of szabstractfactory. +szabstractfactory.py is the abstract class for all implementations of SzAbstractFactory. """ @@ -40,196 +40,126 @@ class SzAbstractFactory(ABC): @abstractmethod def create_config(self) -> SzConfig: """ - The `create_config` method creates a new implementation of an `SzConfigAbstract` object. + The `create_config` method creates a new implementation of an `SzConfig` object. Args: Returns: - SzConfigAbstract: A new implementation. + SzConfig: A new implementation. Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szabstractfactory/create_config.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_config.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_config.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_config.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_config.txt + :linenos: + :language: json """ @abstractmethod def create_configmanager(self) -> SzConfigManager: """ - The `create_configmanager` method creates a new implementation of an `SzConfigManagerAbstract` object. + The `create_configmanager` method creates a new implementation of an `SzConfigManager` object. Args: Returns: - SzConfigManagerAbstract: A new implementation. + SzConfigManager: A new implementation. Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_configmanager.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_configmanager.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_configmanager.py + :linenos: + :language: python - .. collapse:: gRPC implementation: + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_configmanager.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_configmanager.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_configmanager.txt + :linenos: + :language: json """ @abstractmethod def create_diagnostic(self) -> SzDiagnostic: """ - The `create_diagnostic` method creates a new implementation of an `SzDiagnosticAbstract` object. + The `create_diagnostic` method creates a new implementation of an `SzDiagnostic` object. Args: Returns: - SzDiagnosticAbstract: A new implementation. + SzDiagnostic: A new implementation. Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_diagnostic.py - :linenos: - :language: python + .. collapse:: Example: - **Output:** + .. literalinclude:: ../../examples/szabstractfactory/create_diagnostic.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_diagnostic.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_diagnostic.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_diagnostic.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_diagnostic.txt + :linenos: + :language: json """ @abstractmethod def create_engine(self) -> SzEngine: """ - The `create_engine` method creates a new implementation of an `SzEngineAbstract` object. + The `create_engine` method creates a new implementation of an `SzEngine` object. Args: Returns: - SzEngineAbstract: A new implementation. + SzEngine: A new implementation. Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_engine.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szabstractfactory/create_engine.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_engine.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_engine.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_engine.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_engine.txt + :linenos: + :language: json """ @abstractmethod def create_product(self) -> SzProduct: """ - The `create_product` method creates a new implementation of an `SzProductAbstract` object. + The `create_product` method creates a new implementation of an `SzProduct` object. Args: Returns: - SzProductAbstract: A new implementation. + SzProduct: A new implementation. Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_product.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/create_product.txt - :linenos: - :language: json + .. collapse:: Example: - .. collapse:: gRPC implementation: + .. literalinclude:: ../../examples/szabstractfactory/create_product.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_product.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/create_product.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/create_product.txt + :linenos: + :language: json """ @abstractmethod @@ -246,31 +176,11 @@ def reinitialize(self, config_id: int) -> None: TypeError: Incorrect datatype of input parameter. szexception.SzError: config_id does not exist. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/reinitialize.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szabstractfactory/reinitialize.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/reinitialize.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szabstractfactory/reinitialize.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szabstractfactory/reinitialize.py + :linenos: + :language: python """ # ------------------------------------------------------------------------- diff --git a/src/senzing/szconfig.py b/src/senzing/szconfig.py index 064750d..17e031f 100644 --- a/src/senzing/szconfig.py +++ b/src/senzing/szconfig.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -szconfig.py is the abstract class for all implementations of szconfig. +szconfig.py is the abstract class for all implementations of SzConfig. """ # TODO: Determine specific SzErrors, Errors for "Raises:" documentation. @@ -47,31 +47,17 @@ def add_data_source(self, config_handle: int, data_source_code: str) -> str: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szconfig/add_data_source.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/add_data_source.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/add_data_source.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/add_data_source.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/add_data_source.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/add_data_source.txt + :linenos: + :language: json """ @abstractmethod @@ -85,31 +71,11 @@ def close_config(self, config_handle: int) -> None: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/create_and_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/create_and_close.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/create_and_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/create_and_close.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/create_and_close.py + :linenos: + :language: python """ @abstractmethod @@ -129,31 +95,11 @@ def create_config(self) -> int: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/create_and_close.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/create_and_close.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/create_and_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/create_and_close.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/create_and_close.py + :linenos: + :language: python """ @abstractmethod @@ -168,31 +114,11 @@ def delete_data_source(self, config_handle: int, data_source_code: str) -> None: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/delete_data_source.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/delete_data_source.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/delete_data_source.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/delete_data_source.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/delete_data_source.py + :linenos: + :language: python """ @abstractmethod @@ -209,31 +135,23 @@ def export_config(self, config_handle: int) -> str: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/export_config.py - :linenos: - :language: python + .. collapse:: Example: - **Output:** + .. literalinclude:: ../../examples/szconfig/export_config.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/export_config.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: + .. literalinclude:: ../../examples/szconfig/export_config.txt + :linenos: + :language: json - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/export_config.py - :linenos: - :language: python + **Create, export, import, and close example** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/export_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/create_export_import_close.py + :linenos: + :language: python """ @abstractmethod @@ -251,31 +169,17 @@ def get_data_sources(self, config_handle: int) -> str: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/get_data_sources.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szconfig/get_data_sources.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfig/get_data_sources.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/get_data_sources.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/get_data_sources.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/get_data_sources.txt + :linenos: + :language: json """ @abstractmethod @@ -296,31 +200,17 @@ def import_config(self, config_definition: str) -> int: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/import_config.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/import_config.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/import_config.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szconfig/import_config.py + :linenos: + :language: python - **Output:** + **Create, save, load, and close** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfig/import_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfig/create_export_import_close.py + :linenos: + :language: python """ # ------------------------------------------------------------------------- diff --git a/src/senzing/szconfigmanager.py b/src/senzing/szconfigmanager.py index 6d84cb3..5c68a50 100644 --- a/src/senzing/szconfigmanager.py +++ b/src/senzing/szconfigmanager.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -szconfigmanager.py is the abstract class for all implementations of szconfigmanager. +szconfigmanager.py is the abstract class for all implementations of SzConfigManager. """ # TODO: Determine specific SzErrors, Errors for "Raises:" documentation. @@ -47,31 +47,11 @@ def add_config(self, config_definition: str, config_comment: str) -> int: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/add_config.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/add_config.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/add_config.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/add_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/add_config.py + :linenos: + :language: python """ @abstractmethod @@ -88,31 +68,17 @@ def get_config(self, config_id: int) -> str: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_config.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/get_config.py + :linenos: + :language: python - .. collapse:: gRPC implementation: + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_config.txt - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_config.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/get_config.txt + :linenos: + :language: json """ @abstractmethod @@ -126,31 +92,17 @@ def get_configs(self) -> str: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_configs.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_configs.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/get_configs.py + :linenos: + :language: python - .. collapse:: gRPC implementation: + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_configs.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_configs.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/get_configs.txt + :linenos: + :language: json """ @abstractmethod @@ -164,31 +116,11 @@ def get_default_config_id(self) -> int: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_default_config_id.py - :linenos: - :language: python + .. collapse:: Example: - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/get_default_config_id.txt - :linenos: - :language: none - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_default_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/get_default_config_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/get_default_config_id.py + :linenos: + :language: python """ @abstractmethod @@ -206,31 +138,11 @@ def replace_default_config_id(self, current_default_config_id: int, new_default_ Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/replace_default_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/replace_default_config_id.txt - :linenos: - :language: none - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/replace_default_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/replace_default_config_id.txt - :linenos: - :language: none + .. literalinclude:: ../../examples/szconfigmanager/replace_default_config_id.py + :linenos: + :language: python """ @abstractmethod @@ -245,31 +157,11 @@ def set_default_config_id(self, config_id: int) -> None: Raises: TypeError: Incorrect datatype of input parameter. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/set_default_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szconfigmanager/set_default_config_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/set_default_config_id.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szconfigmanager/set_default_config_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szconfigmanager/set_default_config_id.py + :linenos: + :language: python """ # ------------------------------------------------------------------------- diff --git a/src/senzing/szdiagnostic.py b/src/senzing/szdiagnostic.py index 73f2271..daa80bb 100644 --- a/src/senzing/szdiagnostic.py +++ b/src/senzing/szdiagnostic.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -TODO: szdiagnostic.py +szdiagnostic.py is the abstract class for all implementations of SzDiagnostic. """ from abc import ABC, abstractmethod @@ -44,31 +44,17 @@ def check_datastore_performance(self, seconds_to_run: int) -> str: TypeError: Incorrect datatype of input parameter. szexception.SzError: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szdiagnostic/check_datastore_performance.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/check_datastore_performance.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/check_datastore_performance.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/check_datastore_performance.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/check_datastore_performance.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szdiagnostic/check_datastore_performance.txt + :linenos: + :language: json """ @abstractmethod @@ -80,31 +66,17 @@ def get_datastore_info(self) -> str: Raises: szexception.SzError: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/get_datastore_info.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/get_datastore_info.txt - :linenos: - :language: json + .. collapse:: Example: - .. collapse:: gRPC implementation: + .. literalinclude:: ../../examples/szdiagnostic/get_datastore_info.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/get_datastore_info.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/get_datastore_info.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szdiagnostic/get_datastore_info.txt + :linenos: + :language: json """ # NOTE This is included but not to be documented @@ -133,31 +105,11 @@ def purge_repository(self) -> None: Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/purge_repository.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szdiagnostic/purge_repository.txt - :linenos: - :language: none - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/purge_repository.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szdiagnostic/purge_repository.txt - :linenos: - :language: none + .. literalinclude:: ../../examples/szdiagnostic/purge_repository.py + :linenos: + :language: python """ # ------------------------------------------------------------------------- diff --git a/src/senzing/szengine.py b/src/senzing/szengine.py index e283e98..a8de57f 100644 --- a/src/senzing/szengine.py +++ b/src/senzing/szengine.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -TODO: szengine.py +szengine.py is the abstract class for all implementations of SzEngine. """ # pylint: disable=C0302 @@ -57,33 +57,18 @@ def add_record( str: If flags are set to return the WITH_INFO response a JSON document containing the details, otherwise an empty string. Raises: - SzError: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/add_record.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/add_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/add_record.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/add_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/add_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/add_record.txt + :linenos: + :language: json """ @abstractmethod @@ -98,6 +83,17 @@ def close_export(self, export_handle: int) -> None: Raises: + .. collapse:: Example: + + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.py + :linenos: + :language: python + + **Output:** + + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.txt + :linenos: + :language: json """ @abstractmethod @@ -110,31 +106,17 @@ def count_redo_records(self) -> int: Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/count_redo_records.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/count_redo_records.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/count_redo_records.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/count_redo_records.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/count_redo_records.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/count_redo_records.txt + :linenos: + :language: guess """ @abstractmethod @@ -158,31 +140,16 @@ def delete_record( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/delete_record.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/delete_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/delete_record.py + :linenos: - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/delete_record.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/delete_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/delete_record.txt + :linenos: + :language: json """ @abstractmethod @@ -216,31 +183,17 @@ def export_csv_entity_report( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_csv_fetch_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_csv_fetch_close.txt - :linenos: - :language: none - - .. collapse:: gRPC implementation: + .. literalinclude:: ../../examples/szengine/export_csv_fetch_close.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_csv_fetch_close.py - :linenos: - :language: python - - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_csv_fetch_close.txt - :linenos: - :language: none + .. literalinclude:: ../../examples/szengine/export_csv_fetch_close.txt + :linenos: + :language: guess """ @abstractmethod @@ -261,31 +214,17 @@ def export_json_entity_report(self, flags: int = SzEngineFlags.SZ_EXPORT_DEFAULT Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_json_fetch_close.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_json_fetch_close.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.txt + :linenos: + :language: json """ @abstractmethod @@ -304,31 +243,17 @@ def fetch_next(self, export_handle: int) -> str: Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_json_fetch_close.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/export_json_fetch_close.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.py - :linenos: - :language: python - - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/export_json_fetch_close.txt + :linenos: + :language: json """ # NOTE Included but not to be documented or examples, early adaptor feature, needs manual additions to config @@ -368,31 +293,17 @@ def find_network_by_entity_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_network_by_entity_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_network_by_entity_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_network_by_entity_id.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/find_network_by_entity_id.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_network_by_entity_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/find_network_by_entity_id.txt + :linenos: + :language: json """ @abstractmethod @@ -422,31 +333,17 @@ def find_network_by_record_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_network_by_record_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_network_by_record_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/find_network_by_record_id.py + :linenos: + :language: python - .. collapse:: gRPC implementation: + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_network_by_record_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_network_by_record_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/find_network_by_record_id.txt + :linenos: + :language: json """ @abstractmethod @@ -478,31 +375,17 @@ def find_path_by_entity_id( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/find_path_by_entity_id.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_path_by_entity_id.py - :linenos: - :language: python - - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_path_by_entity_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_path_by_entity_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_path_by_entity_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/find_path_by_entity_id.txt + :linenos: + :language: json """ @abstractmethod @@ -540,31 +423,17 @@ def find_path_by_record_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_path_by_record_id.py - :linenos: - :language: python + .. collapse:: Example: - **Output:** + .. literalinclude:: ../../examples/szengine/find_path_by_record_id.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/find_path_by_record_id.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_path_by_record_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/find_path_by_record_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/find_path_by_record_id.txt + :linenos: + :language: json """ @abstractmethod @@ -577,31 +446,17 @@ def get_active_config_id(self) -> int: Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/get_active_config_id.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_active_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_active_config_id.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_active_config_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_active_config_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_active_config_id.txt + :linenos: + :language: json """ @abstractmethod @@ -622,31 +477,17 @@ def get_entity_by_entity_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_entity_by_entity_id.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/get_entity_by_entity_id.py + :linenos: + :language: python - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_entity_by_entity_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_entity_by_entity_id.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_entity_by_entity_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_entity_by_entity_id.txt + :linenos: + :language: json """ @abstractmethod @@ -669,30 +510,17 @@ def get_entity_by_record_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_entity_by_record_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_entity_by_record_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_entity_by_record_id.py - :language: python + .. literalinclude:: ../../examples/szengine/get_entity_by_record_id.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_entity_by_record_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_entity_by_record_id.txt + :linenos: + :language: json """ @abstractmethod @@ -716,31 +544,17 @@ def get_record( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/get_record.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_record.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_record.txt + :linenos: + :language: json """ @abstractmethod @@ -754,31 +568,17 @@ def get_redo_record(self) -> str: Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_redo_record.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/get_redo_record.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_redo_record.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_redo_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_redo_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_redo_record.txt + :linenos: + :language: json """ @abstractmethod @@ -792,31 +592,17 @@ def get_stats(self) -> str: Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_stats.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/get_stats.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_stats.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_stats.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_stats.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_stats.txt + :linenos: + :language: json """ @abstractmethod @@ -840,31 +626,17 @@ def get_virtual_entity_by_record_id( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_virtual_entity_by_record_id.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/get_virtual_entity_by_record_id.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_virtual_entity_by_record_id.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/get_virtual_entity_by_record_id.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/get_virtual_entity_by_record_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/get_virtual_entity_by_record_id.txt + :linenos: + :language: json """ @abstractmethod @@ -887,31 +659,17 @@ def how_entity_by_entity_id( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/how_entity_by_entity_id.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/how_entity_by_entity_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/how_entity_by_entity_id.py + :linenos: + :language: python - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/how_entity_by_entity_id.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/how_entity_by_entity_id.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/how_entity_by_entity_id.txt + :linenos: + :language: json """ @abstractmethod @@ -932,31 +690,17 @@ def preprocess_record( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/preprocess_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/preprocess_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/preprocess_record.py + :linenos: + :language: python - .. collapse:: gRPC implementation: + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/preprocess_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/preprocess_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/preprocess_record.txt + :linenos: + :language: json """ @abstractmethod @@ -969,31 +713,11 @@ def prime_engine(self) -> None: Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/prime_engine.py - :linenos: - :language: python - - **Output:** + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/prime_engine.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/prime_engine.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/prime_engine.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/prime_engine.py + :linenos: + :language: python """ @abstractmethod @@ -1007,31 +731,17 @@ def process_redo_record(self, redo_record: str, flags: int = 0) -> str: Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/process_redo_record.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/process_redo_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/process_redo_record.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/process_redo_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/process_redo_record.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/process_redo_record.txt + :linenos: + :language: json """ @abstractmethod @@ -1045,31 +755,17 @@ def reevaluate_entity(self, entity_id: int, flags: int = 0) -> str: Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/reevaluate_entity.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/reevaluate_entity.py + :linenos: + :language: python - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/reevaluate_entity.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/reevaluate_entity.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/reevaluate_entity.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/reevaluate_entity.txt + :linenos: + :language: json """ @abstractmethod @@ -1087,31 +783,17 @@ def reevaluate_record(self, data_source_code: str, record_id: str, flags: int = Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/reevaluate_record.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/reevaluate_record.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/reevaluate_record.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/export_json_fetch_close.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/reevaluate_record.txt + :linenos: + :language: json """ @abstractmethod @@ -1134,31 +816,17 @@ def search_by_attributes( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/search_by_attributes.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/search_by_attributes.py - :linenos: - :language: python - - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/search_by_attributes.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/search_by_attributes.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/search_by_attributes.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/search_by_attributes.txt + :linenos: + :language: json """ @abstractmethod @@ -1181,31 +849,17 @@ def why_entities( Raises: - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_entities.py - :linenos: - :language: python + .. collapse:: Example: - **Output:** + .. literalinclude:: ../../examples/szengine/why_entities.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_entities.txt - :linenos: - :language: json + **Output:** - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_entities.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_entities.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szengine/why_entities.txt + :linenos: + :language: json """ @abstractmethod @@ -1228,29 +882,15 @@ def why_record_in_entity( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szengine/why_record_in_entity.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_record_in_entity.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_record_in_entity.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_record_in_entity.py - :linenos: - :language: python - - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_record_in_entity.txt + .. literalinclude:: ../../examples/szengine/why_record_in_entity.txt :linenos: :language: json """ @@ -1279,29 +919,15 @@ def why_records( Raises: - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_records.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szengine/why_records.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_records.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szengine/why_records.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szengine/why_records.txt + .. literalinclude:: ../../examples/szengine/why_records.txt :linenos: :language: json """ diff --git a/src/senzing/szengineflags.py b/src/senzing/szengineflags.py index 3680782..c61740c 100644 --- a/src/senzing/szengineflags.py +++ b/src/senzing/szengineflags.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -TODO: szengineflags.py +szengineflags.py has constants that are used when calling Senzing functions. """ from enum import IntFlag diff --git a/src/senzing/szerror.py b/src/senzing/szerror.py index b5ef930..83c73e6 100644 --- a/src/senzing/szerror.py +++ b/src/senzing/szerror.py @@ -3,7 +3,7 @@ DO NOT EDIT. This code is generated. Generated by: sz-sdk-errors/bin/generate_python.py Generated for: sz-sdk-python/src/senzing/szerror.py -Generated date: 2025-02-06T14:51:36.318742+00:00 +Generated date: 2025-02-13T18:58:27.185575+00:00 """ # Metadata @@ -15,13 +15,14 @@ "SzDatabaseError", "SzDatabaseTransientError", "SzError", + "SzGeneralError", "SzLicenseError", "SzNotFoundError", "SzNotInitializedError", "SzReplaceConflictError", "SzRetryableError", - "SzSdkError", "SzRetryTimeoutExceededError", + "SzSdkError", "SzUnhandledError", "SzUnknownDataSourceError", "SzUnrecoverableError", @@ -154,7 +155,7 @@ class SzUnhandledError(SzUnrecoverableError): # fmt: off ENGINE_EXCEPTION_MAP = { 2: SzBadInputError, # EAS_ERR_INVALID_MESSAGE "Invalid Message" - 5: SzError, # EAS_ERR_EXCEEDED_MAX_RETRIES "Exceeded the Maximum Number of Retries Allowed" + 5: SzRetryableError, # EAS_ERR_EXCEEDED_MAX_RETRIES "Exceeded the Maximum Number of Retries Allowed" 7: SzBadInputError, # EAS_ERR_EMPTY_MESSAGE "Empty Message" 10: SzRetryTimeoutExceededError, # EAS_ERR_RETRY_TIMEOUT "Retry timeout exceeded RES_ENT_ID locklist [{0}]" 14: SzConfigurationError, # EAS_ERR_INVALID_DATASTORE_CONFIGURATION_TYPE "Invalid Datastore Configuration Type" diff --git a/src/senzing/szhelpers.py b/src/senzing/szhelpers.py index 0d8c4a3..0cad721 100644 --- a/src/senzing/szhelpers.py +++ b/src/senzing/szhelpers.py @@ -1,5 +1,5 @@ """ -TODO: szhelpers.py +szhelpers.py has non-public helper methods. """ import inspect diff --git a/src/senzing/szproduct.py b/src/senzing/szproduct.py index b4c1215..fe6b5ca 100644 --- a/src/senzing/szproduct.py +++ b/src/senzing/szproduct.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 """ -szproduct.py is the abstract class for all implementations of szproduct. +szproduct.py is the abstract class for all implementations of SzProduct. """ # TODO: Determine specific SzError, Errors for "Raises:" documentation. @@ -39,31 +39,17 @@ def get_license(self) -> str: Returns: str: A JSON document containing Senzing license metadata. - .. collapse:: Examples: + .. collapse:: Example: - .. collapse:: Core implementation: + .. literalinclude:: ../../examples/szproduct/get_license.py + :linenos: + :language: python - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szproduct/get_license.py - :linenos: - :language: python + **Output:** - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szproduct/get_license.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szproduct/get_license.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szproduct/get_license.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szproduct/get_license.txt + :linenos: + :language: json """ @abstractmethod @@ -74,31 +60,17 @@ def get_version(self) -> str: Returns: str: A JSON document containing metadata about the Senzing Engine version being used. - .. collapse:: Examples: - - .. collapse:: Core implementation: - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szproduct/get_version.py - :linenos: - :language: python - - **Output:** - - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-core/refs/heads/main/examples/szproduct/get_version.txt - :linenos: - :language: json - - .. collapse:: gRPC implementation: + .. collapse:: Example: - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szproduct/get_version.py - :linenos: - :language: python + .. literalinclude:: ../../examples/szproduct/get_version.py + :linenos: + :language: python - **Output:** + **Output:** - .. rli:: https://raw.githubusercontent.com/senzing-garage/sz-sdk-python-grpc/refs/heads/main/examples/szproduct/get_version.txt - :linenos: - :language: json + .. literalinclude:: ../../examples/szproduct/get_version.txt + :linenos: + :language: json """ # ------------------------------------------------------------------------- diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000..4d9751b --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +senzing-core==0.3.3 \ No newline at end of file diff --git a/testdata/senzing-license/g2.lic b/testdata/senzing-license/g2.lic new file mode 100644 index 0000000..67bc86c Binary files /dev/null and b/testdata/senzing-license/g2.lic differ diff --git a/testdata/sqlite/G2C-empty.db b/testdata/sqlite/G2C-empty.db new file mode 100644 index 0000000..e69de29 diff --git a/testdata/sqlite/G2C-with-config.db b/testdata/sqlite/G2C-with-config.db new file mode 100644 index 0000000..da9c8cf Binary files /dev/null and b/testdata/sqlite/G2C-with-config.db differ diff --git a/testdata/sqlite/G2C-with-schema.db b/testdata/sqlite/G2C-with-schema.db new file mode 100644 index 0000000..989d9f2 Binary files /dev/null and b/testdata/sqlite/G2C-with-schema.db differ diff --git a/testdata/sqlite/G2C.db b/testdata/sqlite/G2C.db new file mode 100644 index 0000000..da9c8cf Binary files /dev/null and b/testdata/sqlite/G2C.db differ