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