コード例 #1
0
        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;
                    }
コード例 #2
0
        private static QsiExpressionNode VisitRowValueConstructorParseNode(RowValueConstructorParseNode node)
        {
            var expressionNode = new QsiRowValueExpressionNode();

            expressionNode.ColumnValues.AddRange(node.Children.Select(Visit));

            PTree.RawNode[expressionNode] = node;

            return(expressionNode);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }