parse_tree.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package influxql
  2. import (
  3. "fmt"
  4. )
  5. var Language = &ParseTree{}
  6. type ParseTree struct {
  7. Handlers map[Token]func(*Parser) (Statement, error)
  8. Tokens map[Token]*ParseTree
  9. Keys []string
  10. }
  11. // With passes the current parse tree to a function to allow nested functions.
  12. func (t *ParseTree) With(fn func(*ParseTree)) {
  13. fn(t)
  14. }
  15. // Group groups together a set of related handlers with a common token prefix.
  16. func (t *ParseTree) Group(tokens ...Token) *ParseTree {
  17. for _, tok := range tokens {
  18. // Look for the parse tree for this token.
  19. if subtree := t.Tokens[tok]; subtree != nil {
  20. t = subtree
  21. continue
  22. }
  23. // No subtree exists yet. Verify that we don't have a conflicting
  24. // statement.
  25. if _, conflict := t.Handlers[tok]; conflict {
  26. panic(fmt.Sprintf("conflict for token %s", tok))
  27. }
  28. // Create the new parse tree and register it inside of this one for
  29. // later reference.
  30. newT := &ParseTree{}
  31. if t.Tokens == nil {
  32. t.Tokens = make(map[Token]*ParseTree)
  33. }
  34. t.Tokens[tok] = newT
  35. t.Keys = append(t.Keys, tok.String())
  36. t = newT
  37. }
  38. return t
  39. }
  40. // Handle registers a handler to be invoked when seeing the given token.
  41. func (t *ParseTree) Handle(tok Token, fn func(*Parser) (Statement, error)) {
  42. // Verify that there is no conflict for this token in this parse tree.
  43. if _, conflict := t.Tokens[tok]; conflict {
  44. panic(fmt.Sprintf("conflict for token %s", tok))
  45. }
  46. if _, conflict := t.Handlers[tok]; conflict {
  47. panic(fmt.Sprintf("conflict for token %s", tok))
  48. }
  49. if t.Handlers == nil {
  50. t.Handlers = make(map[Token]func(*Parser) (Statement, error))
  51. }
  52. t.Handlers[tok] = fn
  53. t.Keys = append(t.Keys, tok.String())
  54. }
  55. // Parse parses a statement using the language defined in the parse tree.
  56. func (t *ParseTree) Parse(p *Parser) (Statement, error) {
  57. for {
  58. tok, pos, lit := p.ScanIgnoreWhitespace()
  59. if subtree := t.Tokens[tok]; subtree != nil {
  60. t = subtree
  61. continue
  62. }
  63. if stmt := t.Handlers[tok]; stmt != nil {
  64. return stmt(p)
  65. }
  66. // There were no registered handlers. Return the valid tokens in the order they were added.
  67. return nil, newParseError(tokstr(tok, lit), t.Keys, pos)
  68. }
  69. }
  70. func (t *ParseTree) Clone() *ParseTree {
  71. newT := &ParseTree{}
  72. if t.Handlers != nil {
  73. newT.Handlers = make(map[Token]func(*Parser) (Statement, error), len(t.Handlers))
  74. for tok, handler := range t.Handlers {
  75. newT.Handlers[tok] = handler
  76. }
  77. }
  78. if t.Tokens != nil {
  79. newT.Tokens = make(map[Token]*ParseTree, len(t.Tokens))
  80. for tok, subtree := range t.Tokens {
  81. newT.Tokens[tok] = subtree.Clone()
  82. }
  83. }
  84. return newT
  85. }
  86. func init() {
  87. Language.Handle(SELECT, func(p *Parser) (Statement, error) {
  88. return p.parseSelectStatement(targetNotRequired)
  89. })
  90. Language.Handle(DELETE, func(p *Parser) (Statement, error) {
  91. return p.parseDeleteStatement()
  92. })
  93. Language.Group(SHOW).With(func(show *ParseTree) {
  94. show.Group(CONTINUOUS).Handle(QUERIES, func(p *Parser) (Statement, error) {
  95. return p.parseShowContinuousQueriesStatement()
  96. })
  97. show.Handle(DATABASES, func(p *Parser) (Statement, error) {
  98. return p.parseShowDatabasesStatement()
  99. })
  100. show.Handle(DIAGNOSTICS, func(p *Parser) (Statement, error) {
  101. return p.parseShowDiagnosticsStatement()
  102. })
  103. show.Group(FIELD).With(func(field *ParseTree) {
  104. field.Handle(KEY, func(p *Parser) (Statement, error) {
  105. return p.parseShowFieldKeyCardinalityStatement()
  106. })
  107. field.Handle(KEYS, func(p *Parser) (Statement, error) {
  108. return p.parseShowFieldKeysStatement()
  109. })
  110. })
  111. show.Group(GRANTS).Handle(FOR, func(p *Parser) (Statement, error) {
  112. return p.parseGrantsForUserStatement()
  113. })
  114. show.Group(MEASUREMENT).Handle(EXACT, func(p *Parser) (Statement, error) {
  115. return p.parseShowMeasurementCardinalityStatement(true)
  116. })
  117. show.Group(MEASUREMENT).Handle(CARDINALITY, func(p *Parser) (Statement, error) {
  118. return p.parseShowMeasurementCardinalityStatement(false)
  119. })
  120. show.Handle(MEASUREMENTS, func(p *Parser) (Statement, error) {
  121. return p.parseShowMeasurementsStatement()
  122. })
  123. show.Handle(QUERIES, func(p *Parser) (Statement, error) {
  124. return p.parseShowQueriesStatement()
  125. })
  126. show.Group(RETENTION).Handle(POLICIES, func(p *Parser) (Statement, error) {
  127. return p.parseShowRetentionPoliciesStatement()
  128. })
  129. show.Handle(SERIES, func(p *Parser) (Statement, error) {
  130. return p.parseShowSeriesStatement()
  131. })
  132. show.Group(SHARD).Handle(GROUPS, func(p *Parser) (Statement, error) {
  133. return p.parseShowShardGroupsStatement()
  134. })
  135. show.Handle(SHARDS, func(p *Parser) (Statement, error) {
  136. return p.parseShowShardsStatement()
  137. })
  138. show.Handle(STATS, func(p *Parser) (Statement, error) {
  139. return p.parseShowStatsStatement()
  140. })
  141. show.Handle(SUBSCRIPTIONS, func(p *Parser) (Statement, error) {
  142. return p.parseShowSubscriptionsStatement()
  143. })
  144. show.Group(TAG).With(func(tag *ParseTree) {
  145. tag.Handle(KEY, func(p *Parser) (Statement, error) {
  146. return p.parseShowTagKeyCardinalityStatement()
  147. })
  148. tag.Handle(KEYS, func(p *Parser) (Statement, error) {
  149. return p.parseShowTagKeysStatement()
  150. })
  151. tag.Handle(VALUES, func(p *Parser) (Statement, error) {
  152. return p.parseShowTagValuesStatement()
  153. })
  154. })
  155. show.Handle(USERS, func(p *Parser) (Statement, error) {
  156. return p.parseShowUsersStatement()
  157. })
  158. })
  159. Language.Group(CREATE).With(func(create *ParseTree) {
  160. create.Group(CONTINUOUS).Handle(QUERY, func(p *Parser) (Statement, error) {
  161. return p.parseCreateContinuousQueryStatement()
  162. })
  163. create.Handle(DATABASE, func(p *Parser) (Statement, error) {
  164. return p.parseCreateDatabaseStatement()
  165. })
  166. create.Handle(USER, func(p *Parser) (Statement, error) {
  167. return p.parseCreateUserStatement()
  168. })
  169. create.Group(RETENTION).Handle(POLICY, func(p *Parser) (Statement, error) {
  170. return p.parseCreateRetentionPolicyStatement()
  171. })
  172. create.Handle(SUBSCRIPTION, func(p *Parser) (Statement, error) {
  173. return p.parseCreateSubscriptionStatement()
  174. })
  175. })
  176. Language.Group(DROP).With(func(drop *ParseTree) {
  177. drop.Group(CONTINUOUS).Handle(QUERY, func(p *Parser) (Statement, error) {
  178. return p.parseDropContinuousQueryStatement()
  179. })
  180. drop.Handle(DATABASE, func(p *Parser) (Statement, error) {
  181. return p.parseDropDatabaseStatement()
  182. })
  183. drop.Handle(MEASUREMENT, func(p *Parser) (Statement, error) {
  184. return p.parseDropMeasurementStatement()
  185. })
  186. drop.Group(RETENTION).Handle(POLICY, func(p *Parser) (Statement, error) {
  187. return p.parseDropRetentionPolicyStatement()
  188. })
  189. drop.Handle(SERIES, func(p *Parser) (Statement, error) {
  190. return p.parseDropSeriesStatement()
  191. })
  192. drop.Handle(SHARD, func(p *Parser) (Statement, error) {
  193. return p.parseDropShardStatement()
  194. })
  195. drop.Handle(SUBSCRIPTION, func(p *Parser) (Statement, error) {
  196. return p.parseDropSubscriptionStatement()
  197. })
  198. drop.Handle(USER, func(p *Parser) (Statement, error) {
  199. return p.parseDropUserStatement()
  200. })
  201. })
  202. Language.Handle(EXPLAIN, func(p *Parser) (Statement, error) {
  203. return p.parseExplainStatement()
  204. })
  205. Language.Handle(GRANT, func(p *Parser) (Statement, error) {
  206. return p.parseGrantStatement()
  207. })
  208. Language.Handle(REVOKE, func(p *Parser) (Statement, error) {
  209. return p.parseRevokeStatement()
  210. })
  211. Language.Group(ALTER, RETENTION).Handle(POLICY, func(p *Parser) (Statement, error) {
  212. return p.parseAlterRetentionPolicyStatement()
  213. })
  214. Language.Group(SET, PASSWORD).Handle(FOR, func(p *Parser) (Statement, error) {
  215. return p.parseSetPasswordUserStatement()
  216. })
  217. Language.Group(KILL).Handle(QUERY, func(p *Parser) (Statement, error) {
  218. return p.parseKillQueryStatement()
  219. })
  220. }