DeveelDB  20151217
complete SQL database system, primarly developed for .NET/Mono frameworks
SqlCaseExpressionNode.cs
Go to the documentation of this file.
1 //
2 // Copyright 2010-2015 Deveel
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 using System;
18 using System.Collections.Generic;
19 using System.Linq;
20 
21 namespace Deveel.Data.Sql.Parser {
26  internal SqlCaseExpressionNode() {
27  }
28 
33  public IEnumerable<CaseSwitchNode> CaseSwitches { get; private set; }
34 
39  public IExpressionNode ElseExpression { get; private set; }
40 
44  public IExpressionNode TestExpression { get; private set; }
45 
47  protected override ISqlNode OnChildNode(ISqlNode node) {
48  if (node.NodeName == "case_test_expression_opt") {
49  if (node.ChildNodes.Any()) {
50  var exp = node.ChildNodes.First();
51  if (exp is IExpressionNode)
52  TestExpression = (IExpressionNode) exp;
53  }
54  } else if (node.NodeName == "case_when_then_list") {
55  GetWhenThenList(node);
56  } else if (node.NodeName == "case_else_opt") {
57  GetElse(node);
58  }
59 
60  return base.OnChildNode(node);
61  }
62 
63  private void GetElse(ISqlNode node) {
64  foreach (var childNode in node.ChildNodes) {
65  if (childNode is IExpressionNode) {
66  ElseExpression = (IExpressionNode) childNode;
67  break;
68  }
69  }
70  }
71 
72  private void GetWhenThenList(ISqlNode node) {
73  var switches = new List<CaseSwitchNode>();
74 
75  foreach (var childNode in node.ChildNodes) {
76  if (childNode is CaseSwitchNode)
77  switches.Add((CaseSwitchNode)childNode);
78  }
79 
80  CaseSwitches = switches.ToArray();
81  }
82  }
83 }
The node that represents a switch in a CASE expression
Defines the contract for nodes in an AST model for a SQL grammar analysis and parsing.
Definition: ISqlNode.cs:25
string NodeName
Gets the name of the node analyzed from the parser.
Definition: ISqlNode.cs:29
override ISqlNode OnChildNode(ISqlNode node)
During the initialization of the node from the parser, this method is called for every child node add...
IEnumerable< ISqlNode > ChildNodes
Gets a read-only enumeration of the children nodes, if any.
Definition: ISqlNode.cs:39
This interface acts like a marker that indicates if a ISqlNode represents a SQL expression.
The default implementation of ISqlNode, that is a node in the text analysis parsing of SQL commands...
Definition: SqlNode.cs:32
An SQL node describing an in-line CASE conditional expression.