amps-python-client 5.3.4.1__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- amps-python-client-5.3.4.1/HISTORY +7 -0
- amps-python-client-5.3.4.1/LICENSE +157 -0
- amps-python-client-5.3.4.1/PKG-INFO +112 -0
- amps-python-client-5.3.4.1/README.md +96 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +32 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +27 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +43 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +231 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +1474 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +25 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +12 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +23 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +13 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +56 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +417 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +417 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +126 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +295 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +1190 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +436 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +173 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +2123 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +299 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +287 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +97 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/index.html +138 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/html/_sources/code.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/html/_sources/index.rst.txt +29 -0
- amps-python-client-5.3.4.1/docs/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/html/_static/classic.css +261 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/default.css +1 -0
- amps-python-client-5.3.4.1/docs/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/html/_static/sidebar.js +159 -0
- amps-python-client-5.3.4.1/docs/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/html/code.html +6503 -0
- amps-python-client-5.3.4.1/docs/html/genindex.html +1361 -0
- amps-python-client-5.3.4.1/docs/html/index.html +131 -0
- amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/html/py-modindex.html +111 -0
- amps-python-client-5.3.4.1/docs/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/caution.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/connection_string.svg +461 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/important.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/important.svg +25 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/tip.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/tip.svg +31 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/warning.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +482 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +128 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +142 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +876 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +434 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +292 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/index.rst.txt +44 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +447 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +92 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +156 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +2837 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +169 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +746 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +272 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +499 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +1014 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +264 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +245 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +118 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +499 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +352 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +381 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +535 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +302 -0
- amps-python-client-5.3.4.1/docs/python/html/genindex.html +351 -0
- amps-python-client-5.3.4.1/docs/python/html/index.html +380 -0
- amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/python/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/python/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +155 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +19 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/index.rst.txt +20 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +271 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +105 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +97 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +382 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/resources/custom.css +9 -0
- amps-python-client-5.3.4.1/docs/resources/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +1330 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +235 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +684 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +402 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +505 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +627 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +248 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +183 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +31 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +23 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +232 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +111 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +358 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +83 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +11 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +86 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +9 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +111 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +269 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +232 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +556 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +186 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +191 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +39 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +203 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +101 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +465 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +23 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +116 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +34 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +1398 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +326 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +312 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +27 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +49 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +1351 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +1228 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +657 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +57 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/spark.rst.txt +824 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +291 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +517 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +62 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +21 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +62 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +175 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +110 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/alabaster.css +695 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +289 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +3782 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +439 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +1552 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +1626 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +2548 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +508 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +328 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +447 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +295 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +609 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +246 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +264 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +449 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +229 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +215 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +978 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +357 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +572 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +972 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +1280 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +718 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +341 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +1515 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +934 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +1767 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +1777 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +697 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +1038 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +621 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +819 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +352 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +530 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +1013 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +288 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +133 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +1120 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +1261 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/index.html +163 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/search.html +106 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +63 -0
- amps-python-client-5.3.4.1/include/ampspy_compat.h +63 -0
- amps-python-client-5.3.4.1/include/ampspy_defs.hpp +181 -0
- amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +52 -0
- amps-python-client-5.3.4.1/include/ampspy_shims.hpp +113 -0
- amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +242 -0
- amps-python-client-5.3.4.1/include/ampspy_types.hpp +1139 -0
- amps-python-client-5.3.4.1/include/ampspyver.h +30 -0
- amps-python-client-5.3.4.1/index.html +66 -0
- amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +59 -0
- amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +63 -0
- amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +71 -0
- amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +69 -0
- amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +71 -0
- amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +67 -0
- amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +81 -0
- amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +69 -0
- amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +59 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +67 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +77 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
- amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +128 -0
- amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +123 -0
- amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +84 -0
- amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +87 -0
- amps-python-client-5.3.4.1/samples/RandomServerChooser.py +41 -0
- amps-python-client-5.3.4.1/samples/sample.xml +335 -0
- amps-python-client-5.3.4.1/setup.py +209 -0
- amps-python-client-5.3.4.1/setup_amps.py +94 -0
- amps-python-client-5.3.4.1/src/ampspy_shims.cpp +203 -0
- amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +484 -0
- amps-python-client-5.3.4.1/src/authenticator.cpp +128 -0
- amps-python-client-5.3.4.1/src/bookmarkstore.cpp +238 -0
- amps-python-client-5.3.4.1/src/client.cpp +2430 -0
- amps-python-client-5.3.4.1/src/client_docs.h +956 -0
- amps-python-client-5.3.4.1/src/cmessagehandler.cpp +151 -0
- amps-python-client-5.3.4.1/src/command.cpp +164 -0
- amps-python-client-5.3.4.1/src/command_docs.h +194 -0
- amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +111 -0
- amps-python-client-5.3.4.1/src/compositemessageparser.cpp +146 -0
- amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +194 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +677 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +542 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +214 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +719 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +370 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +460 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +1255 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +1622 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +1819 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +618 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +158 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +490 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +145 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +775 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_generated.h +46 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +204 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +78 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +210 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +8817 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +84 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +41 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +41 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +194 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +1692 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +688 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_protocol_generated.h +80 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +489 -0
- amps-python-client-5.3.4.1/src/cpp/src/atfork.c +446 -0
- amps-python-client-5.3.4.1/src/cpp/src/client.c +483 -0
- amps-python-client-5.3.4.1/src/cpp/src/makefile +92 -0
- amps-python-client-5.3.4.1/src/cpp/src/message.c +837 -0
- amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +611 -0
- amps-python-client-5.3.4.1/src/cpp/src/tcp.c +1489 -0
- amps-python-client-5.3.4.1/src/cpp/src/tcps.c +1894 -0
- amps-python-client-5.3.4.1/src/cpp/src/transports.c +123 -0
- amps-python-client-5.3.4.1/src/cpp/src/unix.c +984 -0
- amps-python-client-5.3.4.1/src/cpp/src/uri.c +301 -0
- amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +137 -0
- amps-python-client-5.3.4.1/src/failedwritehandler.cpp +116 -0
- amps-python-client-5.3.4.1/src/fixbuilder.cpp +146 -0
- amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +114 -0
- amps-python-client-5.3.4.1/src/fixshredder.cpp +105 -0
- amps-python-client-5.3.4.1/src/fixshredder_docs.h +38 -0
- amps-python-client-5.3.4.1/src/haclient.cpp +691 -0
- amps-python-client-5.3.4.1/src/haclient_docs.h +132 -0
- amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +137 -0
- amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +31 -0
- amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +373 -0
- amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +39 -0
- amps-python-client-5.3.4.1/src/memorypublishstore.cpp +160 -0
- amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +32 -0
- amps-python-client-5.3.4.1/src/message.cpp +765 -0
- amps-python-client-5.3.4.1/src/message_docs.h +306 -0
- amps-python-client-5.3.4.1/src/messagestream.cpp +623 -0
- amps-python-client-5.3.4.1/src/messagestream_docs.h +45 -0
- amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +422 -0
- amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +160 -0
- amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +33 -0
- amps-python-client-5.3.4.1/src/nvfixshredder.cpp +99 -0
- amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +39 -0
- amps-python-client-5.3.4.1/src/publishstore.cpp +183 -0
- amps-python-client-5.3.4.1/src/raw_wrapper.cpp +756 -0
- amps-python-client-5.3.4.1/src/reason.cpp +71 -0
- amps-python-client-5.3.4.1/src/recoverypoint.cpp +135 -0
- amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +171 -0
- amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +360 -0
- amps-python-client-5.3.4.1/src/serverchooser.cpp +245 -0
- amps-python-client-5.3.4.1/src/serverchooser_docs.h +39 -0
- amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +248 -0
- amps-python-client-5.3.4.1/src/store.cpp +62 -0
- amps-python-client-5.3.4.1/src/versioninfo.cpp +175 -0
|
@@ -0,0 +1,1120 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
6
|
+
<head>
|
|
7
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
8
|
+
|
|
9
|
+
<title>13. Aggregating and Analyzing Data in AMPS — AMPS User Guide develop documentation</title>
|
|
10
|
+
|
|
11
|
+
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
|
|
12
|
+
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
13
|
+
|
|
14
|
+
<script type="text/javascript">
|
|
15
|
+
var DOCUMENTATION_OPTIONS = {
|
|
16
|
+
URL_ROOT: '../',
|
|
17
|
+
VERSION: 'develop',
|
|
18
|
+
COLLAPSE_INDEX: false,
|
|
19
|
+
FILE_SUFFIX: '.html',
|
|
20
|
+
HAS_SOURCE: true,
|
|
21
|
+
SOURCELINK_SUFFIX: '.txt'
|
|
22
|
+
};
|
|
23
|
+
</script>
|
|
24
|
+
<script type="text/javascript" src="../_static/jquery.js"></script>
|
|
25
|
+
<script type="text/javascript" src="../_static/underscore.js"></script>
|
|
26
|
+
<script type="text/javascript" src="../_static/doctools.js"></script>
|
|
27
|
+
<link rel="index" title="Index" href="../genindex.html" />
|
|
28
|
+
<link rel="search" title="Search" href="../search.html" />
|
|
29
|
+
<link rel="next" title="14. Transactional Messaging and Bookmark Subscriptions" href="txlog.html" />
|
|
30
|
+
<link rel="prev" title="12. Conflated Topics" href="conflated_topics.html" />
|
|
31
|
+
|
|
32
|
+
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
|
36
|
+
|
|
37
|
+
</head>
|
|
38
|
+
<body role="document">
|
|
39
|
+
<div class="document">
|
|
40
|
+
|
|
41
|
+
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
42
|
+
<div class="sphinxsidebarwrapper">
|
|
43
|
+
<p class="logo"><a href="../index.html">
|
|
44
|
+
<img class="logo" src="../_static/flag_logo.png" alt="Logo"/>
|
|
45
|
+
</a></p>
|
|
46
|
+
<h3><a href="../index.html">Table Of Contents</a></h3>
|
|
47
|
+
<ul>
|
|
48
|
+
<li><a class="reference internal" href="#">13. Aggregating and Analyzing Data in AMPS</a><ul>
|
|
49
|
+
<li><a class="reference internal" href="#understanding-views">Understanding Views</a></li>
|
|
50
|
+
<li><a class="reference internal" href="#defining-views-and-aggregations">Defining Views and Aggregations</a><ul>
|
|
51
|
+
<li><a class="reference internal" href="#single-topic-aggregation-underlyingtopic">Single Topic Aggregation: UnderlyingTopic</a></li>
|
|
52
|
+
<li><a class="reference internal" href="#multiple-topic-aggregation-join">Multiple Topic Aggregation: Join</a></li>
|
|
53
|
+
<li><a class="reference internal" href="#setting-the-message-type">Setting the Message Type</a></li>
|
|
54
|
+
<li><a class="reference internal" href="#defining-projections">Defining Projections</a></li>
|
|
55
|
+
<li><a class="reference internal" href="#data-types-and-projections">Data Types and Projections</a></li>
|
|
56
|
+
<li><a class="reference internal" href="#grouping">Grouping</a></li>
|
|
57
|
+
<li><a class="reference internal" href="#inline-update-conflation">Inline Update Conflation</a></li>
|
|
58
|
+
<li><a class="reference internal" href="#filtering-single-topic-aggregations">Filtering Single Topic Aggregations</a></li>
|
|
59
|
+
</ul>
|
|
60
|
+
</li>
|
|
61
|
+
<li><a class="reference internal" href="#constructing-fields">Constructing Fields</a></li>
|
|
62
|
+
<li><a class="reference internal" href="#best-practices-for-views">Best Practices for Views</a></li>
|
|
63
|
+
<li><a class="reference internal" href="#examples">Examples</a><ul>
|
|
64
|
+
<li><a class="reference internal" href="#simple-aggregate-view-example">Simple Aggregate View Example</a></li>
|
|
65
|
+
<li><a class="reference internal" href="#multiple-topic-aggregate-example">Multiple Topic Aggregate Example</a></li>
|
|
66
|
+
<li><a class="reference internal" href="#view-projected-into-different-message-type">View Projected Into Different Message Type</a></li>
|
|
67
|
+
</ul>
|
|
68
|
+
</li>
|
|
69
|
+
<li><a class="reference internal" href="#aggregated-subscriptions">Aggregated Subscriptions</a><ul>
|
|
70
|
+
<li><a class="reference internal" href="#when-to-use-aggregated-subscriptions">When to Use Aggregated Subscriptions</a></li>
|
|
71
|
+
<li><a class="reference internal" href="#requesting-an-aggregated-subscription">Requesting an Aggregated Subscription</a></li>
|
|
72
|
+
<li><a class="reference internal" href="#considerations-for-aggregated-subscriptions">Considerations for Aggregated Subscriptions</a></li>
|
|
73
|
+
</ul>
|
|
74
|
+
</li>
|
|
75
|
+
</ul>
|
|
76
|
+
</li>
|
|
77
|
+
</ul>
|
|
78
|
+
<div class="relations">
|
|
79
|
+
<h3>Related Topics</h3>
|
|
80
|
+
<ul>
|
|
81
|
+
<li><a href="../index.html">Documentation overview</a><ul>
|
|
82
|
+
<li>Previous: <a href="conflated_topics.html" title="previous chapter">12. Conflated Topics</a></li>
|
|
83
|
+
<li>Next: <a href="txlog.html" title="next chapter">14. Transactional Messaging and Bookmark Subscriptions</a></li>
|
|
84
|
+
</ul></li>
|
|
85
|
+
</ul>
|
|
86
|
+
</div>
|
|
87
|
+
<div id="searchbox" style="display: none" role="search">
|
|
88
|
+
<h3>Quick search</h3>
|
|
89
|
+
<form class="search" action="../search.html" method="get">
|
|
90
|
+
<div><input type="text" name="q" /></div>
|
|
91
|
+
<div><input type="submit" value="Go" /></div>
|
|
92
|
+
<input type="hidden" name="check_keywords" value="yes" />
|
|
93
|
+
<input type="hidden" name="area" value="default" />
|
|
94
|
+
</form>
|
|
95
|
+
</div>
|
|
96
|
+
<script type="text/javascript">$('#searchbox').show(0);</script>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="documentwrapper">
|
|
100
|
+
<div class="bodywrapper">
|
|
101
|
+
<div class="body" role="main">
|
|
102
|
+
|
|
103
|
+
<span class="target" id="index-0"></span><div class="section" id="aggregating-and-analyzing-data-in-amps">
|
|
104
|
+
<span id="views"></span><span id="ug-views"></span><h1>13. Aggregating and Analyzing Data in AMPS<a class="headerlink" href="#aggregating-and-analyzing-data-in-amps" title="Permalink to this headline">¶</a></h1>
|
|
105
|
+
<p>AMPS contains a high-performance aggregation engine, which can be used
|
|
106
|
+
to project one SOW topic onto another, similar to the <code class="docutils literal"><span class="pre">CREATE</span> <span class="pre">VIEW</span></code>
|
|
107
|
+
functionality found in most RDBMS software. The aggregation engine can
|
|
108
|
+
join input from multiple topics, of the same or different message types,
|
|
109
|
+
and can produce output in different message types.</p>
|
|
110
|
+
<p>View topics are part of the AMPS SOW, which means that
|
|
111
|
+
views support delta subscriptions and out of focus (OOF) tracking. A
|
|
112
|
+
view can also be used as the underlying topic for another view.</p>
|
|
113
|
+
<p>In addition, for the limited cases where a view is not practical, AMPS
|
|
114
|
+
allows an individual subscription to request aggregation and projection
|
|
115
|
+
of a single SOW topic.</p>
|
|
116
|
+
<p>Notice that the features described in this chapter are designed for cases
|
|
117
|
+
where an application needs to aggregate data across messages or to perform
|
|
118
|
+
a calculation on an individual message that should not be preserved as a
|
|
119
|
+
part of that message.</p>
|
|
120
|
+
<p>To modify a message as it is published to AMPS, use <em>preprocessing or
|
|
121
|
+
enrichment</em>. To simply retrieve a subset of the fields in a message, use
|
|
122
|
+
<em>select lists</em>.</p>
|
|
123
|
+
<div class="section" id="understanding-views">
|
|
124
|
+
<span id="ug-views-understanding"></span><h2>Understanding Views<a class="headerlink" href="#understanding-views" title="Permalink to this headline">¶</a></h2>
|
|
125
|
+
<p>Views allow you to aggregate messages from one or more SOW topics in
|
|
126
|
+
AMPS and present the aggregation as a new SOW topic. AMPS stores the
|
|
127
|
+
contents of the view as serialized messages in memory, similar to a
|
|
128
|
+
materialized view in RDBMS software.</p>
|
|
129
|
+
<p>Views are often used to simplify subscriber implementation and can
|
|
130
|
+
reduce the network traffic to subscribers. For example, if some clients
|
|
131
|
+
will only process orders where the total cost of the order exceeds a
|
|
132
|
+
certain value, you can both simplify subscriber code and reduce network
|
|
133
|
+
traffic by creating a view that contains a calculated field for the
|
|
134
|
+
total cost. Rather than receiving all messages and calculating the cost,
|
|
135
|
+
subscribers can filter on the calculated field. You can also combine
|
|
136
|
+
information from multiple topics. For example, you could create a view
|
|
137
|
+
that contains orders from high-priority customers that exceed a certain
|
|
138
|
+
dollar amount.</p>
|
|
139
|
+
<p>AMPS sends messages to view topics the same way that AMPS sends messages
|
|
140
|
+
to SOW topics: when a publish arrives for a message that is used to
|
|
141
|
+
calculate the view, AMPS recalculates the values in the view as
|
|
142
|
+
necessary and sends a message on the view topic. Likewise,
|
|
143
|
+
you can query a view the same way that you query a SOW topic.</p>
|
|
144
|
+
<p>Defining a view is straightforward. You set the name of the view, the
|
|
145
|
+
SOW topic or topics from which messages originate and describe how you
|
|
146
|
+
want to aggregate, or project, the messages. AMPS creates a topic and
|
|
147
|
+
projects the messages as requested.</p>
|
|
148
|
+
<p>A view requires one or more underlying topics. Any topic, view,
|
|
149
|
+
or queue defined in the <code class="docutils literal"><span class="pre">SOW</span></code> section can be the underlying
|
|
150
|
+
topic for a view. However, the underlying topic for the view
|
|
151
|
+
must be defined in the AMPS configuration file before the
|
|
152
|
+
view itself is defined.</p>
|
|
153
|
+
<div class="admonition caution">
|
|
154
|
+
<p class="first admonition-title">Caution</p>
|
|
155
|
+
<p class="last">All message types that you specify in a view must support view
|
|
156
|
+
creation.</p>
|
|
157
|
+
</div>
|
|
158
|
+
<p>Since AMPS uses the SOW topics of the underlying messages to determine
|
|
159
|
+
when to update the view, the underlying topics used in a view must be
|
|
160
|
+
in the SOW. Any topic, view, conflated topic, or queue defined
|
|
161
|
+
in the <code class="docutils literal"><span class="pre">SOW</span></code> section can be the underlying topic for a view.
|
|
162
|
+
However, the underlying topic or topics must be defined in the
|
|
163
|
+
AMPS configuration file before the view is defined.</p>
|
|
164
|
+
<p>AMPS updates each view after a publish or delta publish to a message in
|
|
165
|
+
an underlying topic. Updates are processed for each view in the order in
|
|
166
|
+
which AMPS processed the updates to the underlying topic. AMPS processes
|
|
167
|
+
these updates asynchronously, after each SOW update is persisted. For
|
|
168
|
+
additional performance, AMPS provides the ability to conflate updates to
|
|
169
|
+
views that process high velocity updates, as described in
|
|
170
|
+
<a class="reference internal" href="#inlineviewconflation"><span class="std std-ref">Inline Update Conflation</span></a>.</p>
|
|
171
|
+
<p>As with a SOW topic, an incoming publish that does not change the value
|
|
172
|
+
of the underlying message or the calculated value in the view is
|
|
173
|
+
considered to be an update to the view topic. If an application
|
|
174
|
+
needs to see only changed fields, that application should use a
|
|
175
|
+
delta subscription (with the <code class="docutils literal"><span class="pre">no_empties</span></code> option).</p>
|
|
176
|
+
<div class="admonition tip">
|
|
177
|
+
<p class="first admonition-title">Tip</p>
|
|
178
|
+
<p class="last">When the underlying topic for a view is a queue,
|
|
179
|
+
the view will show only the messages in the queue
|
|
180
|
+
that are not currently leased to subscribers.</p>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="section" id="defining-views-and-aggregations">
|
|
184
|
+
<h2>Defining Views and Aggregations<a class="headerlink" href="#defining-views-and-aggregations" title="Permalink to this headline">¶</a></h2>
|
|
185
|
+
<p id="index-1">Multiple topic aggregation creates a view using more than one topic as a
|
|
186
|
+
data source. This allows you to enrich messages as they are processed by
|
|
187
|
+
AMPS, enabling aggregate calculations using information published to more
|
|
188
|
+
than one topic. You can combine messages from multiple topics and use
|
|
189
|
+
filtered subscriptions to determine which messages are of interest. For
|
|
190
|
+
example, you can set up a topic that contains orders from high-priority
|
|
191
|
+
customers.</p>
|
|
192
|
+
<p>You can join topics of different message types, and you can project
|
|
193
|
+
messages of a different type than the underlying topic.</p>
|
|
194
|
+
<p>To create an aggregate using multiple topics, each topic needs to
|
|
195
|
+
maintain a SOW. Since views maintain an underlying SOW, you can create
|
|
196
|
+
views from views.</p>
|
|
197
|
+
<p>To define an aggregate, you decide:</p>
|
|
198
|
+
<ul class="simple">
|
|
199
|
+
<li>The topic, or topics, that contain the source for the aggregation</li>
|
|
200
|
+
<li>If the aggregation uses more than one topic, how those topics relate
|
|
201
|
+
to each other</li>
|
|
202
|
+
<li>What messages to publish, or <em>project</em>, from the aggregation</li>
|
|
203
|
+
<li>How to group messages for aggregation</li>
|
|
204
|
+
<li>The message type of the aggregation</li>
|
|
205
|
+
</ul>
|
|
206
|
+
<p>Message types provided with AMPS fully support views, with the following
|
|
207
|
+
exceptions:</p>
|
|
208
|
+
<ul class="simple">
|
|
209
|
+
<li><code class="docutils literal"><span class="pre">binary</span></code> message types cannot be the underlying topic for a view or
|
|
210
|
+
the type of a view.</li>
|
|
211
|
+
<li><code class="docutils literal"><span class="pre">protobuf</span></code> message types can be the underlying topic for a view,
|
|
212
|
+
but cannot be the type of a view.</li>
|
|
213
|
+
<li><code class="docutils literal"><span class="pre">composite-global</span></code> message types can be the underlying topic for
|
|
214
|
+
a view, but cannot be the type of a view.</li>
|
|
215
|
+
<li><code class="docutils literal"><span class="pre">struct</span></code> message types can be the underlying topic for a view,
|
|
216
|
+
but cannot be the type of a view.</li>
|
|
217
|
+
</ul>
|
|
218
|
+
<p>If you are using a custom message type, check with the message type
|
|
219
|
+
developer as to whether that message type supports aggregation.</p>
|
|
220
|
+
<div class="section" id="single-topic-aggregation-underlyingtopic">
|
|
221
|
+
<h3>Single Topic Aggregation: UnderlyingTopic<a class="headerlink" href="#single-topic-aggregation-underlyingtopic" title="Permalink to this headline">¶</a></h3>
|
|
222
|
+
<p>For aggregations based on a single topic, use the <code class="docutils literal"><span class="pre">UnderlyingTopic</span></code>
|
|
223
|
+
element to tell AMPS which topic to use. All messages from the
|
|
224
|
+
<code class="docutils literal"><span class="pre">UnderlyingTopic</span></code> will appear in the aggregation.</p>
|
|
225
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><UnderlyingTopic></span>MyOriginalTopic<span class="nt"></UnderlyingTopic></span>
|
|
226
|
+
</pre></div>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
<div class="section" id="multiple-topic-aggregation-join">
|
|
230
|
+
<h3>Multiple Topic Aggregation: Join<a class="headerlink" href="#multiple-topic-aggregation-join" title="Permalink to this headline">¶</a></h3>
|
|
231
|
+
<p><code class="docutils literal"><span class="pre">Join</span></code> definitions tell AMPS how to relate underlying topics to each
|
|
232
|
+
other. You use a separate <code class="docutils literal"><span class="pre">Join</span></code> element for each relationship in the
|
|
233
|
+
view. Most often, the <code class="docutils literal"><span class="pre">Join</span></code> definition describes a relationship between
|
|
234
|
+
topics:</p>
|
|
235
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">topic</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">field</span><span class="p">]</span><span class="o">=</span><span class="p">[</span><span class="n">topic</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">field</span><span class="p">]</span>
|
|
236
|
+
</pre></div>
|
|
237
|
+
</div>
|
|
238
|
+
<p>The topics specified must be previously defined in the AMPS
|
|
239
|
+
configuration file. The square brackets <code class="docutils literal"><span class="pre">[]</span></code> are optional. If they are
|
|
240
|
+
omitted, AMPS uses the first <code class="docutils literal"><span class="pre">/</span></code> in the expression as the start of the
|
|
241
|
+
field definition. You can use any number of <code class="docutils literal"><span class="pre">Join</span></code> expressions to define a
|
|
242
|
+
multiple topic aggregation.</p>
|
|
243
|
+
<p>A <code class="docutils literal"><span class="pre">Join</span></code> definition is an equality comparison between the values of
|
|
244
|
+
two fields. The <code class="docutils literal"><span class="pre">Join</span></code> definition is not evaluated as an AMPS expression,
|
|
245
|
+
so functions, operators (other than <code class="docutils literal"><span class="pre">=</span></code>) and so forth are not evaluated
|
|
246
|
+
in these definitions.</p>
|
|
247
|
+
<p>Within a <code class="docutils literal"><span class="pre">Join</span></code> definition, values are always compared as strings.
|
|
248
|
+
This means that values such as <code class="docutils literal"><span class="pre">12345</span></code>, <code class="docutils literal"><span class="pre">12345.00</span></code>, and
|
|
249
|
+
<code class="docutils literal"><span class="pre">1.2345E+04</span></code> can be considered to be different values by the <code class="docutils literal"><span class="pre">Join</span></code>
|
|
250
|
+
expression since these are different strings, even though these strings
|
|
251
|
+
contain the same numeric value.</p>
|
|
252
|
+
<p>If your aggregation will join messages of different types, or produce
|
|
253
|
+
messages of a different type than the underlying topics, you add message
|
|
254
|
+
type specifiers to the <code class="docutils literal"><span class="pre">Join</span></code> definition:</p>
|
|
255
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">messagetype</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">topic</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">field</span><span class="p">]</span><span class="o">=</span><span class="p">[</span><span class="n">messagetype</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">topic</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="n">field</span><span class="p">]</span>
|
|
256
|
+
</pre></div>
|
|
257
|
+
</div>
|
|
258
|
+
<p>In this case, the square brackets <code class="docutils literal"><span class="pre">[]</span></code> around the <em>messagetype</em> are
|
|
259
|
+
mandatory. AMPS creates a projection in the aggregation that combines
|
|
260
|
+
the messages from each topic where the expression is true. In other
|
|
261
|
+
words, for the expression:</p>
|
|
262
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><UnderlyingTopic></span>
|
|
263
|
+
<span class="nt"><Join></span>[Orders].[/CustomerID]=[Addresses].[/CustomerID]<span class="nt"></Join></span>
|
|
264
|
+
<span class="nt"></UnderlyingTopic></span>
|
|
265
|
+
</pre></div>
|
|
266
|
+
</div>
|
|
267
|
+
<p>AMPS projects every message where the same <code class="docutils literal"><span class="pre">CustomerID</span></code> appears in
|
|
268
|
+
both the <code class="docutils literal"><span class="pre">Addresses</span></code> topic and the <code class="docutils literal"><span class="pre">Orders</span></code> topic. If a
|
|
269
|
+
<code class="docutils literal"><span class="pre">CustomerID</span></code> value appears in only the <code class="docutils literal"><span class="pre">Addresses</span></code> topic, AMPS does
|
|
270
|
+
not create a projection for the message. If a <code class="docutils literal"><span class="pre">CustomerID</span></code> value
|
|
271
|
+
appears in only the <code class="docutils literal"><span class="pre">Orders</span></code> topic, AMPS projects the message with
|
|
272
|
+
<code class="docutils literal"><span class="pre">NULL</span></code> values for the <code class="docutils literal"><span class="pre">Addresses</span></code> topic. In database terms, this is
|
|
273
|
+
equivalent to a <code class="docutils literal"><span class="pre">LEFT</span> <span class="pre">OUTER</span> <span class="pre">JOIN</span></code>.</p>
|
|
274
|
+
<div class="admonition tip">
|
|
275
|
+
<p class="first admonition-title">Tip</p>
|
|
276
|
+
<p>In a <code class="docutils literal"><span class="pre">Join</span></code> expression, AMPS does not consider <code class="docutils literal"><span class="pre">NULL</span></code> values, including
|
|
277
|
+
empty strings, to be equivalent. This behavior matches ANSI SQL behavior,
|
|
278
|
+
but differs from previous releases of AMPS.</p>
|
|
279
|
+
<p>You can disable this behavior and cause <code class="docutils literal"><span class="pre">NULL</span></code> values to match by
|
|
280
|
+
including the <code class="docutils literal"><span class="pre">JoinNullEquivalency</span></code> option in the <code class="docutils literal"><span class="pre">View</span></code> definition
|
|
281
|
+
and setting that option to <code class="docutils literal"><span class="pre">enabled</span></code>.</p>
|
|
282
|
+
<p class="last">60East does not recommend setting this option unless it is necessary
|
|
283
|
+
to preserve backward compatibility with previous versions of AMPS.</p>
|
|
284
|
+
</div>
|
|
285
|
+
<p>You can use any number of <code class="docutils literal"><span class="pre">Join</span></code> definitions in an underlying topic:</p>
|
|
286
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><Join></span>[nvfix].[Orders].[/CustomerID]=[json].[Addresses].[/CustomerID]<span class="nt"></Join></span>
|
|
287
|
+
<span class="nt"><Join></span>[nvfix].[Orders].[/ItemID]=[nvfix].[Catalog].[/ItemID]<span class="nt"></Join></span>
|
|
288
|
+
</pre></div>
|
|
289
|
+
</div>
|
|
290
|
+
<p>In this case, AMPS creates a projection that combines messages from the
|
|
291
|
+
<code class="docutils literal"><span class="pre">Orders</span></code>, <code class="docutils literal"><span class="pre">Addresses</span></code>, and <code class="docutils literal"><span class="pre">Catalog</span></code> topics for any published
|
|
292
|
+
message where matching messages are present in all three topics. Where
|
|
293
|
+
there are no matching messages in the <code class="docutils literal"><span class="pre">Catalog</span></code> and <code class="docutils literal"><span class="pre">Addresses</span></code>
|
|
294
|
+
topics, AMPS projects those values as <code class="docutils literal"><span class="pre">NULL</span></code>.</p>
|
|
295
|
+
</div>
|
|
296
|
+
<div class="section" id="setting-the-message-type">
|
|
297
|
+
<h3>Setting the Message Type<a class="headerlink" href="#setting-the-message-type" title="Permalink to this headline">¶</a></h3>
|
|
298
|
+
<p>The <code class="docutils literal"><span class="pre">MessageType</span></code> element of the definition sets the type of the
|
|
299
|
+
outgoing messages. The message type of the aggregation does not need to
|
|
300
|
+
be the same as the message type of the topics used to create the
|
|
301
|
+
aggregation. However, if the <code class="docutils literal"><span class="pre">MessageType</span></code> differs from the type of
|
|
302
|
+
the topics used to produce the aggregation, you must explicitly specify
|
|
303
|
+
the message type of the underlying topics.</p>
|
|
304
|
+
<p>For example, to produce JSON messages regardless of the types of the
|
|
305
|
+
topics in the aggregation, you would use the following element:</p>
|
|
306
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><MessageType></span>json<span class="nt"></MessageType></span>
|
|
307
|
+
</pre></div>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="section" id="defining-projections">
|
|
311
|
+
<h3>Defining Projections<a class="headerlink" href="#defining-projections" title="Permalink to this headline">¶</a></h3>
|
|
312
|
+
<p>AMPS makes available all fields from matching messages in the join
|
|
313
|
+
specification. You specify the fields that you want AMPS to project and
|
|
314
|
+
how to project them.</p>
|
|
315
|
+
<p>To tell AMPS how to project a message, you specify each field to include
|
|
316
|
+
in the projection. The specification provides a name for the projected
|
|
317
|
+
field and one or more source fields to use for the projected field. The
|
|
318
|
+
data can be projected as-is, or aggregated using one of the AMPS
|
|
319
|
+
aggregation functions, as described in
|
|
320
|
+
<a class="reference internal" href="constructing-fields.html#ug-aggregate-functions"><span class="std std-ref">Aggregate Functions</span></a>.</p>
|
|
321
|
+
<p>You refer to source fields using the XPath-like expression for the
|
|
322
|
+
field. You name projected fields by creating an XPath-like expression
|
|
323
|
+
for the new field. AMPS uses this expression to name the new field.</p>
|
|
324
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><Projection></span>
|
|
325
|
+
<span class="nt"><Field></span>[Orders].[/CustomerID]<span class="nt"></Field></span>
|
|
326
|
+
<span class="nt"><Field></span>[Addresses].[/ShippingAddress] AS /DestinationAddress<span class="nt"></Field></span>
|
|
327
|
+
<span class="nt"><Field></span>SUM([Orders].[/TotalPrice]) AS /AccountTotal<span class="nt"></Field></span>
|
|
328
|
+
<span class="nt"></Projection></span>
|
|
329
|
+
</pre></div>
|
|
330
|
+
</div>
|
|
331
|
+
<p>The sample above uses the <code class="docutils literal"><span class="pre">CustomerID</span></code> from the orders topic and the
|
|
332
|
+
shipping address for that customer from the <code class="docutils literal"><span class="pre">Addresses</span></code> topic. The
|
|
333
|
+
sample calculates the sum of all of the orders for that customer as the
|
|
334
|
+
<code class="docutils literal"><span class="pre">AccountTotal</span></code>. The sample also renames the <code class="docutils literal"><span class="pre">ShippingAddress</span></code> field
|
|
335
|
+
as <code class="docutils literal"><span class="pre">DestinationAddress</span></code> in the projected message.</p>
|
|
336
|
+
<p>For more information on constructing fields in a view, see <a class="reference internal" href="constructing-fields.html#ug-constructing-fields"><span class="std std-ref">Constructing Fields</span></a>.</p>
|
|
337
|
+
</div>
|
|
338
|
+
<div class="section" id="data-types-and-projections">
|
|
339
|
+
<h3>Data Types and Projections<a class="headerlink" href="#data-types-and-projections" title="Permalink to this headline">¶</a></h3>
|
|
340
|
+
<p>When projecting views, AMPS converts the original values into the AMPS
|
|
341
|
+
internal type system and serializes those values into a new message.
|
|
342
|
+
This approach allows AMPS to efficiently aggregate messages of different
|
|
343
|
+
types and produce predictable results. The data type of the
|
|
344
|
+
serialization is determined by the message type of the projected
|
|
345
|
+
message: the message types provided by 60East in this release project
|
|
346
|
+
the AMPS internal type.</p>
|
|
347
|
+
<p>This means that, for message types that rely on type markers to identify
|
|
348
|
+
the type (such as <code class="docutils literal"><span class="pre">bson</span></code>), the type of the field in the projected
|
|
349
|
+
message may reflect the AMPS internal type rather than the original
|
|
350
|
+
type. This conversion is typically a widening conversion for numeric
|
|
351
|
+
types (for example, input typed as a 32-bit integer will typically be
|
|
352
|
+
widened to a 64-bit integer). For other types, the most common
|
|
353
|
+
conversion is from a specific data type (such as regular expression) to
|
|
354
|
+
a string type.</p>
|
|
355
|
+
<p>A projection is evaluated as projecting a single value in the
|
|
356
|
+
AMPS type system. This means that complex or nested data types
|
|
357
|
+
are typically projected as the string equivalent. For example,
|
|
358
|
+
a nested set of XML elements could be projected as an
|
|
359
|
+
empty string (the text value of the containing element), or
|
|
360
|
+
an array could be projected as the first value in the
|
|
361
|
+
array.</p>
|
|
362
|
+
<p>If necessary, and if the destination data type supports
|
|
363
|
+
nested data structures, you can project the individual
|
|
364
|
+
fields of a complex type. For example, given a set
|
|
365
|
+
of messages like the following (in a Topic with keys
|
|
366
|
+
of <code class="docutils literal"><span class="pre">/orderId</span></code> and <code class="docutils literal"><span class="pre">/line</span></code>):</p>
|
|
367
|
+
<div class="highlight-js"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s2">"orderId"</span><span class="o">:</span><span class="mf">42</span><span class="p">,</span> <span class="s2">"line"</span><span class="o">:</span><span class="mf">1</span><span class="p">,</span> <span class="s2">"detail"</span><span class="o">:</span><span class="p">{</span><span class="s2">"product"</span><span class="o">:</span><span class="s2">"AAPL"</span><span class="p">,</span> <span class="s2">"qty"</span><span class="o">:</span><span class="mf">40</span><span class="p">}}</span>
|
|
368
|
+
|
|
369
|
+
<span class="p">{</span><span class="s2">"orderId"</span><span class="o">:</span><span class="mf">42</span><span class="p">,</span> <span class="s2">"line"</span><span class="o">:</span><span class="mf">2</span><span class="p">,</span> <span class="s2">"detail"</span><span class="o">:</span><span class="p">{</span><span class="s2">"product"</span><span class="o">:</span><span class="s2">"AAPL"</span><span class="p">,</span> <span class="s2">"qty"</span><span class="o">:</span><span class="mf">60</span><span class="p">}}</span>
|
|
370
|
+
</pre></div>
|
|
371
|
+
</div>
|
|
372
|
+
<p>You could produce summaries for each detailed product by using
|
|
373
|
+
a projection like:</p>
|
|
374
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><Projection></span>
|
|
375
|
+
<span class="nt"><Field></span>/orderId<span class="nt"></Field></span>
|
|
376
|
+
<span class="nt"><Field></span>/detail/product<span class="nt"></Field></span>
|
|
377
|
+
<span class="nt"><Field></span>SUM(/detail/qty) as /detail/qty<span class="nt"></Field></span>
|
|
378
|
+
<span class="nt"></Projection></span>
|
|
379
|
+
<span class="nt"><Grouping></span>
|
|
380
|
+
<span class="nt"><Field></span>/orderId<span class="nt"></Field></span>
|
|
381
|
+
<span class="nt"><Field></span>/detail/product<span class="nt"></Field></span>
|
|
382
|
+
<span class="nt"></Grouping></span>
|
|
383
|
+
</pre></div>
|
|
384
|
+
</div>
|
|
385
|
+
<p>For the messages above, this would produce the following
|
|
386
|
+
summary record:</p>
|
|
387
|
+
<div class="highlight-js"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s2">"detail"</span><span class="o">:</span><span class="p">{</span><span class="s2">"product"</span><span class="o">:</span><span class="s2">"AAPL"</span><span class="p">,</span><span class="s2">"qty"</span><span class="o">:</span><span class="mf">100.0</span><span class="p">},</span><span class="s2">"orderId"</span><span class="o">:</span><span class="mf">42</span><span class="p">}</span>
|
|
388
|
+
</pre></div>
|
|
389
|
+
</div>
|
|
390
|
+
<p>For details on the AMPS data types, see the section called
|
|
391
|
+
<a class="reference internal" href="amps_expressions.html#ug-expressions-data-types"><span class="std std-ref">AMPS Data Types</span></a>.</p>
|
|
392
|
+
</div>
|
|
393
|
+
<div class="section" id="grouping">
|
|
394
|
+
<h3>Grouping<a class="headerlink" href="#grouping" title="Permalink to this headline">¶</a></h3>
|
|
395
|
+
<p>Use <code class="docutils literal"><span class="pre">Grouping</span></code> statements to tell AMPS how to aggregate data across
|
|
396
|
+
messages and generate projected messages.</p>
|
|
397
|
+
<p>For example, an <code class="docutils literal"><span class="pre">Orders</span></code> topic that contains messages for incoming
|
|
398
|
+
orders could be used to calculate aggregates for each customer, or
|
|
399
|
+
aggregates for each symbol ordered. The <code class="docutils literal"><span class="pre">Grouping</span></code> statement tells AMPS
|
|
400
|
+
which way to group messages for aggregation.</p>
|
|
401
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><Grouping></span>
|
|
402
|
+
<span class="nt"><Field></span>[Orders].[/CustomerID]<span class="nt"></Field></span>
|
|
403
|
+
<span class="nt"></Grouping></span>
|
|
404
|
+
</pre></div>
|
|
405
|
+
</div>
|
|
406
|
+
<p>The sample above groups and aggregates the projected messages by
|
|
407
|
+
<code class="docutils literal"><span class="pre">CustomerId</span></code>. Since this statement tells AMPS to group by
|
|
408
|
+
<code class="docutils literal"><span class="pre">CustomerId</span></code>, AMPS projects a message for each distinct <code class="docutils literal"><span class="pre">CustomerId</span></code>
|
|
409
|
+
value. A message to the <code class="docutils literal"><span class="pre">Orders</span></code> topic will create an outgoing message
|
|
410
|
+
with data aggregated over the <code class="docutils literal"><span class="pre">CustomerId</span></code>.</p>
|
|
411
|
+
<div class="admonition tip">
|
|
412
|
+
<p class="first admonition-title">Tip</p>
|
|
413
|
+
<p class="last">Fields used in the <code class="docutils literal"><span class="pre">Grouping</span></code> element should be the fields
|
|
414
|
+
in the underlying topics.</p>
|
|
415
|
+
</div>
|
|
416
|
+
<p>Each field in the projection should either be an aggregate or be
|
|
417
|
+
specified in the <code class="docutils literal"><span class="pre">Grouping</span></code> element. Otherwise, AMPS returns the last
|
|
418
|
+
processed value for the field.</p>
|
|
419
|
+
<div class="admonition caution" id="grouping-note">
|
|
420
|
+
<p class="first admonition-title">Caution</p>
|
|
421
|
+
<p class="last">Unlike ANSI SQL, AMPS allows you to include fields in the
|
|
422
|
+
projection that are not included in the <code class="docutils literal"><span class="pre">Grouping</span></code> or used
|
|
423
|
+
within the aggregate functions. In this case, AMPS uses the value
|
|
424
|
+
present in the last message processed as the value for these fields.
|
|
425
|
+
AMPS enforces a consistent order of updates to ensure that
|
|
426
|
+
the value of the field is consistent across recovery and restart.</p>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
<div class="section" id="inline-update-conflation">
|
|
430
|
+
<span id="inlineviewconflation"></span><h3>Inline Update Conflation<a class="headerlink" href="#inline-update-conflation" title="Permalink to this headline">¶</a></h3>
|
|
431
|
+
<p>AMPS has the ability to <em>conflate</em> updates to a view. Conflation is
|
|
432
|
+
particularly useful when a view receives a high velocity of updates and
|
|
433
|
+
subscribers to the view have no need to track every update, but instead
|
|
434
|
+
want to see the current state of the view as quickly as possible. For
|
|
435
|
+
applications that have a high update rate and relatively complicated
|
|
436
|
+
view processing, inline conflation can significantly reduce the total
|
|
437
|
+
number of updates processed for the view and increase overall
|
|
438
|
+
throughput.</p>
|
|
439
|
+
<p>Inline conflation changes how AMPS manages pending updates for a view.
|
|
440
|
+
Without inline conflation enabled for a view, AMPS processes all
|
|
441
|
+
messages for a view strictly in the order in which those messages were
|
|
442
|
+
published. Even if there are multiple pending updates to the same record,
|
|
443
|
+
AMPS processes each of those messages in turn and updates the view for
|
|
444
|
+
each message.</p>
|
|
445
|
+
<p>When inline conflation is enabled and a message arrives with the same
|
|
446
|
+
<code class="docutils literal"><span class="pre">Grouping</span></code> value as a message waiting to be processed, AMPS replaces
|
|
447
|
+
the pending message with the new message, and only processes the new
|
|
448
|
+
message. Inline conflation <em>does not</em> cause AMPS to slow down the rate
|
|
449
|
+
at which AMPS processes updates for a view. AMPS continues to process
|
|
450
|
+
updates for the view as fast as possible, and makes no guarantees as to
|
|
451
|
+
the number of updates to a view produced by a given set of updates to an
|
|
452
|
+
underlying topic.</p>
|
|
453
|
+
<p>The diagram below shows a simplified representation of inline conflation
|
|
454
|
+
for a view where the underlying SOW uses the <code class="docutils literal"><span class="pre">id</span></code> field of the message as
|
|
455
|
+
the <code class="docutils literal"><span class="pre">Key</span></code>. With conflation set to <code class="docutils literal"><span class="pre">none</span></code> (the default for a view), each
|
|
456
|
+
message is added to the end of the messages waiting to be processed, whether
|
|
457
|
+
or not an update for that group is already waiting. Both updates are processed.
|
|
458
|
+
By contrast, when conflation is set to <code class="docutils literal"><span class="pre">inline</span></code>, if there is an existing
|
|
459
|
+
update waiting, the new update replaces the existing update, and only
|
|
460
|
+
the new update is processed.</p>
|
|
461
|
+
<img alt="../_images/inline_view_conflation.svg" src="../_images/inline_view_conflation.svg" /><p>Given that inline conflation replaces messages while processing is pending,
|
|
462
|
+
the following considerations apply to views that enable inline
|
|
463
|
+
conflation:</p>
|
|
464
|
+
<ul class="simple">
|
|
465
|
+
<li>Not every update to the underlying topic will produce an individual
|
|
466
|
+
update to the view: when multiple updates occur to the same record in
|
|
467
|
+
a short period of time, AMPS may only process the last update.</li>
|
|
468
|
+
<li>Updates to the view may be produced in an order different than the
|
|
469
|
+
order in which the messages were published to the underlying topic,
|
|
470
|
+
since AMPS replaces messages waiting to be processed.</li>
|
|
471
|
+
<li>The final state of the view will be exactly as if each update were
|
|
472
|
+
processed, since it will be based on the latest values in the underlying
|
|
473
|
+
topic (or topics).</li>
|
|
474
|
+
</ul>
|
|
475
|
+
<p>To enable inline conflation, add the <code class="docutils literal"><span class="pre">Conflation</span></code> element to the
|
|
476
|
+
configuration for the <code class="docutils literal"><span class="pre">View</span></code>, as shown below:</p>
|
|
477
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
478
|
+
<span class="nt"><View></span>
|
|
479
|
+
...
|
|
480
|
+
<span class="nt"><Conflation></span>inline<span class="nt"></Conflation></span>
|
|
481
|
+
...
|
|
482
|
+
<span class="nt"></View></span>
|
|
483
|
+
<span class="nt"></SOW></span>
|
|
484
|
+
</pre></div>
|
|
485
|
+
</div>
|
|
486
|
+
</div>
|
|
487
|
+
<div class="section" id="filtering-single-topic-aggregations">
|
|
488
|
+
<h3>Filtering Single Topic Aggregations<a class="headerlink" href="#filtering-single-topic-aggregations" title="Permalink to this headline">¶</a></h3>
|
|
489
|
+
<p>When a view aggregates a single topic, you can use a <code class="docutils literal"><span class="pre">Filter</span></code> element
|
|
490
|
+
in the view definition to limit the messages included in the view to
|
|
491
|
+
only those messages that match the filter. For example, to aggregate
|
|
492
|
+
only messages from an underlying topic where the <code class="docutils literal"><span class="pre">/status</span></code> is
|
|
493
|
+
complete, you could define your view as follows:</p>
|
|
494
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
495
|
+
...
|
|
496
|
+
|
|
497
|
+
<span class="nt"><Topic></span>
|
|
498
|
+
<span class="nt"><Name></span>orders<span class="nt"></Name></span>
|
|
499
|
+
<span class="nt"><MessageType></span>json<span class="nt"></MessageType></span>
|
|
500
|
+
<span class="nt"><Key></span>/orderId<span class="nt"></Key></span>
|
|
501
|
+
<span class="nt"><FileName></span>./sow/%n.sow<span class="nt"></FileName></span>
|
|
502
|
+
<span class="nt"></Topic></span>
|
|
503
|
+
<span class="nt"><View></span>
|
|
504
|
+
<span class="nt"><Name></span>CompleteByRegion<span class="nt"></Name></span>
|
|
505
|
+
<span class="nt"><UnderlyingTopic></span>orders<span class="nt"></UnderlyingTopic></span>
|
|
506
|
+
<span class="nt"><MessageType></span>json<span class="nt"></MessageType></span>
|
|
507
|
+
<span class="nt"><Projection></span>
|
|
508
|
+
<span class="nt"><Field></span>COUNT(/orderId) AS /completedOrders<span class="nt"></Field></span>
|
|
509
|
+
<span class="nt"><Field></span>/region AS /region<span class="nt"></Field></span>
|
|
510
|
+
<span class="nt"></Projection></span>
|
|
511
|
+
<span class="nt"><Grouping></span>
|
|
512
|
+
<span class="nt"><Field></span>/region<span class="nt"></Field></span>
|
|
513
|
+
<span class="nt"></Grouping></span>
|
|
514
|
+
<span class="nt"><Filter></span>/status = 'complete'<span class="nt"></Filter></span>
|
|
515
|
+
<span class="nt"></View></span>
|
|
516
|
+
|
|
517
|
+
...
|
|
518
|
+
<span class="nt"></SOW></span>
|
|
519
|
+
</pre></div>
|
|
520
|
+
</div>
|
|
521
|
+
<p>The <code class="docutils literal"><span class="pre">Filter</span></code> element is not supported for multiple topic aggregation.</p>
|
|
522
|
+
</div>
|
|
523
|
+
</div>
|
|
524
|
+
<div class="section" id="constructing-fields">
|
|
525
|
+
<h2>Constructing Fields<a class="headerlink" href="#constructing-fields" title="Permalink to this headline">¶</a></h2>
|
|
526
|
+
<p>The AMPS expression language is used to construct fields in aggregates.</p>
|
|
527
|
+
<p>The expression language is described in <a class="reference internal" href="amps_expressions.html#ug-amps-expressions"><span class="std std-ref">AMPS Expressions</span></a>, and
|
|
528
|
+
the available functions that you can use for constructing fields in a
|
|
529
|
+
view are described in <a class="reference internal" href="amps_functions.html#ug-amps-functions"><span class="std std-ref">AMPS Functions</span></a>.</p>
|
|
530
|
+
<p>Using an expression to construct a field for a view is described in
|
|
531
|
+
<a class="reference internal" href="constructing-fields.html#ug-constructing-view-fields"><span class="std std-ref">Constructing View Fields</span></a>.</p>
|
|
532
|
+
</div>
|
|
533
|
+
<div class="section" id="best-practices-for-views">
|
|
534
|
+
<h2>Best Practices for Views<a class="headerlink" href="#best-practices-for-views" title="Permalink to this headline">¶</a></h2>
|
|
535
|
+
<p>When creating a view, consider the following best practices:</p>
|
|
536
|
+
<ul>
|
|
537
|
+
<li><p class="first">AMPS must compute and serialize each field in the view. Smaller
|
|
538
|
+
numbers of views, and less expensive calculations, may provide
|
|
539
|
+
better performance.</p>
|
|
540
|
+
</li>
|
|
541
|
+
<li><p class="first">AMPS must determine the update to the view for each change
|
|
542
|
+
to an underlying topic.</p>
|
|
543
|
+
</li>
|
|
544
|
+
<li><p class="first">For views that join multiple topics, consider the amount
|
|
545
|
+
of work produced by an update to each topic in the join.
|
|
546
|
+
You can estimate this by paying attention to the number
|
|
547
|
+
of matching messages on each side of the join.</p>
|
|
548
|
+
<p>Consider a view that joins a large <code class="docutils literal"><span class="pre">orders</span></code> topic to
|
|
549
|
+
an <code class="docutils literal"><span class="pre">order_type</span></code> topic with a much smaller number of
|
|
550
|
+
messages. If, for each <code class="docutils literal"><span class="pre">order_type</span></code>, there are
|
|
551
|
+
10000 matching messages in the <code class="docutils literal"><span class="pre">orders</span></code> topic,
|
|
552
|
+
then a publish that updates a message in the <code class="docutils literal"><span class="pre">order_type</span></code>
|
|
553
|
+
topic would produce 10000 updates to a view joining these
|
|
554
|
+
two topics together. In cases like this, avoid making
|
|
555
|
+
unnecessary updates to an underlying topic with messages
|
|
556
|
+
that match a large number of messages on the other side
|
|
557
|
+
of the join. (For example, a change to update a value
|
|
558
|
+
in <code class="docutils literal"><span class="pre">order_type</span></code> would be a necessary change. Simply
|
|
559
|
+
republishing the same messages to <code class="docutils literal"><span class="pre">order_type</span></code> on
|
|
560
|
+
a periodic basis would produce a large number of updates
|
|
561
|
+
to the view without changing the results, and is more likely
|
|
562
|
+
to be unnecessary work.)</p>
|
|
563
|
+
</li>
|
|
564
|
+
<li><p class="first">If an underlying message can have frequent updates
|
|
565
|
+
and subscribers only need to receive the final state
|
|
566
|
+
of the message in the view, consider using
|
|
567
|
+
the <code class="docutils literal"><span class="pre">InlineConflation</span></code> option to allow the view
|
|
568
|
+
to avoid processing intermediate changes where possible.</p>
|
|
569
|
+
</li>
|
|
570
|
+
<li><p class="first">For topics that are the underlying topics of views,
|
|
571
|
+
avoid publishing updates that do not change the values
|
|
572
|
+
of the fields used in the view. Each update to an
|
|
573
|
+
underlying topic causes an update to the view. In
|
|
574
|
+
particular, an approach such as republishing a set
|
|
575
|
+
of lookup values every few minutes will produce a
|
|
576
|
+
large amount of work (while AMPS fully recalculates
|
|
577
|
+
the view) without a change in the results. In general,
|
|
578
|
+
unless the set of values that was republished is
|
|
579
|
+
significant, avoid republishing values to a topic
|
|
580
|
+
underlying a view.</p>
|
|
581
|
+
</li>
|
|
582
|
+
</ul>
|
|
583
|
+
</div>
|
|
584
|
+
<div class="section" id="examples">
|
|
585
|
+
<h2>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h2>
|
|
586
|
+
<p>The following sections provide examples of practical scenarios that
|
|
587
|
+
demonstrate AMPS views and how they can be used to aggregate
|
|
588
|
+
and analyze data.</p>
|
|
589
|
+
<div class="section" id="simple-aggregate-view-example">
|
|
590
|
+
<span id="ug-view-examples-simple"></span><h3>Simple Aggregate View Example<a class="headerlink" href="#simple-aggregate-view-example" title="Permalink to this headline">¶</a></h3>
|
|
591
|
+
<p>For a potential usage scenario, imagine the topic <code class="docutils literal"><span class="pre">ORDERS</span></code> which
|
|
592
|
+
includes the following NVFIX message schema:</p>
|
|
593
|
+
<table border="1" class="docutils" id="id1">
|
|
594
|
+
<caption><span class="caption-text"><em>ORDERS Table Identifiers</em></span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
|
|
595
|
+
<colgroup>
|
|
596
|
+
<col width="50%" />
|
|
597
|
+
<col width="50%" />
|
|
598
|
+
</colgroup>
|
|
599
|
+
<thead valign="bottom">
|
|
600
|
+
<tr class="row-odd"><th class="head"><strong>NVFIX
|
|
601
|
+
Tag</strong></th>
|
|
602
|
+
<th class="head"><strong>Description</strong></th>
|
|
603
|
+
</tr>
|
|
604
|
+
</thead>
|
|
605
|
+
<tbody valign="top">
|
|
606
|
+
<tr class="row-even"><td>OrderID</td>
|
|
607
|
+
<td>Unique order identifier</td>
|
|
608
|
+
</tr>
|
|
609
|
+
<tr class="row-odd"><td>Tick</td>
|
|
610
|
+
<td>Symbol</td>
|
|
611
|
+
</tr>
|
|
612
|
+
<tr class="row-even"><td>ClientId</td>
|
|
613
|
+
<td>Unique client identifier</td>
|
|
614
|
+
</tr>
|
|
615
|
+
<tr class="row-odd"><td>Shares</td>
|
|
616
|
+
<td>Currently executed shares for the chain of orders</td>
|
|
617
|
+
</tr>
|
|
618
|
+
<tr class="row-even"><td>Price</td>
|
|
619
|
+
<td>Average price for the chain of orders</td>
|
|
620
|
+
</tr>
|
|
621
|
+
</tbody>
|
|
622
|
+
</table>
|
|
623
|
+
<p>This topic includes information on the current state of executed orders,
|
|
624
|
+
but may not include all the information we want updated in real-time.
|
|
625
|
+
For example, we may want to monitor the total value of all orders
|
|
626
|
+
executed by a client at any moment. If <code class="docutils literal"><span class="pre">ORDERS</span></code> was a SQL Table within
|
|
627
|
+
an RDBMS, the “view” we would want to create would be similar to:</p>
|
|
628
|
+
<div class="highlight-sql"><div class="highlight"><pre><span></span><span class="k">CREATE</span> <span class="k">VIEW</span> <span class="n">TOTAL_VALUE</span> <span class="k">AS</span>
|
|
629
|
+
<span class="k">SELECT</span> <span class="n">ClientId</span><span class="p">,</span> <span class="k">SUM</span><span class="p">(</span><span class="n">Shares</span> <span class="o">*</span> <span class="n">Price</span><span class="p">)</span> <span class="k">AS</span> <span class="n">TotalCost</span><span class="p">,</span>
|
|
630
|
+
<span class="k">SUM</span><span class="p">(</span><span class="n">Shares</span> <span class="o">*</span> <span class="n">Price</span><span class="p">)</span><span class="o">/</span><span class="k">SUM</span><span class="p">(</span><span class="n">Shares</span><span class="p">)</span> <span class="k">AS</span> <span class="n">WeightedAveragePrice</span>
|
|
631
|
+
<span class="k">FROM</span> <span class="n">ORDERS</span>
|
|
632
|
+
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">ClientId</span>
|
|
633
|
+
</pre></div>
|
|
634
|
+
</div>
|
|
635
|
+
<p>As defined above, the <code class="docutils literal"><span class="pre">TOTAL_VALUE</span></code> view would only have two fields:</p>
|
|
636
|
+
<ol class="arabic simple">
|
|
637
|
+
<li>ClientId: the client identifier</li>
|
|
638
|
+
<li>TotalCost: the summation of current order values by client</li>
|
|
639
|
+
</ol>
|
|
640
|
+
<p>Views in AMPS are specified in the AMPS configuration file in <code class="docutils literal"><span class="pre">View</span></code>
|
|
641
|
+
sections, which are defined in the <code class="docutils literal"><span class="pre">SOW</span></code> section. The example above
|
|
642
|
+
would be defined as:</p>
|
|
643
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
644
|
+
<span class="nt"><Topic></span>
|
|
645
|
+
<span class="nt"><Name></span>ORDERS<span class="nt"></Name></span>
|
|
646
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
647
|
+
<span class="nt"><Key></span>/OrderID<span class="nt"></Key></span>
|
|
648
|
+
<span class="nt"><FileName></span>./sow/%n.sow<span class="nt"></FileName></span>
|
|
649
|
+
<span class="nt"></Topic></span>
|
|
650
|
+
<span class="nt"><View></span>
|
|
651
|
+
<span class="nt"><Name></span>TOTAL_VALUE<span class="nt"></Name></span>
|
|
652
|
+
<span class="nt"><UnderlyingTopic></span>ORDERS<span class="nt"></UnderlyingTopic></span>
|
|
653
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
654
|
+
<span class="nt"><Projection></span>
|
|
655
|
+
<span class="nt"><Field></span>/ClientId<span class="nt"></Field></span>
|
|
656
|
+
<span class="nt"><Field></span>SUM(/Shares * /Price) AS /TotalCost<span class="nt"></Field></span>
|
|
657
|
+
<span class="nt"><Field></span>SUM(/Shares * /Price) / SUM(/Shares) AS /WeightedAveragePrice<span class="nt"></Field></span>
|
|
658
|
+
<span class="nt"></Projection></span>
|
|
659
|
+
<span class="nt"><Grouping></span>
|
|
660
|
+
<span class="nt"><Field></span>/ClientId<span class="nt"></Field></span>
|
|
661
|
+
<span class="nt"></Grouping></span>
|
|
662
|
+
<span class="nt"></View></span>
|
|
663
|
+
<span class="nt"></SOW></span>
|
|
664
|
+
</pre></div>
|
|
665
|
+
</div>
|
|
666
|
+
<div class="admonition important">
|
|
667
|
+
<p class="first admonition-title">Important</p>
|
|
668
|
+
<p class="last">Views require an underlying SOW topic. See
|
|
669
|
+
<a class="reference internal" href="sow.html#ug-sow"><span class="std std-ref">State of the World (SOW)</span></a> for
|
|
670
|
+
more information on creating and configuring SOW topics.</p>
|
|
671
|
+
</div>
|
|
672
|
+
<p>The <code class="docutils literal"><span class="pre">Topic</span></code> element is the name of the new topic that is being
|
|
673
|
+
defined. This <code class="docutils literal"><span class="pre">Topic</span></code> value will be the topic that can be used by
|
|
674
|
+
clients to subscribe for future updates or perform SOW queries against.</p>
|
|
675
|
+
<p>The <code class="docutils literal"><span class="pre">UnderlyingTopic</span></code> is the SOW topic or topics that the view
|
|
676
|
+
operates on. That is, the <code class="docutils literal"><span class="pre">UnderlyingTopic</span></code> is where the view gets its
|
|
677
|
+
data from. All XPath references within the <code class="docutils literal"><span class="pre">Projection</span></code> fields are
|
|
678
|
+
references to values within this underlying SOW topic (unless they
|
|
679
|
+
appear on the right-hand side of the <code class="docutils literal"><span class="pre">AS</span></code> keyword.)</p>
|
|
680
|
+
<p>The <code class="docutils literal"><span class="pre">Projection</span></code> section is a list of 1 or more <code class="docutils literal"><span class="pre">Field</span></code> tags that
|
|
681
|
+
define what the view will contain. The field specifications can contain
|
|
682
|
+
either a raw XPath value, as in <code class="docutils literal"><span class="pre">/ClientId</span></code> above, which is a straight
|
|
683
|
+
copy of the value found in the underlying topic into the view topic using
|
|
684
|
+
the same target XPath or an expression as described in <a class="reference internal" href="constructing-fields.html#ug-constructing-view-fields"><span class="std std-ref">Constructing View Fields</span></a>.
|
|
685
|
+
In the case of <code class="docutils literal"><span class="pre">ClientId</span></code>, if we had wanted to translate the tag
|
|
686
|
+
into a different tag, such as <code class="docutils literal"><span class="pre">CID</span></code>, then we could have used the
|
|
687
|
+
<code class="docutils literal"><span class="pre">AS</span></code> keyword to do the translation as in <code class="docutils literal"><span class="pre">/ClientId</span> <span class="pre">AS</span> <span class="pre">/CID</span></code>.</p>
|
|
688
|
+
<div class="admonition tip">
|
|
689
|
+
<p class="first admonition-title">Tip</p>
|
|
690
|
+
<p class="last">Unlike ANSI SQL, AMPS allows you to include fields in the
|
|
691
|
+
<code class="docutils literal"><span class="pre">Projection</span></code> that are not included in the <code class="docutils literal"><span class="pre">Grouping</span></code> or used
|
|
692
|
+
within the aggregate functions. In this case, AMPS uses the last
|
|
693
|
+
value processed for the value of these fields. AMPS enforces a
|
|
694
|
+
consistent order of updates to ensure that the value of the
|
|
695
|
+
field is consistent across recovery and restart.</p>
|
|
696
|
+
</div>
|
|
697
|
+
<div class="admonition caution">
|
|
698
|
+
<p class="first admonition-title">Caution</p>
|
|
699
|
+
<p class="last">An unexpected 0 (zero) or null value in an aggregate field within a view
|
|
700
|
+
usually means that the value is either zero or <code class="docutils literal"><span class="pre">NaN</span></code>. Most AMPS
|
|
701
|
+
message types default to using 0 instead of <code class="docutils literal"><span class="pre">NaN</span></code>. However, any numeric
|
|
702
|
+
aggregate function will result in a <code class="docutils literal"><span class="pre">NaN</span></code> if the aggregation
|
|
703
|
+
includes a field that is not a number.</p>
|
|
704
|
+
</div>
|
|
705
|
+
<p>Finally, the <code class="docutils literal"><span class="pre">Grouping</span></code> section is a list of one or more <code class="docutils literal"><span class="pre">Field</span></code> tags
|
|
706
|
+
that define how the records in the <code class="docutils literal"><span class="pre">UnderlyingTopic</span></code> will be grouped to
|
|
707
|
+
form the records in the view. In this example, we grouped by the tag
|
|
708
|
+
holding the client identifier. However, we could have easily made this
|
|
709
|
+
the “Symbol” tag <code class="docutils literal"><span class="pre">/Tick</span></code>.</p>
|
|
710
|
+
<p>In the below example, we group by the <code class="docutils literal"><span class="pre">/ClientId</span></code> because we want to
|
|
711
|
+
count the number of orders <em>for each client</em> that have a value greater
|
|
712
|
+
than 1,000,000:</p>
|
|
713
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
714
|
+
...
|
|
715
|
+
|
|
716
|
+
<span class="nt"><View></span>
|
|
717
|
+
<span class="nt"><Name></span>NUMBER_OF_ORDERS_OVER_ONEMILL<span class="nt"></Name></span>
|
|
718
|
+
<span class="nt"><UnderlyingTopic></span>ORDERS<span class="nt"></UnderlyingTopic></span>
|
|
719
|
+
<span class="nt"><Projection></span>
|
|
720
|
+
<span class="nt"><Field></span>/ClientId<span class="nt"></Field></span>
|
|
721
|
+
<span class="nt"><Field></span><span class="cp"><![CDATA[SUM(IF(/shares * /price > 1000000, /shares * /price, NULL)) AS /AggregateValue]]></span><span class="nt"></Field></span>
|
|
722
|
+
<span class="nt"><Field></span>SUM(IF(/Shares * /Price <span class="ni">&gt;</span> 1000000, /Shares * /Price, NULL)) AS /AggregateValue2<span class="nt"></Field></span>
|
|
723
|
+
<span class="nt"></Projection></span>
|
|
724
|
+
<span class="nt"><Grouping></span>
|
|
725
|
+
<span class="nt"><Field></span>/ClientId<span class="nt"></Field></span>
|
|
726
|
+
<span class="nt"></Grouping></span>
|
|
727
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
728
|
+
<span class="nt"></View></span>
|
|
729
|
+
|
|
730
|
+
...
|
|
731
|
+
<span class="nt"></SOW></span>
|
|
732
|
+
</pre></div>
|
|
733
|
+
</div>
|
|
734
|
+
<p>Notice that the <code class="docutils literal"><span class="pre">/AggregateValue</span></code> and <code class="docutils literal"><span class="pre">/AggregateValue2</span></code> will
|
|
735
|
+
contain the same value; however <code class="docutils literal"><span class="pre">/AggregateValue</span></code> was defined using an
|
|
736
|
+
XML <code class="docutils literal"><span class="pre">CDATA</span></code> block and <code class="docutils literal"><span class="pre">/AggregateValue2</span></code> was defined using the XML
|
|
737
|
+
<code class="docutils literal"><span class="pre">></span></code> entity reference.</p>
|
|
738
|
+
<div class="admonition caution">
|
|
739
|
+
<p class="first admonition-title">Caution</p>
|
|
740
|
+
<p class="last">Since the AMPS configuration is XML, special characters in
|
|
741
|
+
projection expressions must either be escaped with XML entity
|
|
742
|
+
references or wrapped in a CDATA section.</p>
|
|
743
|
+
</div>
|
|
744
|
+
<p>Updates to underlying topics can potentially cause many more updates to
|
|
745
|
+
downstream views, which can create stress on downstream clients
|
|
746
|
+
subscribed to the view. If any underlying topic has frequent updates to
|
|
747
|
+
the same records and/or a real-time view is not required, as in a GUI,
|
|
748
|
+
then a replica of the topic may be a good solution to reduce the
|
|
749
|
+
frequency of the updates and conserve bandwidth. For more on conflated
|
|
750
|
+
topics, please see
|
|
751
|
+
<a class="reference internal" href="conflated_topics.html#ug-topic-replicas"><span class="std std-ref">Conflated Topics</span></a>.</p>
|
|
752
|
+
</div>
|
|
753
|
+
<div class="section" id="multiple-topic-aggregate-example">
|
|
754
|
+
<h3>Multiple Topic Aggregate Example<a class="headerlink" href="#multiple-topic-aggregate-example" title="Permalink to this headline">¶</a></h3>
|
|
755
|
+
<p>This example demonstrates how to create an aggregate view that uses more
|
|
756
|
+
than one topic as a data source. For a potential usage scenario, imagine
|
|
757
|
+
that another publisher provides a <code class="docutils literal"><span class="pre">COMPANIES</span></code> topic which includes the
|
|
758
|
+
following NVFIX message schema:</p>
|
|
759
|
+
<table border="1" class="docutils" id="id2">
|
|
760
|
+
<caption><span class="caption-text"><em>COMPANIES Table Identifiers</em></span><a class="headerlink" href="#id2" title="Permalink to this table">¶</a></caption>
|
|
761
|
+
<colgroup>
|
|
762
|
+
<col width="50%" />
|
|
763
|
+
<col width="50%" />
|
|
764
|
+
</colgroup>
|
|
765
|
+
<thead valign="bottom">
|
|
766
|
+
<tr class="row-odd"><th class="head"><strong>NVFIX
|
|
767
|
+
Tag</strong></th>
|
|
768
|
+
<th class="head"><strong>Description</strong></th>
|
|
769
|
+
</tr>
|
|
770
|
+
</thead>
|
|
771
|
+
<tbody valign="top">
|
|
772
|
+
<tr class="row-even"><td>CompanyId</td>
|
|
773
|
+
<td>Unique identifier for the company</td>
|
|
774
|
+
</tr>
|
|
775
|
+
<tr class="row-odd"><td>Tick</td>
|
|
776
|
+
<td>Symbol</td>
|
|
777
|
+
</tr>
|
|
778
|
+
<tr class="row-even"><td>Name</td>
|
|
779
|
+
<td>Company name</td>
|
|
780
|
+
</tr>
|
|
781
|
+
</tbody>
|
|
782
|
+
</table>
|
|
783
|
+
<p>This topic includes the name of the company, and an identifier used for
|
|
784
|
+
internal record keeping in the trading system. Using this information,
|
|
785
|
+
we want to provide a running total of orders for that company, including
|
|
786
|
+
the company name.</p>
|
|
787
|
+
<p>If <code class="docutils literal"><span class="pre">ORDERS</span></code> and <code class="docutils literal"><span class="pre">COMPANIES</span></code> were a SQL Table within an RDBMS, the
|
|
788
|
+
“view” we would want to create would be similar to:</p>
|
|
789
|
+
<div class="highlight-sql"><div class="highlight"><pre><span></span><span class="k">CREATE</span> <span class="k">VIEW</span> <span class="n">TOTAL_COMPANY_VOLUME</span> <span class="k">AS</span>
|
|
790
|
+
<span class="k">SELECT</span> <span class="n">COMPANIES</span><span class="p">.</span><span class="n">CompanyId</span><span class="p">,</span> <span class="n">COMPANIES</span><span class="p">.</span><span class="n">Tick</span><span class="p">,</span> <span class="n">COMPANIES</span><span class="p">.</span><span class="n">Name</span><span class="p">,</span> <span class="k">SUM</span><span class="p">(</span><span class="n">ORDERS</span><span class="p">.</span><span class="n">Shares</span><span class="p">)</span> <span class="k">AS</span> <span class="n">TotalVolume</span>
|
|
791
|
+
<span class="k">FROM</span> <span class="n">COMPANIES</span> <span class="k">LEFT</span> <span class="k">OUTER</span> <span class="k">JOIN</span> <span class="n">ORDERS</span>
|
|
792
|
+
<span class="k">ON</span> <span class="n">COMPANIES</span><span class="p">.</span><span class="n">Tick</span> <span class="o">=</span> <span class="n">ORDERS</span><span class="p">.</span><span class="n">Tick</span>
|
|
793
|
+
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">ORDERS</span><span class="p">.</span><span class="n">Tick</span>
|
|
794
|
+
</pre></div>
|
|
795
|
+
</div>
|
|
796
|
+
<p>As defined above, the <code class="docutils literal"><span class="pre">TOTAL_COMPANY_VOLUME</span></code> table would have four
|
|
797
|
+
columns:</p>
|
|
798
|
+
<ol class="arabic simple">
|
|
799
|
+
<li>CompanyId: the identifier for the company</li>
|
|
800
|
+
<li>Tick: The ticker symbol for the company</li>
|
|
801
|
+
<li>Name: The name of the company</li>
|
|
802
|
+
<li>TotalVolume: The total number of shares involved in orders</li>
|
|
803
|
+
</ol>
|
|
804
|
+
<p>To create this view, use the following definition in the AMPS
|
|
805
|
+
configuration file:</p>
|
|
806
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
807
|
+
<span class="nt"><Topic></span>
|
|
808
|
+
<span class="nt"><Name></span>ORDERS<span class="nt"></Name></span>
|
|
809
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
810
|
+
<span class="nt"><Key></span>/OrderID<span class="nt"></Key></span>
|
|
811
|
+
<span class="nt"><FileName></span>./sow/%n.sow<span class="nt"></FileName></span>
|
|
812
|
+
<span class="nt"></Topic></span>
|
|
813
|
+
<span class="nt"><Topic></span>
|
|
814
|
+
<span class="nt"><Name></span>COMPANIES<span class="nt"></Name></span>
|
|
815
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
816
|
+
<span class="nt"><Key></span>/CompanyId<span class="nt"></Key></span>
|
|
817
|
+
<span class="nt"><FileName></span>./sow/%n.sow<span class="nt"></FileName></span>
|
|
818
|
+
<span class="nt"></Topic></span>
|
|
819
|
+
<span class="nt"><View></span>
|
|
820
|
+
<span class="nt"><Name></span>TOTAL_COMPANY_VOLUME<span class="nt"></Name></span>
|
|
821
|
+
<span class="nt"><UnderlyingTopic></span>
|
|
822
|
+
<span class="nt"><Join></span>[ORDERS]./Tick = [COMPANIES]./Tick<span class="nt"></Join></span>
|
|
823
|
+
<span class="nt"></UnderlyingTopic></span>
|
|
824
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
825
|
+
<span class="nt"><Projection></span>
|
|
826
|
+
<span class="nt"><Field></span>[COMPANIES]./CompanyId<span class="nt"></Field></span>
|
|
827
|
+
<span class="nt"><Field></span>[COMPANIES]./Tick<span class="nt"></Field></span>
|
|
828
|
+
<span class="nt"><Field></span>[COMPANIES]./Name<span class="nt"></Field></span>
|
|
829
|
+
<span class="nt"><Field></span>SUM([ORDERS]./Shares) AS /TotalVolume<span class="nt"></Field></span>
|
|
830
|
+
<span class="nt"></Projection></span>
|
|
831
|
+
<span class="nt"><Grouping></span>
|
|
832
|
+
<span class="nt"><Field></span>[ORDERS]./Tick<span class="nt"></Field></span>
|
|
833
|
+
<span class="nt"></Grouping></span>
|
|
834
|
+
<span class="nt"></View></span>
|
|
835
|
+
<span class="nt"></SOW></span>
|
|
836
|
+
</pre></div>
|
|
837
|
+
</div>
|
|
838
|
+
<p>As with the single topic example, first define the underlying topics
|
|
839
|
+
as SOW topics. Next, the view defines the underlying topic that is the
|
|
840
|
+
source of the data. In this case, the underlying topic is a join between
|
|
841
|
+
two topics in the instance. The definition next declares the message
|
|
842
|
+
type of the projected messages. The message types that you join can be
|
|
843
|
+
different types, and the projected messages can be a different type than
|
|
844
|
+
the underlying message types. The projection uses three fields from the
|
|
845
|
+
<code class="docutils literal"><span class="pre">COMPANIES</span></code> topic and one field that is aggregated from messages in the
|
|
846
|
+
<code class="docutils literal"><span class="pre">ORDERS</span></code> topic. The projection groups results by the <code class="docutils literal"><span class="pre">Tick</span></code> symbols that
|
|
847
|
+
appear in messages in the <code class="docutils literal"><span class="pre">ORDERS</span></code> topic.</p>
|
|
848
|
+
</div>
|
|
849
|
+
<div class="section" id="view-projected-into-different-message-type">
|
|
850
|
+
<h3>View Projected Into Different Message Type<a class="headerlink" href="#view-projected-into-different-message-type" title="Permalink to this headline">¶</a></h3>
|
|
851
|
+
<p>This example shows how to project an underlying topic of one message
|
|
852
|
+
type into a topic of a different message type.</p>
|
|
853
|
+
<p>There is very little difference between this example and the single topic view
|
|
854
|
+
example - <a class="reference internal" href="#ug-view-examples-simple"><span class="std std-ref">Simple Aggregate View Example</span></a>.
|
|
855
|
+
The main difference is that, because the destination view has a different message
|
|
856
|
+
type than the underlying topic, every reference to a field from the
|
|
857
|
+
underlying topic must be fully-qualified with the message type.</p>
|
|
858
|
+
<p>As before, imagine the topic <code class="docutils literal"><span class="pre">ORDERS</span></code> which includes the following
|
|
859
|
+
NVFIX message schema:</p>
|
|
860
|
+
<table border="1" class="docutils" id="id3">
|
|
861
|
+
<caption><span class="caption-text"><em>ORDERS Table Identifiers</em></span><a class="headerlink" href="#id3" title="Permalink to this table">¶</a></caption>
|
|
862
|
+
<colgroup>
|
|
863
|
+
<col width="50%" />
|
|
864
|
+
<col width="50%" />
|
|
865
|
+
</colgroup>
|
|
866
|
+
<thead valign="bottom">
|
|
867
|
+
<tr class="row-odd"><th class="head"><strong>NVFIX
|
|
868
|
+
Tag</strong></th>
|
|
869
|
+
<th class="head"><strong>Description</strong></th>
|
|
870
|
+
</tr>
|
|
871
|
+
</thead>
|
|
872
|
+
<tbody valign="top">
|
|
873
|
+
<tr class="row-even"><td>OrderID</td>
|
|
874
|
+
<td>Unique order identifier</td>
|
|
875
|
+
</tr>
|
|
876
|
+
<tr class="row-odd"><td>Tick</td>
|
|
877
|
+
<td>Symbol</td>
|
|
878
|
+
</tr>
|
|
879
|
+
<tr class="row-even"><td>ClientId</td>
|
|
880
|
+
<td>Unique client identifier</td>
|
|
881
|
+
</tr>
|
|
882
|
+
<tr class="row-odd"><td>Shares</td>
|
|
883
|
+
<td>Currently executed shares for the chain of orders</td>
|
|
884
|
+
</tr>
|
|
885
|
+
<tr class="row-even"><td>Price</td>
|
|
886
|
+
<td>Average price for the chain of orders</td>
|
|
887
|
+
</tr>
|
|
888
|
+
</tbody>
|
|
889
|
+
</table>
|
|
890
|
+
<p>As before, we want to project the summation of current order values by
|
|
891
|
+
client. The <code class="docutils literal"><span class="pre">TOTAL_VALUE</span></code> view will have two fields:</p>
|
|
892
|
+
<ol class="arabic simple">
|
|
893
|
+
<li>ClientId: the client identifier</li>
|
|
894
|
+
<li>TotalCost: the summation of current order values by client</li>
|
|
895
|
+
</ol>
|
|
896
|
+
<p>However, in this case, we want to project the summary into a JSON
|
|
897
|
+
document. To do this we simply specify that the final view will be in
|
|
898
|
+
JSON format, and fully qualify all references to the underlying topic in
|
|
899
|
+
the view definition.</p>
|
|
900
|
+
<p>The example above would be defined as:</p>
|
|
901
|
+
<div class="highlight-xml"><div class="highlight"><pre><span></span><span class="nt"><SOW></span>
|
|
902
|
+
<span class="nt"><Topic></span>
|
|
903
|
+
<span class="nt"><Name></span>ORDERS<span class="nt"></Name></span>
|
|
904
|
+
<span class="nt"><MessageType></span>nvfix<span class="nt"></MessageType></span>
|
|
905
|
+
<span class="nt"><Key></span>/OrderID<span class="nt"></Key></span>
|
|
906
|
+
<span class="nt"><FileName></span>./sow/%n.sow<span class="nt"></FileName></span>
|
|
907
|
+
<span class="nt"></Topic></span>
|
|
908
|
+
<span class="nt"><View></span>
|
|
909
|
+
<span class="nt"><Name></span>TOTAL_VALUE<span class="nt"></Name></span>
|
|
910
|
+
<span class="nt"><UnderlyingTopic></span>[nvfix].[ORDERS]<span class="nt"></UnderlyingTopic></span>
|
|
911
|
+
<span class="nt"><MessageType></span>json<span class="nt"></MessageType></span>
|
|
912
|
+
<span class="nt"><Projection></span>
|
|
913
|
+
<span class="nt"><Field></span>[nvfix].[ORDERS]./ClientId AS /ClientId<span class="nt"></Field></span>
|
|
914
|
+
<span class="nt"><Field></span>SUM([nvfix].[ORDERS]./Shares * [nvfix].[ORDERS]./Price) AS /TotalCost<span class="nt"></Field></span>
|
|
915
|
+
<span class="nt"></Projection></span>
|
|
916
|
+
<span class="nt"><Grouping></span>
|
|
917
|
+
<span class="nt"><Field></span>[nvfix].[ORDERS]./ClientId<span class="nt"></Field></span>
|
|
918
|
+
<span class="nt"></Grouping></span>
|
|
919
|
+
<span class="nt"></View></span>
|
|
920
|
+
<span class="nt"></SOW></span>
|
|
921
|
+
</pre></div>
|
|
922
|
+
</div>
|
|
923
|
+
<p>This example uses an underlying topic in NVFIX format, computes an
|
|
924
|
+
aggregation by <code class="docutils literal"><span class="pre">ClientId</span></code>, and then produces output in JSON format.</p>
|
|
925
|
+
</div>
|
|
926
|
+
</div>
|
|
927
|
+
<div class="section" id="aggregated-subscriptions">
|
|
928
|
+
<span id="index-2"></span><h2>Aggregated Subscriptions<a class="headerlink" href="#aggregated-subscriptions" title="Permalink to this headline">¶</a></h2>
|
|
929
|
+
<p>In addition to precomputed views and aggregates, AMPS provides the
|
|
930
|
+
ability for the server to compute an aggregation for an individual
|
|
931
|
+
subscription. When an application requests an <em>aggregated subscription</em>,
|
|
932
|
+
rather than providing messages for the subscription verbatim, the AMPS
|
|
933
|
+
server will calculate the requested aggregates and produce a message
|
|
934
|
+
that contains the aggregated data.</p>
|
|
935
|
+
<p>Most of the time, AMPS applications use views to provide aggregation, as
|
|
936
|
+
described in the section <a class="reference internal" href="#ug-views-understanding"><span class="std std-ref">Understanding Views</span></a>.
|
|
937
|
+
AMPS views are shared across subscriptions, and are calculated once, when
|
|
938
|
+
a message updates a view, regardless of the number of subscribers that
|
|
939
|
+
subscribe to the view. AMPS provides aggregated subscriptions as a way to
|
|
940
|
+
do <em>ad hoc</em> aggregation in cases where a specific aggregate is only needed
|
|
941
|
+
for a short period time, will only be used by a single subscriber, or must
|
|
942
|
+
be provided before the server can be restarted with a defined view. If the
|
|
943
|
+
aggregation is frequently used, or if multiple subscribers will use the
|
|
944
|
+
aggregation, consider using a view rather than an aggregated
|
|
945
|
+
subscription.</p>
|
|
946
|
+
<p>To request an aggregated subscription, the subscriber provides a
|
|
947
|
+
definition of the fields to project and the grouping to apply with each
|
|
948
|
+
subscription. AMPS performs the aggregation and constructs the specified
|
|
949
|
+
message before delivering the message.</p>
|
|
950
|
+
<p>For example, imagine a topic in the SOW that uses the <code class="docutils literal"><span class="pre">/id</span></code> field to
|
|
951
|
+
create the SOW key. The topic contains the following messages:</p>
|
|
952
|
+
<div class="highlight-javascript"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span><span class="mf">1</span><span class="p">,</span> <span class="s2">"tickerId"</span> <span class="o">:</span> <span class="s2">"IBM"</span><span class="p">,</span> <span class="s2">"price"</span> <span class="o">:</span> <span class="mf">150.34</span> <span class="p">}</span>
|
|
953
|
+
<span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span><span class="mf">2</span><span class="p">,</span> <span class="s2">"tickerId"</span> <span class="o">:</span> <span class="s2">"IBM"</span><span class="p">,</span> <span class="s2">"price"</span> <span class="o">:</span> <span class="mf">149.76</span> <span class="p">}</span>
|
|
954
|
+
<span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span><span class="mf">3</span><span class="p">,</span> <span class="s2">"tickerId"</span> <span class="o">:</span> <span class="s2">"IBM"</span><span class="p">,</span> <span class="s2">"price"</span> <span class="o">:</span> <span class="mf">149.32</span> <span class="p">}</span>
|
|
955
|
+
<span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span><span class="mf">4</span><span class="p">,</span> <span class="s2">"tickerId"</span> <span class="o">:</span> <span class="s2">"IBM"</span><span class="p">,</span> <span class="s2">"price"</span> <span class="o">:</span> <span class="mf">151.10</span> <span class="p">}</span>
|
|
956
|
+
</pre></div>
|
|
957
|
+
</div>
|
|
958
|
+
<p>A subscriber enters a SOW query with the following options:</p>
|
|
959
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">projection</span><span class="o">=</span><span class="p">[</span><span class="n">MAX</span><span class="p">(</span><span class="o">/</span><span class="n">price</span><span class="p">)</span> <span class="n">AS</span> <span class="o">/</span><span class="nb">max</span><span class="p">,</span><span class="o">/</span><span class="n">tickerId</span> <span class="k">as</span> <span class="o">/</span><span class="n">ticker</span><span class="p">],</span><span class="n">grouping</span><span class="o">=</span><span class="p">[</span><span class="o">/</span><span class="n">tickerId</span><span class="p">]</span>
|
|
960
|
+
</pre></div>
|
|
961
|
+
</div>
|
|
962
|
+
<p>AMPS aggregates the messages in the SOW and delivers the following
|
|
963
|
+
projected record:</p>
|
|
964
|
+
<div class="highlight-javascript"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="s2">"ticker"</span> <span class="o">:</span> <span class="s2">"IBM"</span><span class="p">,</span> <span class="s2">"max"</span> <span class="o">:</span> <span class="mf">151.10</span> <span class="p">}</span>
|
|
965
|
+
</pre></div>
|
|
966
|
+
</div>
|
|
967
|
+
<p>Aggregated subscriptions are supported for commands that use the
|
|
968
|
+
SOW: <code class="docutils literal"><span class="pre">sow</span></code>, <code class="docutils literal"><span class="pre">sow_and_subscribe</span></code>, and <code class="docutils literal"><span class="pre">sow_and_delta_subscribe</span></code>. However, there
|
|
969
|
+
are limitations on some variants of the commands, as described in the following sections.</p>
|
|
970
|
+
<p>The memory consumed to maintain an aggregated subscription is counted as part of the total
|
|
971
|
+
memory for the client that submitted the subscription when considering the
|
|
972
|
+
<code class="docutils literal"><span class="pre">MessageMemoryLimit</span></code> for that client.</p>
|
|
973
|
+
<div class="section" id="when-to-use-aggregated-subscriptions">
|
|
974
|
+
<h3>When to Use Aggregated Subscriptions<a class="headerlink" href="#when-to-use-aggregated-subscriptions" title="Permalink to this headline">¶</a></h3>
|
|
975
|
+
<p>Aggregated subscriptions require AMPS to compute the aggregate for each
|
|
976
|
+
subscription individually, at the time that messages are processed for
|
|
977
|
+
the subscription. In addition, for aggregated subscriptions, the current
|
|
978
|
+
state of the aggregation is retained for each subscription.</p>
|
|
979
|
+
<p>In cases where more than one subscriber is using the same aggregation, a
|
|
980
|
+
<code class="docutils literal"><span class="pre">View</span></code> is more efficient: each record in the view is only computed
|
|
981
|
+
once, saving CPU cycles, and ongoing updates for the record are only
|
|
982
|
+
stored once, requiring less memory. Likewise, if the aggregation uses
|
|
983
|
+
more than one topic or aggregates messages of a different type than
|
|
984
|
+
the final result, you must configure a <code class="docutils literal"><span class="pre">View</span></code> on the server.</p>
|
|
985
|
+
<p>An aggregated subscription could be more appropriate than a persistent
|
|
986
|
+
view if one or more of the following is true:</p>
|
|
987
|
+
<ul class="simple">
|
|
988
|
+
<li>A subscription has <strong>unique and unpredictable aggregation needs</strong>.
|
|
989
|
+
For example, if no other subscription is computing a given
|
|
990
|
+
aggregation, and it is not possible to predict in advance the
|
|
991
|
+
aggregates to compute, then per-subscription aggregation is a good
|
|
992
|
+
solution.</li>
|
|
993
|
+
<li>The application is <strong>under development and iterating quickly</strong>. It
|
|
994
|
+
can be convenient to use aggregated subscriptions while developing
|
|
995
|
+
aggregate definitions that will be eventually provided as view
|
|
996
|
+
topics.</li>
|
|
997
|
+
<li>The persistent view is <strong>expensive and seldom needed</strong>. For
|
|
998
|
+
example, if an aggregation is memory-intensive and only needed once
|
|
999
|
+
a week at a time when the instance is otherwise lightly-used, the
|
|
1000
|
+
overall memory usage of the AMPS instance may be reduced during the
|
|
1001
|
+
rest of the week by using an aggregated subscription.</li>
|
|
1002
|
+
</ul>
|
|
1003
|
+
<p>The considerations above are general guidance to help you consider
|
|
1004
|
+
options between per-subscription aggregation and a persistent view. In
|
|
1005
|
+
general, if it is possible to use an AMPS view for a given aggregation
|
|
1006
|
+
task and that view will be frequently used, a view is often the best
|
|
1007
|
+
option. If a view cannot be used (because the aggregation is not known
|
|
1008
|
+
in advance) or the view would seldom be used, an aggregated subscription
|
|
1009
|
+
may be a better option.</p>
|
|
1010
|
+
</div>
|
|
1011
|
+
<div class="section" id="requesting-an-aggregated-subscription">
|
|
1012
|
+
<h3>Requesting an Aggregated Subscription<a class="headerlink" href="#requesting-an-aggregated-subscription" title="Permalink to this headline">¶</a></h3>
|
|
1013
|
+
<p>To request an aggregated subscription, set the following options on the
|
|
1014
|
+
subscription:</p>
|
|
1015
|
+
<table border="1" class="docutils" id="id4">
|
|
1016
|
+
<caption><span class="caption-text"><em>Aggregated subscription options</em></span><a class="headerlink" href="#id4" title="Permalink to this table">¶</a></caption>
|
|
1017
|
+
<colgroup>
|
|
1018
|
+
<col width="50%" />
|
|
1019
|
+
<col width="50%" />
|
|
1020
|
+
</colgroup>
|
|
1021
|
+
<thead valign="bottom">
|
|
1022
|
+
<tr class="row-odd"><th class="head">Option</th>
|
|
1023
|
+
<th class="head">Description</th>
|
|
1024
|
+
</tr>
|
|
1025
|
+
</thead>
|
|
1026
|
+
<tbody valign="top">
|
|
1027
|
+
<tr class="row-even"><td><code class="docutils literal"><span class="pre">projection=[field</span> <span class="pre">specifications]</span></code></td>
|
|
1028
|
+
<td><p class="first">Specifies a comma-delimited set of fields to project, within
|
|
1029
|
+
brackets. Each entry has the format described in
|
|
1030
|
+
<a class="reference internal" href="constructing-fields.html#ug-constructing-fields"><span class="std std-ref">Constructing Fields</span></a>.</p>
|
|
1031
|
+
<p>This option must contain an entry for every field in the aggregated
|
|
1032
|
+
message. If there is no entry for a field in this option, that field
|
|
1033
|
+
will not appear in the aggregated message, even if the field is in
|
|
1034
|
+
the underlying message.</p>
|
|
1035
|
+
<p>For example, to project the total value of orders for a specific
|
|
1036
|
+
item, you might take the sum of the <code class="docutils literal"><span class="pre">/price</span></code> multiplied by the
|
|
1037
|
+
<code class="docutils literal"><span class="pre">/quantity</span></code> for each item, along with the original <code class="docutils literal"><span class="pre">/description</span></code>,
|
|
1038
|
+
as follows:</p>
|
|
1039
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">projection</span><span class="o">=</span><span class="p">[</span><span class="n">SUM</span><span class="p">(</span><span class="o">/</span><span class="n">price</span> <span class="o">*</span> <span class="o">/</span><span class="n">quantity</span><span class="p">)</span> <span class="n">AS</span> <span class="o">/</span><span class="n">total</span><span class="p">,</span> <span class="o">/</span><span class="n">description</span><span class="p">]</span>
|
|
1040
|
+
</pre></div>
|
|
1041
|
+
</div>
|
|
1042
|
+
<p>When a field appears in the projection option, but is not part of a
|
|
1043
|
+
grouping clause or used in an aggregation function, the message will
|
|
1044
|
+
have the value of that field in the last message processed by AMPS.</p>
|
|
1045
|
+
<p class="last">There is no default for this option. When this option is provided, a
|
|
1046
|
+
<code class="docutils literal"><span class="pre">grouping</span></code> must also be provided.</p>
|
|
1047
|
+
</td>
|
|
1048
|
+
</tr>
|
|
1049
|
+
<tr class="row-odd"><td><code class="docutils literal"><span class="pre">grouping=[keys]</span></code></td>
|
|
1050
|
+
<td><p class="first">For an aggregated subscription, the format of this option is a
|
|
1051
|
+
comma-delimited list of XPath identifiers within brackets. For
|
|
1052
|
+
example, to aggregate entries based on their <code class="docutils literal"><span class="pre">/description</span></code>
|
|
1053
|
+
(producing one record in the aggregation for each distinct value in
|
|
1054
|
+
<code class="docutils literal"><span class="pre">/description</span></code>), you would use the following option:</p>
|
|
1055
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">grouping</span><span class="o">=</span><span class="p">[</span><span class="o">/</span><span class="n">description</span><span class="p">]</span>
|
|
1056
|
+
</pre></div>
|
|
1057
|
+
</div>
|
|
1058
|
+
<p class="last">There is no default for this option. When this option is provided, a
|
|
1059
|
+
<code class="docutils literal"><span class="pre">projection</span></code> must also be provided.</p>
|
|
1060
|
+
</td>
|
|
1061
|
+
</tr>
|
|
1062
|
+
</tbody>
|
|
1063
|
+
</table>
|
|
1064
|
+
<p>For example, to request a count, by customer, of the order records
|
|
1065
|
+
stored in a topic in the SOW, you could use the following options:</p>
|
|
1066
|
+
<div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">projection</span><span class="o">=</span><span class="p">[</span><span class="n">COUNT</span><span class="p">(</span><span class="o">/</span><span class="n">orderId</span><span class="p">)</span><span class="n">AS</span> <span class="o">/</span><span class="n">orderCount</span><span class="p">,</span> <span class="o">/</span><span class="n">customer</span> <span class="n">AS</span> <span class="o">/</span><span class="n">customer</span><span class="p">],</span><span class="n">grouping</span><span class="o">=</span><span class="p">[</span><span class="o">/</span><span class="n">customer</span><span class="p">]</span>
|
|
1067
|
+
</pre></div>
|
|
1068
|
+
</div>
|
|
1069
|
+
</div>
|
|
1070
|
+
<div class="section" id="considerations-for-aggregated-subscriptions">
|
|
1071
|
+
<h3>Considerations for Aggregated Subscriptions<a class="headerlink" href="#considerations-for-aggregated-subscriptions" title="Permalink to this headline">¶</a></h3>
|
|
1072
|
+
<p>When planning to use an aggregated subscription, the following
|
|
1073
|
+
considerations apply:</p>
|
|
1074
|
+
<ul class="simple">
|
|
1075
|
+
<li>The source of an aggregated subscription is a single topic, of
|
|
1076
|
+
the same message type as will be produced by the aggregation.
|
|
1077
|
+
The topic for the subscription must not be a regular expression.</li>
|
|
1078
|
+
<li>The topic for the subscription must be a topic in the SOW. This includes
|
|
1079
|
+
views and the SOW view of a queue.</li>
|
|
1080
|
+
<li>When subscribing to a queue, an aggregated subscription does <em>not</em>
|
|
1081
|
+
remove messages from the queue. Like a view definition with the queue
|
|
1082
|
+
as an underlying topic, an aggregated subscription browses the queue
|
|
1083
|
+
without taking messages from the queue.</li>
|
|
1084
|
+
<li>Filters for the subscription apply to the original messages, <em>not</em>
|
|
1085
|
+
the results of the projection. A filter for an aggregated
|
|
1086
|
+
subscription is equivalent to the <code class="docutils literal"><span class="pre">Filter</span></code> element in a <code class="docutils literal"><span class="pre">View</span></code>
|
|
1087
|
+
definition rather than a filter for a subscription that uses the
|
|
1088
|
+
view.</li>
|
|
1089
|
+
<li>A subscription that uses per-subscription aggregation does not
|
|
1090
|
+
support the <code class="docutils literal"><span class="pre">replace</span></code> option <strong>except</strong> for changing pagination
|
|
1091
|
+
options.</li>
|
|
1092
|
+
<li>An aggregated subscription <em>cannot</em> be a bookmark subscription. That
|
|
1093
|
+
is, replay from the transaction log does not support aggregated
|
|
1094
|
+
subscriptions.</li>
|
|
1095
|
+
<li>Select lists cannot be used with aggregated subscriptions.</li>
|
|
1096
|
+
</ul>
|
|
1097
|
+
</div>
|
|
1098
|
+
</div>
|
|
1099
|
+
</div>
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
</div>
|
|
1103
|
+
</div>
|
|
1104
|
+
</div>
|
|
1105
|
+
<div class="clearer"></div>
|
|
1106
|
+
</div>
|
|
1107
|
+
<div class="footer">
|
|
1108
|
+
©2023 60East Technologies, Inc. (version develop).
|
|
1109
|
+
|
|
1110
|
+
|
|
|
1111
|
+
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a>
|
|
1112
|
+
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a>
|
|
1113
|
+
|
|
1114
|
+
</div>
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
|
|
1118
|
+
|
|
1119
|
+
</body>
|
|
1120
|
+
</html>
|