kaqing 2.0.70__tar.gz → 2.0.71__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. {kaqing-2.0.70 → kaqing-2.0.71}/PKG-INFO +1 -1
  2. kaqing-2.0.71/adam/sql/sql_completer.py +72 -0
  3. kaqing-2.0.71/adam/sql/state_machine.py +444 -0
  4. kaqing-2.0.71/adam/version.py +5 -0
  5. {kaqing-2.0.70 → kaqing-2.0.71}/kaqing.egg-info/PKG-INFO +1 -1
  6. {kaqing-2.0.70 → kaqing-2.0.71}/kaqing.egg-info/SOURCES.txt +1 -0
  7. {kaqing-2.0.70 → kaqing-2.0.71}/setup.py +1 -1
  8. kaqing-2.0.70/adam/sql/sql_completer.py +0 -491
  9. kaqing-2.0.70/adam/version.py +0 -5
  10. {kaqing-2.0.70 → kaqing-2.0.71}/README +0 -0
  11. {kaqing-2.0.70 → kaqing-2.0.71}/adam/__init__.py +0 -0
  12. {kaqing-2.0.70 → kaqing-2.0.71}/adam/app_session.py +0 -0
  13. {kaqing-2.0.70 → kaqing-2.0.71}/adam/apps.py +0 -0
  14. {kaqing-2.0.70 → kaqing-2.0.71}/adam/batch.py +0 -0
  15. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/__init__.py +0 -0
  16. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/check.py +0 -0
  17. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/check_context.py +0 -0
  18. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/check_result.py +0 -0
  19. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/check_utils.py +0 -0
  20. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/compactionstats.py +0 -0
  21. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/cpu.py +0 -0
  22. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/disk.py +0 -0
  23. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/gossip.py +0 -0
  24. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/issue.py +0 -0
  25. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/memory.py +0 -0
  26. {kaqing-2.0.70 → kaqing-2.0.71}/adam/checks/status.py +0 -0
  27. {kaqing-2.0.70 → kaqing-2.0.71}/adam/cli.py +0 -0
  28. {kaqing-2.0.70 → kaqing-2.0.71}/adam/cli_group.py +0 -0
  29. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/__init__.py +0 -0
  30. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/column.py +0 -0
  31. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/columns.py +0 -0
  32. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/compactions.py +0 -0
  33. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/cpu.py +0 -0
  34. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/dir_data.py +0 -0
  35. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/dir_snapshots.py +0 -0
  36. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/gossip.py +0 -0
  37. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/host_id.py +0 -0
  38. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/memory.py +0 -0
  39. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_address.py +0 -0
  40. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_load.py +0 -0
  41. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_owns.py +0 -0
  42. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_status.py +0 -0
  43. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_tokens.py +0 -0
  44. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/node_utils.py +0 -0
  45. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/pod_name.py +0 -0
  46. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/volume_cassandra.py +0 -0
  47. {kaqing-2.0.70 → kaqing-2.0.71}/adam/columns/volume_root.py +0 -0
  48. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/__init__.py +0 -0
  49. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/alter_tables.py +0 -0
  50. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/app.py +0 -0
  51. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/app_ping.py +0 -0
  52. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/bash.py +0 -0
  53. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cd.py +0 -0
  54. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/check.py +0 -0
  55. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cli_commands.py +0 -0
  56. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/command.py +0 -0
  57. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/command_helpers.py +0 -0
  58. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/commands_utils.py +0 -0
  59. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cp.py +0 -0
  60. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cql/__init__.py +0 -0
  61. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cql/cql_completions.py +0 -0
  62. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cql/cql_table_completer.py +0 -0
  63. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cql/cql_utils.py +0 -0
  64. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/cql/cqlsh.py +0 -0
  65. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/__init__.py +0 -0
  66. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/code_start.py +0 -0
  67. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/code_stop.py +0 -0
  68. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/code_utils.py +0 -0
  69. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/deploy.py +0 -0
  70. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/deploy_frontend.py +0 -0
  71. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  72. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/deploy_pod.py +0 -0
  73. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/deploy_utils.py +0 -0
  74. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/undeploy.py +0 -0
  75. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/undeploy_frontend.py +0 -0
  76. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  77. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/deploy/undeploy_pod.py +0 -0
  78. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/__init__.py +0 -0
  79. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/describe.py +0 -0
  80. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/describe_keyspace.py +0 -0
  81. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/describe_keyspaces.py +0 -0
  82. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/describe_table.py +0 -0
  83. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/describe/describe_tables.py +0 -0
  84. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/devices.py +0 -0
  85. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/exit.py +0 -0
  86. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/help.py +0 -0
  87. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/issues.py +0 -0
  88. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/login.py +0 -0
  89. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/logs.py +0 -0
  90. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/ls.py +0 -0
  91. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/__init__.py +0 -0
  92. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/medusa.py +0 -0
  93. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/medusa_backup.py +0 -0
  94. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/medusa_restore.py +0 -0
  95. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  96. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  97. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/nodetool.py +0 -0
  98. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/nodetool_commands.py +0 -0
  99. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/param_get.py +0 -0
  100. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/param_set.py +0 -0
  101. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/__init__.py +0 -0
  102. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/postgres.py +0 -0
  103. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/postgres_ls.py +0 -0
  104. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/postgres_preview.py +0 -0
  105. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/postgres_session.py +0 -0
  106. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/postgres_utils.py +0 -0
  107. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/psql_completions.py +0 -0
  108. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/postgres/psql_table_completer.py +0 -0
  109. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/preview_table.py +0 -0
  110. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/pwd.py +0 -0
  111. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/__init__.py +0 -0
  112. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper.py +0 -0
  113. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_forward.py +0 -0
  114. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  115. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_restart.py +0 -0
  116. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_run_abort.py +0 -0
  117. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_runs.py +0 -0
  118. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  119. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  120. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  121. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  122. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_schedules.py +0 -0
  123. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_session.py +0 -0
  124. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/reaper/reaper_status.py +0 -0
  125. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/__init__.py +0 -0
  126. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/repair.py +0 -0
  127. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/repair_log.py +0 -0
  128. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/repair_run.py +0 -0
  129. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/repair_scan.py +0 -0
  130. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/repair/repair_stop.py +0 -0
  131. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/report.py +0 -0
  132. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/restart.py +0 -0
  133. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/rollout.py +0 -0
  134. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/shell.py +0 -0
  135. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/__init__.py +0 -0
  136. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show.py +0 -0
  137. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_adam.py +0 -0
  138. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_app_actions.py +0 -0
  139. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_app_id.py +0 -0
  140. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_app_queues.py +0 -0
  141. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_cassandra_status.py +0 -0
  142. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_cassandra_version.py +0 -0
  143. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_commands.py +0 -0
  144. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_login.py +0 -0
  145. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_params.py +0 -0
  146. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_processes.py +0 -0
  147. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_repairs.py +0 -0
  148. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/show/show_storage.py +0 -0
  149. {kaqing-2.0.70 → kaqing-2.0.71}/adam/commands/watch.py +0 -0
  150. {kaqing-2.0.70 → kaqing-2.0.71}/adam/config.py +0 -0
  151. {kaqing-2.0.70 → kaqing-2.0.71}/adam/embedded_apps.py +0 -0
  152. {kaqing-2.0.70 → kaqing-2.0.71}/adam/embedded_params.py +0 -0
  153. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/__init__.py +0 -0
  154. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/cassandra_clusters.py +0 -0
  155. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/cassandra_nodes.py +0 -0
  156. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/config_maps.py +0 -0
  157. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/custom_resources.py +0 -0
  158. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/deployment.py +0 -0
  159. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/ingresses.py +0 -0
  160. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/jobs.py +0 -0
  161. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/kube_context.py +0 -0
  162. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/pods.py +0 -0
  163. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/secrets.py +0 -0
  164. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/service_accounts.py +0 -0
  165. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/services.py +0 -0
  166. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/statefulsets.py +0 -0
  167. {kaqing-2.0.70 → kaqing-2.0.71}/adam/k8s_utils/volumes.py +0 -0
  168. {kaqing-2.0.70 → kaqing-2.0.71}/adam/log.py +0 -0
  169. {kaqing-2.0.70 → kaqing-2.0.71}/adam/pod_exec_result.py +0 -0
  170. {kaqing-2.0.70 → kaqing-2.0.71}/adam/repl.py +0 -0
  171. {kaqing-2.0.70 → kaqing-2.0.71}/adam/repl_commands.py +0 -0
  172. {kaqing-2.0.70 → kaqing-2.0.71}/adam/repl_session.py +0 -0
  173. {kaqing-2.0.70 → kaqing-2.0.71}/adam/repl_state.py +0 -0
  174. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sql/__init__.py +0 -0
  175. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sql/term_completer.py +0 -0
  176. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/__init__.py +0 -0
  177. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/authenticator.py +0 -0
  178. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/authn_ad.py +0 -0
  179. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/authn_okta.py +0 -0
  180. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/cred_cache.py +0 -0
  181. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/id_token.py +0 -0
  182. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/idp.py +0 -0
  183. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/idp_login.py +0 -0
  184. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/idp_session.py +0 -0
  185. {kaqing-2.0.70 → kaqing-2.0.71}/adam/sso/sso_config.py +0 -0
  186. {kaqing-2.0.70 → kaqing-2.0.71}/adam/utils.py +0 -0
  187. {kaqing-2.0.70 → kaqing-2.0.71}/kaqing.egg-info/dependency_links.txt +0 -0
  188. {kaqing-2.0.70 → kaqing-2.0.71}/kaqing.egg-info/entry_points.txt +0 -0
  189. {kaqing-2.0.70 → kaqing-2.0.71}/kaqing.egg-info/top_level.txt +0 -0
  190. {kaqing-2.0.70 → kaqing-2.0.71}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.70
