public static QsiRowValueExpressionNode GetRowValueFromJObject(JObject jObject, JsonObjectContext context, string[] columns) { var node = new QsiRowValueExpressionNode(); foreach (string column in columns) { if (jObject.TryGetValue(column, out var value)) { switch (value) { case JValue jValue: { node.ColumnValues.Add(jValue.Value switch { int i => TreeHelper.CreateLiteral(i), uint ui => TreeHelper.CreateLiteral(ui), long l => TreeHelper.CreateLiteral(l), bool b => TreeHelper.CreateLiteral(b), double d => TreeHelper.CreateLiteral(d), string s => TreeHelper.CreateLiteral(s), _ => TreeHelper.CreateNullLiteral() }); break; }
private static QsiExpressionNode VisitRowValueConstructorParseNode(RowValueConstructorParseNode node) { var expressionNode = new QsiRowValueExpressionNode(); expressionNode.ColumnValues.AddRange(node.Children.Select(Visit)); PTree.RawNode[expressionNode] = node; return(expressionNode); }
public static QsiActionNode VisitUpsertStatement(UpsertStatement node) { var insertAction = new PUpsertActionNode { Hints = node.Hint?.Hints }; if (TableVisitor.VisitNamedTableNode(node.Table) is QsiTableAccessNode tableAccessNode) { insertAction.Target.SetValue(tableAccessNode); } else { throw new QsiException(QsiError.Syntax); } if (node.Columns.Any()) { insertAction.Columns = node.Columns .Select(IdentifierVisitor.Visit) .ToArray(); } if (node.Values.Any()) { var row = new QsiRowValueExpressionNode(); row.ColumnValues.AddRange(node.Values.Select(ExpressionVisitor.Visit)); insertAction.Values.Add(row); } else if (node.Select != null) { insertAction.ValueTable.SetValue(TableVisitor.VisitSelectStatement(node.Select)); } if (node.OnDupKeyIgnore) { insertAction.ConflictBehavior = QsiDataConflictBehavior.Ignore; } else if (node.OnDupKeyPairs.Any()) { var conflictAction = new QsiDataConflictActionNode(); conflictAction.SetValues.AddRange(node.OnDupKeyPairs.Select(VisitDupKeyPair)); insertAction.ConflictBehavior = QsiDataConflictBehavior.Update; insertAction.ConflictAction.SetValue(conflictAction); } PTree.RawNode[insertAction] = node; return(insertAction); }
private static (QsiQualifiedIdentifier[] Columns, QsiRowValueExpressionNode Row) JsonToRowValue(string json) { var jsonObject = JObject.Parse(json); var columns = new List <QsiQualifiedIdentifier>(); var row = new QsiRowValueExpressionNode(); foreach (var property in jsonObject.Properties()) { var column = new QsiIdentifier(property.Name, property.Name[0] == '"'); var jValue = property.Value; object value; QsiDataType type; switch (jValue.Type) { case JTokenType.Null: value = null; type = QsiDataType.Null; break; case JTokenType.Float: value = jValue.Value <decimal>(); type = QsiDataType.Decimal; break; case JTokenType.Integer: value = jValue.Value <int>(); type = QsiDataType.Numeric; break; case JTokenType.Boolean: value = jValue.Value <bool>(); type = QsiDataType.Boolean; break; case JTokenType.String: value = Escape(jValue.Value <string>()); type = QsiDataType.String; break; default: value = Escape(jValue.ToString(Formatting.None)); type = QsiDataType.Json; break; } columns.Add(new QsiQualifiedIdentifier(column)); row.ColumnValues.Add(TreeHelper.CreateLiteral(value, type)); } return(columns.ToArray(), row);
public static QsiRowValueExpressionNode VisitExpressionsWithDefaults(ExpressionsWithDefaultsContext context) { IEnumerable <QsiExpressionNode> expressions = context.expressionOrDefault() .Select(VisitExpressionOrDefault); var node = new QsiRowValueExpressionNode(); node.ColumnValues.AddRange(expressions); PrimarSqlTree.PutContextSpan(node, context); return(node); }
public static QsiActionNode VisitInsertStatement(InsertStatementContext context) { var node = new CqlDataInsertActionNode(); UsingClauseContext usingClause; bool ifNotExists; node.Target.SetValue(TableVisitor.VisitColumnFamilyName(context.cf)); if (context.st1 != null) { node.Columns = context.st1.cidentList().list .Select(i => new QsiQualifiedIdentifier(i)) .ToArray(); var rowNode = new QsiRowValueExpressionNode(); rowNode.ColumnValues.AddRange(context.st1._values.Select(ExpressionVisitor.VisitTerm)); // TODO: CqlTree.PutContextSpan(rowNode, context.st1...); node.Values.Add(rowNode); ifNotExists = context.st1.ifNotExists; usingClause = context.st1.usingClause(); } else { var jsonValue = context.st2.jsonValue().s.raw; (QsiQualifiedIdentifier[] columns, var row) = JsonToRowValue(jsonValue); node.Columns = columns; node.Values.Add(row); node.DefaultValue = context.st2.defaultValue; ifNotExists = context.st2.ifNotExists; usingClause = context.st2.usingClause(); } node.ConflictBehavior = ifNotExists ? QsiDataConflictBehavior.None : QsiDataConflictBehavior.Update; if (usingClause != null) { node.Usings.SetValue(ExpressionVisitor.VisitUsingClause(context.st2.usingClause())); } CqlTree.PutContextSpan(node, context); return(node); }