3
+ Version: 2.0.71
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -0,0 +1,72 @@
1
+ from typing import Callable, Iterable
2
+ from prompt_toolkit.completion import CompleteEvent, Completer, Completion
3
+ from prompt_toolkit.document import Document
4
+ import sqlparse
5
+ from sqlparse.sql import Statement
6
+
7
+ from adam.sql.state_machine import StateMachine
8
+ from adam.sql.term_completer import TermCompleter
9
+
10
+ __all__ = [
11
+ "SqlCompleter",
12
+ ]
13
+
14
+ DML_COMPLETER = TermCompleter(['select', 'insert', 'delete', 'update'])
15
+
16
+ class SqlCompleter(Completer):
17
+ def __init__(self, tables: Callable[[], list[str]], dml: str = None, debug = False):
18
+ super().__init__()
19
+ self.dml = dml
20
+ self.tables = tables
21
+ self.debug = debug
22
+ self.machine = StateMachine(debug=self.debug)
23
+
24
+ def get_completions(
25
+ self, document: Document, complete_event: CompleteEvent
26
+ ) -> Iterable[Completion]:
27
+ text = document.text_before_cursor.lstrip()
28
+ state = ''
29
+ if self.dml:
30
+ state = f'{self.dml}_'
31
+ text = f'{self.dml} {text}'
32
+
33
+ completer: Completer = None
34
+ stmts = sqlparse.parse(text)
35
+ if not stmts:
36
+ completer = DML_COMPLETER
37
+ else:
38
+ statement: Statement = stmts[0]
39
+ state = self.machine.traverse_tokens(statement.tokens, state)
40
+ if self.debug:
41
+ print('\n =>', state)
42
+
43
+ if not state:
44
+ completer = DML_COMPLETER
45
+
46
+ if state in self.machine.suggestions:
47
+ terms = []
48
+
49
+ for word in self.machine.suggestions[state].strip(' ').split(','):
50
+ if word == 'tables':
51
+ terms.extend(self.tables())
52
+ elif word == 'single':
53
+ terms.append("'")
54
+ elif word == 'comma':
55
+ terms.append(",")
56
+ else:
57
+ terms.append(word)
58
+
59
+ if terms:
60
+ completer = TermCompleter(terms)
61
+
62
+ if completer:
63
+ for c in completer.get_completions(document, complete_event):
64
+ yield c
65
+
66
+ def completions(table_names: Callable[[], list[str]]):
67
+ return {
68
+ 'delete': SqlCompleter(table_names, 'delete'),
69
+ 'insert': SqlCompleter(table_names, 'insert'),
70
+ 'select': SqlCompleter(table_names, 'select'),
71
+ 'update': SqlCompleter(table_names, 'update'),
72
+ }
@@ -0,0 +1,444 @@
1
+ # <select_statement> ::= SELECT <select_list>
2
+ # FROM <table_expression>
3
+ # [WHERE <search_condition>]
4
+ # [<group_by_clause>]
5
+ # [<having_clause>]
6
+ # [<order_by_clause>]
7
+ # [<limit_clause>]
8
+
9
+ # <search_condition> ::= <boolean_term>
10
+ # | <search_condition> OR <boolean_term>
11
+
12
+ # <boolean_term> ::= <boolean_factor>
13
+ # | <boolean_term> AND <boolean_factor>
14
+
15
+ # <boolean_factor> ::= [NOT] <predicate>
16
+ # | ([NOT] <search_condition>)
17
+
18
+ # <predicate> ::= <comparison_predicate>
19
+ # | <between_predicate>
20
+ # | <in_predicate>
21
+ # | <like_predicate>
22
+ # | <null_predicate>
23
+ # | <exists_predicate>
24
+ # | <quantified_predicate>
25
+ # | <unique_predicate>
26
+ # | <match_predicate>
27
+ # | <overlaps_predicate>
28
+ # | <distinct_predicate>
29
+ # | <member_predicate>
30
+ # | <submultiset_predicate>
31
+ # | <set_predicate>
32
+
33
+ # <comparison_predicate> ::= <row_value_expression> <comparison_operator> <row_value_expression>
34
+ # <comparison_operator> ::= '=' | '<>' | '<' | '<=' | '>' | '>='
35
+
36
+ # <row_value_expression> ::= <value_expression>
37
+ # | (<value_expression> [ { <comma> <value_expression> }... ])
38
+
39
+ # <value_expression> ::= <numeric_value_expression>
40
+ # | <string_value_expression>
41
+ # | <datetime_value_expression>
42
+ # | <interval_value_expression>
43
+ # | <boolean_value_expression>
44
+ # | <user_defined_type_value_expression>
45
+ # | <reference_value_expression>
46
+ # | <collection_value_expression>
47
+ # | <row_value_constructor>
48
+ # | <case_expression>
49
+ # | <cast_expression>
50
+ # | <subquery>
51
+ # | NULL
52
+ # | DEFAULT
53
+ # | <identifier>
54
+ # | <literal>
55
+
56
+ # <insert_statement> ::= INSERT INTO <table_name> [ ( <column_list> ) ]
57
+ # VALUES ( <value_list> )
58
+ # | INSERT INTO <table_name> [ ( <column_list> ) ]
59
+ # <query_expression>
60
+
61
+ # <table_name> ::= <identifier>
62
+
63
+ # <column_list> ::= <column_name> [ , <column_list> ]
64
+
65
+ # <column_name> ::= <identifier>
66
+
67
+ # <value_list> ::= <expression> [ , <value_list> ]
68
+
69
+ # <query_expression> ::= SELECT <select_list> FROM <table_reference_list> [ WHERE <search_condition> ] [ GROUP BY <grouping_column_list> ] [ HAVING <search_condition> ] [ ORDER BY <sort_specification_list> ]
70
+
71
+ # <update_statement> ::= UPDATE <table_name>
72
+ # SET <set_clause_list>
73
+ # [WHERE <search_condition>]
74
+
75
+ # <set_clause_list> ::= <set_clause> { , <set_clause> }
76
+
77
+ # <set_clause> ::= <column_name> = <update_value>
78
+
79
+ # <update_value> ::= <expression> | NULL | DEFAULT
80
+
81
+ # <search_condition> ::= <boolean_expression>
82
+
83
+ # <delete_statement> ::= DELETE FROM <table_name> [ WHERE <search_condition> ]
84
+
85
+ # <table_name> ::= <identifier>
86
+
87
+ # <search_condition> ::= <boolean_expression>
88
+
89
+ # <boolean_expression> ::= <predicate>
90
+ # | <boolean_expression> AND <predicate>
91
+ # | <boolean_expression> OR <predicate>
92
+ # | NOT <predicate>
93
+ # | ( <boolean_expression> )
94
+
95
+ # <predicate> ::= <expression> <comparison_operator> <expression>
96
+ # | <expression> IS NULL
97
+ # | <expression> IS NOT NULL
98
+ # | <expression> LIKE <pattern> [ ESCAPE <escape_character> ]
99
+ # | <expression> IN ( <expression_list> )
100
+ # | EXISTS ( <select_statement> )
101
+ # | ... (other predicates)
102
+
103
+ # <comparison_operator> ::= = | <> | != | > | < | >= | <=
104
+
105
+ # <expression> ::= <literal>
106
+ # | <column_name>
107
+ # | <function_call>
108
+ # | ( <expression> )
109
+ # | <expression> <arithmetic_operator> <expression>
110
+ # | ... (other expressions)
111
+
112
+ # <literal> ::= <numeric_literal> | <string_literal> | <boolean_literal> | <date_literal> | ...
113
+
114
+ # <column_name> ::= <identifier>
115
+
116
+ # <identifier> ::= <letter> { <letter> | <digit> | _ }...
117
+
118
+ # <pattern> ::= <string_literal>
119
+
120
+ # <escape_character> ::= <string_literal> (single character)
121
+
122
+ # <expression_list> ::= <expression> { , <expression> }...
123
+
124
+ from sqlparse.sql import Token
125
+ from sqlparse import tokens as T
126
+
127
+ __all__ = [
128
+ "StateMachine",
129
+ ]
130
+
131
+ SPEC = [
132
+ ' > select > select',
133
+ 'select_ > name|* > select_a ^ *',
134
+ 'select_a > , > select_a_comma_',
135
+ 'select_a_comma_ > name|* > select_a ^ *',
136
+ 'select_a_ > from > select_from ^ from',
137
+ 'select_from_ > name > select_from_x ^ (select,tables',
138
+ '- > { > select_from_x_lp_',
139
+ 'select_from_x_lp_ > select > select',
140
+ 'select_from_x > , > select_from_x_comma_',
141
+ '- > } > select_from_x_rp_',
142
+ '- > ] > select_from_x_rb_',
143
+ 'select_from_x_rp__ > as > select_from_x_as ^ as',
144
+ 'select_from_x_rb__ > and|or > select_where_ ^ and,or,group by,limit',
145
+ '- > group > select_group',
146
+ '- > group by > select_group_by',
147
+ '- > limit > select_where_sc_limit',
148
+ 'select_from_x_comma_ > name > select_from_x ^ tables',
149
+ 'select_from_x_ ^ as,where,inner join,left outer join,right outer join,full outer join,group by,limit',
150
+ 'select_from_x_as_x_ > , > select_from_x_comma_ ^ where,inner join,left outer join,right outer join,full outer join,group by,limit',
151
+ '- > as > select_from_x_as',
152
+ '- > where > select_where',
153
+ '- > limit > select_where_sc_limit',
154
+ '- > group > select_group',
155
+ '- > group by > select_group_by',
156
+ '- > inner > select_from_x_inner',
157
+ '- > inner join > select_join',
158
+ '- > left > select_from_x_left',
159
+ '- > left join > select_join',
160
+ '- > left outer join > select_join',
161
+ '- > right > select_from_x_right',
162
+ '- > right join > select_join',
163
+ '- > right outer join > select_join',
164
+ '- > full > select_from_x_full',
165
+ '- > full outer join > select_join',
166
+ 'select_from_x_as_ > name > select_from_x_as_x ^ x,y,z',
167
+ 'select_from_x_as_x > , > select_from_x_as_x_comma_',
168
+ '- > } > select_where_sc_re_',
169
+ 'select_from_x_as_x_comma_ > name > select_from_x ^ tables',
170
+ 'select_where_ > name > select_where_a ^ id,x.,y.,z.',
171
+ 'select_where_a > comparison > select_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
172
+ 'select_where_a_ > comparison > select_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
173
+ '- > not > select_where_a_not',
174
+ '- > in > select_where_a_in',
175
+ 'select_where_a_not_ > comparison > select_where_a_not_op ^ like,in',
176
+ '- > in > select_where_a_in',
177
+ 'select_where_a_in > [ > select_where_a_in_lp_ ^ (',
178
+ 'select_where_a_in_lp_ > name|single|num > select_where_a_in_lp_a ^ single,select',
179
+ '- > select > select_where_a_in_lp_select',
180
+ 'select_where_a_in_lp_select_ > name > select_a ^ id',
181
+ 'select_where_a_in_lp_a > , > select_where_a_in_lp_a_comma_ ^ comma,)',
182
+ '- > ] > select_where_sc',
183
+ 'select_where_a_in_lp_a_comma_ > name|single|num > select_where_a_in_lp_a ^ single',
184
+ 'select_where_a_not_op > name|single|num > select_where_sc ^ single',
185
+ 'select_where_a_op > name|single|num > select_where_sc ^ single',
186
+ 'select_where_sc > ) > select_where_sc_rp_',
187
+ 'select_where_sc > } > select_where_sc_re_',
188
+ 'select_where_sc_re__ > as > select_from_x_as ^ as',
189
+ 'select_where_sc_rp_ > } > select_where_sc_re_',
190
+ 'select_where_sc_rp__ > as > select_from_x_as ^ and,or,group by,limit',
191
+ '- > and|or > select_where',
192
+ '- > group > select_group',
193
+ '- > group by > select_group_by',
194
+ '- > limit > select_where_sc_limit',
195
+ '- > } > select_where_sc_re_',
196
+ 'select_where_sc_ > and|or > select_where ^ and,or,group by,limit',
197
+ '- > group > select_group',
198
+ '- > group by > select_group_by',
199
+ '- > limit > select_where_sc_limit',
200
+ 'select_group_ > by > select_group_by ^ by',
201
+ 'select_group_by_ > name > select_group_by_a ^ id,x.,y.,z.',
202
+ 'select_group_by_a > , > select_group_by_a_comma_',
203
+ '- > } > select_where_sc_re_',
204
+ 'select_group_by_a_comma_ > name > select_group_by_a ^ id,x.,y.,z.',
205
+ 'select_group_by_a_ > limit > select_where_sc_limit ^ limit',
206
+ 'select_where_sc_limit_ > num > select_where_sc_limit_num ^ 1',
207
+ 'select_where_sc_limit_num > ) > select_where_sc_limit_num_rp_',
208
+ 'select_where_sc_limit_num_rp__ > as > select_from_x_as ^ as',
209
+ 'select_where_x_inner_ > join > select_join',
210
+ 'select_join_ > name > select_x_join_y ^ tables',
211
+ 'select_from_x_left_ > join > select_join ^ outer join',
212
+ '- > outer > select_from_x_left_outer',
213
+ 'select_from_x_left_outer_ > join > select_join ^ join',
214
+ 'select_from_x_right_ > join > select_join ^ outer join',
215
+ '- > outer > select_from_x_right_outer',
216
+ 'select_from_x_right_outer_ > join > select_join ^ join',
217
+ 'select_from_x_full_ > join > select_join ^ outer join',
218
+ '- > outer > select_from_x_full_outer',
219
+ 'select_from_x_full_outer_ > join > select_join ^ join',
220
+ 'select_x_join_y_ > as > select_x_join_y_as ^ as,on',
221
+ '- > on > select_x_join_y_on ^ as,on',
222
+ 'select_x_join_y_as_ > name > select_x_join_y_as_y ^ x,y,z',
223
+ 'select_x_join_y_as_y_ > on > select_x_join_y_on ^ on',
224
+ 'select_x_join_y_on_ > name > select_x_join_y_on_a ^ id,x.,y.,z.',
225
+ 'select_x_join_y_on_a > comparison > select_x_join_y_on_a_op ^ =',
226
+ 'select_x_join_y_on_a_op > name > select_x_join_y_on_a_op_b ^ id,x.,y.,z.',
227
+ 'select_x_join_y_on_a_op_b > _ > select_from_x_as_x_',
228
+ '- > } > select_where_sc_re_',
229
+
230
+
231
+ ' > insert > insert',
232
+ 'insert_ > into > insert_into ^ into',
233
+ 'insert_into_ > name > insert_into_x ^ tables',
234
+ 'insert_into_x > ( > insert_into_x_lp_',
235
+ 'insert_into_x_ > ( > insert_into_x_lp_ ^ (,values(',
236
+ '- > values > insert_values',
237
+ 'insert_into_x_lp_ > name > insert_into_x_lp_a ^ id',
238
+ 'insert_into_x_lp_a > , > insert_into_x_lp_a_comma_',
239
+ '- > ) > insert_into_x_lp_a_rp_',
240
+ 'insert_into_x_lp_a_comma_ > name > insert_into_x_lp_a ^ id',
241
+ 'insert_into_x_lp_a_rp__ > values > insert_values ^ values(,select',
242
+ '- > select > select',
243
+ 'insert_values > ( > insert_values_lp_',
244
+ 'insert_values_lp_ > name|single|num > insert_values_lp_v ^ single',
245
+ 'insert_values_lp_v > , > insert_values_lp_v_comma_',
246
+ 'insert_values_lp_v_comma_ > name|single|num > insert_values_lp_v',
247
+
248
+
249
+ ' > update > update',
250
+ 'update_ > name > update_x ^ tables',
251
+ 'update_x_ > set > update_set ^ set',
252
+ 'update_set_ > name > update_set_a ^ id',
253
+ 'update_set_a > comparison > update_set_a_op',
254
+ 'update_set_a_op > name|single|num > update_set_sc ^ single',
255
+ 'update_set_sc > , > update_set_sc_comma_',
256
+ 'update_set_sc_comma_ > name > update_set_a ^ id',
257
+ 'update_set_sc_ > , > update_set_sc_comma_ ^ where',
258
+ '- > where > update_where',
259
+ 'update_where_ > name > update_where_a ^ id',
260
+ 'update_where_a > comparison > update_where_a_op',
261
+ 'update_where_a_ > comparison > update_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
262
+ '- > not > update_where_a_not',
263
+ '- > in > update_where_a_in',
264
+ 'update_where_a_not_ > comparison > update_where_a_not_op ^ like,in',
265
+ '- > in > update_where_a_in',
266
+ 'update_where_a_in > ( > update_where_a_in_lp_ ^ (',
267
+ 'update_where_a_in_lp_ > name|single|num > update_where_a_in_lp_a ^ single,select',
268
+ '- > select > update_where_a_in_lp_select',
269
+ 'update_where_a_in_lp_select_ > name > select_a ^ id',
270
+ 'update_where_a_in_lp_a > , > update_where_a_in_lp_a_comma_ ^ comma,)',
271
+ '- > ) > update_where_sc',
272
+ 'update_where_a_in_lp_a_comma_ > name|single|num > update_where_a_in_lp_a ^ single',
273
+ 'update_where_a_not_op > name|single|num > update_where_sc ^ single',
274
+ 'update_where_a_op > name|single|num > update_where_sc ^ single',
275
+ 'update_where_sc_ > and|or > update_where ^ and,or',
276
+
277
+
278
+ ' > delete > delete',
279
+ 'delete_ > from > delete_from ^ from',
280
+ 'delete_from_ > name > delete_from_x ^ tables',
281
+ 'delete_from_x_ > where > update_where ^ where',
282
+ ]
283
+
284
+ KEYWORDS = [
285
+ 'select', 'from', 'as', 'not', 'in', 'where',
286
+ 'and', 'or', 'group', 'by', 'group by', 'limit',
287
+ 'inner join', 'on', 'left', 'right', 'full', 'outer', 'left outer join',
288
+ 'left join', 'right outer join', 'right join', 'full join', 'full outer join',
289
+
290
+ 'insert', 'into', 'values',
291
+
292
+ 'update', 'where', 'set',
293
+
294
+ 'delete'
295
+ ]
296
+
297
+ class StateMachine:
298
+ def __init__(self, indent=0, lp_level = 0, le_levels_to_match: set = set(), lb_levels_to_match: set = set(), debug = False):
299
+ self.states: dict[str, str] = {}
300
+ self.suggestions: dict[str, str] = {}
301
+
302
+ def add_whitespace_transition(from_s: str):
303
+ # add whitespace transition if a state with trailing whitespace is found from from states, for example, select > _ > select_
304
+ if from_s.endswith('_') and not from_s.endswith('_comma_') and not from_s.endswith('_lp_') and not from_s.endswith('_rp_'):
305
+ if self.debug:
306
+ print(f'{from_s[:-1]} > _ = {to_s}')
307
+ self.states[f'{from_s[:-1]} > _'] = from_s
308
+
309
+ self.indent = indent
310
+ self.lp_level = lp_level
311
+ self.le_levels_to_match = le_levels_to_match
312
+ self.lb_levels_to_match = lb_levels_to_match
313
+ self.debug = debug
314
+
315
+ from_ss_to_add = []
316
+ from_ss = ['']
317
+ token = None
318
+ tokens = []
319
+ to_s = None
320
+ words: str = None
321
+ for l in SPEC:
322
+ t_and_w = l.split('^')
323
+ if len(t_and_w) > 1:
324
+ words = t_and_w[1]
325
+ else:
326
+ words = None
327
+
328
+ tks = t_and_w[0].strip(' ').split('>')
329
+ if l.startswith('-'):
330
+ token = tks[1].strip(' ')
331
+ if len(tks) > 2:
332
+ to_s = tks[2].strip(' ')
333
+ for from_s in from_ss:
334
+ tokens = [token]
335
+ if '|' in token:
336
+ tokens = token.strip(' ').split('|')
337
+
338
+ for t in tokens:
339
+ if self.debug:
340
+ print(f'{from_s} > {t} = {to_s}')
341
+ self.states[f'{from_s} > {t}'] = to_s
342
+ else:
343
+ if words:
344
+ self.suggestions[tks[0].strip(' ')] = words
345
+
346
+ if len(tks) == 1:
347
+ from_s = tks[0].strip(' ')
348
+ add_whitespace_transition(from_s)
349
+ from_ss_to_add.append(f'{from_s}')
350
+ continue
351
+
352
+ from_ss = []
353
+ from_ss.extend(from_ss_to_add)
354
+ from_ss_to_add = []
355
+ from_ss.append(tks[0].strip(' '))
356
+ for from_s in from_ss:
357
+ add_whitespace_transition(from_s)
358
+ token = tks[1].strip(' ')
359
+ tokens = [token]
360
+ if len(tks) > 2:
361
+ to_s = tks[2].strip(' ')
362
+
363
+ if '|' in token:
364
+ tokens = token.split('|')
365
+
366
+ for t in tokens:
367
+ if self.debug:
368
+ print(f'{from_s} > {t} = {to_s}')
369
+ self.states[f'{from_s} > {t}'] = to_s
370
+
371
+ def traverse_tokens(self, tokens: list[Token], state: str = ''):
372
+ def is_opening_embrace():
373
+ if f'{state} > ' + '{' in self.states:
374
+ self.le_levels_to_match.add(self.lp_level)
375
+ return '{'
376
+ elif f'{state} > ' + '[' in self.states:
377
+ self.lb_levels_to_match.add(self.lp_level)
378
+ return '['
379
+
380
+ return '('
381
+
382
+ def is_closing_embrace():
383
+ if f'{state} > ' + '}' in self.states and self.lp_level in self.le_levels_to_match:
384
+ self.le_levels_to_match.remove(self.lp_level)
385
+ return '}'
386
+ elif f'{state} > ' + ']' in self.states and self.lp_level in self.lb_levels_to_match:
387
+ self.lb_levels_to_match.remove(self.lp_level)
388
+ return ']'
389
+
390
+ return ')'
391
+
392
+ for token in tokens:
393
+ if self.debug:
394
+ if token.ttype == T.Whitespace:
395
+ print('_ ', end='')
396
+ elif token.ttype in [T.DML, T.Wildcard, T.Punctuation]:
397
+ print(f'{token.value} ', end='')
398
+ elif token.ttype:
399
+ tks = str(token.ttype).split('.')
400
+ typ = tks[len(tks) - 1]
401
+ if ' ' in token.value:
402
+ print(f'"{token.value}:{typ}" ', end='')
403
+ else:
404
+ print(f'{token.value}:{typ} ', end='')
405
+ # print(" " * self.indent + f"Token: {token.value}, Type: {token.ttype}@{token.ttype.__class__}")
406
+
407
+ if token.is_group:
408
+ state = self.traverse_tokens(token.tokens, state)
409
+ else:
410
+ it = ''
411
+ if (t := token.value.lower()) in KEYWORDS:
412
+ it = t
413
+ elif token.ttype == T.Text.Whitespace:
414
+ it = '_'
415
+ elif token.ttype == T.Name:
416
+ it = 'name'
417
+ elif token.ttype == T.Literal.String.Single:
418
+ it = 'single'
419
+ elif token.ttype in [T.Literal.Number.Integer, T.Literal.Number.Float]:
420
+ it = 'num'
421
+ elif token.ttype == T.Wildcard:
422
+ it = '*'
423
+ elif token.ttype == T.Punctuation:
424
+ if token.value == ',':
425
+ it = ','
426
+ elif token.value == '(':
427
+ it = is_opening_embrace()
428
+ self.lp_level += 1
429
+ elif token.value == ')':
430
+ self.lp_level -= 1
431
+ it = is_closing_embrace()
432
+
433
+ elif token.ttype == T.Operator.Comparison:
434
+ it = 'comparison'
435
+
436
+ try:
437
+ # print(f'{state} > {it} > ', end='')
438
+ state = self.states[f'{state} > {it}']
439
+ # print(state)
440
+ except:
441
+ pass
442
+ # print('error')
443
+
444
+ return state
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.71" #: the working version
5
+ __release__ = "1.0.0" #: the release version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.70
3
+ Version: 2.0.71
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -167,6 +167,7 @@ adam/k8s_utils/statefulsets.py
167
167
  adam/k8s_utils/volumes.py
168
168
  adam/sql/__init__.py
169
169
  adam/sql/sql_completer.py
170
+ adam/sql/state_machine.py
170
171
  adam/sql/term_completer.py
171
172
  adam/sso/__init__.py
172
173
  adam/sso/authenticator.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='kaqing',
5
- version='2.0.70',
5
+ version='2.0.71',
6
6
  packages=find_packages(),
7
7
  entry_points={
8
8
  'console_scripts': [