private void ProcessRtes(QueryTreeDataInternal result, JToken query)
        {
            var rTable = query.SelectToken("QUERY.rtable");

            foreach (var child in rTable.Children())
            {
                var rte      = child.SelectToken("RTE");
                Rte rteToAdd = new Rte();
                rteToAdd.RteKind = EnumParsingSupport.ConvertFromNumericOrDefault <RteKind>(rte.SelectToken("rtekind").Value <int>());
                switch (rteToAdd.RteKind)
                {
                case RteKind.Relation:
                {
                    rteToAdd.RelId   = rte.SelectToken("relid").Value <uint>();
                    rteToAdd.RelKind = EnumParsingSupport.ConvertUsingAttributeOrDefault <RelKind, EnumMemberAttribute, string>(rte.SelectToken("relkind").Value <string>(), x => x.Value);
                }
                break;

                case RteKind.Subquery:
                {
                    rteToAdd.SubQuery = ProcessQuery(result, rte.SelectToken("subquery"));
                }
                break;

                case RteKind.Join:
                {
                    rteToAdd.JoinType = EnumParsingSupport.ConvertFromNumericOrDefault <JoinType>(rte.SelectToken("jointype").Value <int>());
                    foreach (var expr in rte.SelectToken("joinaliasvars").Children())
                    {
                        rteToAdd.JoinVars.Add(ResolveExpression(result, expr));
                    }
                }
                break;

                case RteKind.Function:
                    break;

                case RteKind.TableFunc:
                    break;

                case RteKind.Values:
                    break;

                case RteKind.CTE:
                {
                    rteToAdd.CteName = rte.SelectToken("ctename").Value <string>();
                }
                break;

                case RteKind.NamedTupleStore:
                    break;
                }
                result.Rtes.Add(rteToAdd);
            }
        }
Example #2
0
        private void ProcessRtes(QueryTreeDataInternal result, JToken query)
        {
            var rTable = query.SelectToken("..rtable");

            foreach (var child in rTable.Children())
            {
                var rte      = child.SelectToken("RTE");
                Rte rteToAdd = new Rte();
                rteToAdd.RteKind = EnumParsingSupport.ConvertFromNumericOrDefault <RteKind>(rte.SelectToken("rtekind").Value <int>());
                switch (rteToAdd.RteKind)
                {
                case RteKind.Relation:
                {
                    rteToAdd.RelId   = rte.SelectToken("relid").Value <uint>();
                    rteToAdd.RelKind = EnumParsingSupport.ConvertUsingAttributeOrDefault <RelKind, EnumMemberAttribute, string>(rte.SelectToken("relkind").Value <string>(), x => x.Value);
                }
                break;
                }
                result.Rtes.Add(rteToAdd);
            }
        }
        private EvalExpression ResolveExpression(QueryTreeDataInternal data, JToken expression, int?forcedRteNumber = null)
        {
            var exprType       = expression.First.Value <JProperty>().Name;
            var expressionData = expression?.First?.First;

            switch (exprType)
            {
            case "CONST":
            {
                var typeId = expressionData.SelectToken("consttype").Value <uint>();
                return(new ConstExpression(data)
                    {
                        TypeID = typeId,
                        DbType = PostgresDbTypeCovertUtility.Convert(EnumParsingSupport.ConvertUsingAttributeOrDefault <PostgresDbType, PostgresDbTypeIdentificationAttribute, long>(typeId, x => x.OID))
                    });
            }

            case "VAR":
            {
                var rteNumber       = forcedRteNumber.HasValue ? forcedRteNumber.Value : expressionData.SelectToken("varnoold").Value <int>();
                var attributeNumber = expressionData.SelectToken("varoattno").Value <int>();
                var levelUpIndex    = expressionData.SelectToken("varlevelsup").Value <int>();
                var typeId          = expressionData.SelectToken("vartype").Value <uint>();
                var dataToUse       = data;
                if (levelUpIndex > 0)
                {
                    for (int i = 0; i < levelUpIndex; i++)
                    {
                        dataToUse = dataToUse.Parent;
                    }
                }
                return(new VariableExpression(dataToUse, rteNumber, attributeNumber)
                    {
                        TypeID = typeId,
                        DbType = PostgresDbTypeCovertUtility.Convert(EnumParsingSupport.ConvertUsingAttributeOrDefault <PostgresDbType, PostgresDbTypeIdentificationAttribute, long>(typeId, x => x.OID))
                    });
            }

            case "RELABELTYPE":
            {
                var typeId = expressionData.SelectToken("resulttype").Value <uint>();
                expressionData = expressionData.SelectToken("arg");
                if (expressionData?.First?.Value <JProperty>().Name == "VAR")
                {
                    expressionData = expressionData.First.First;
                    var rteNumber       = forcedRteNumber.HasValue ? forcedRteNumber.Value : expressionData.SelectToken("varnoold").Value <int>();
                    var attributeNumber = expressionData.SelectToken("varoattno").Value <int>();
                    var levelUpIndex    = expressionData.SelectToken("varlevelsup").Value <int>();
                    var dataToUse       = data;
                    if (levelUpIndex > 0)
                    {
                        for (int i = 0; i < levelUpIndex; i++)
                        {
                            dataToUse = dataToUse.Parent;
                        }
                    }
                    return(new VariableExpression(dataToUse, rteNumber, attributeNumber)
                        {
                            TypeID = typeId,
                            DbType = PostgresDbTypeCovertUtility.Convert(EnumParsingSupport.ConvertUsingAttributeOrDefault <PostgresDbType, PostgresDbTypeIdentificationAttribute, long>(typeId, x => x.OID))
                        });
                }
                break;
            }

            case "FUNCEXPR":
            {
                var typeId = expressionData.SelectToken("funcresulttype").Value <uint>();
                var result = new FunctionExpression(data)
                {
                    ResultTypeID = typeId,
                    ResultDbType = PostgresDbTypeCovertUtility.Convert(EnumParsingSupport.ConvertUsingAttributeOrDefault <PostgresDbType, PostgresDbTypeIdentificationAttribute, long>(typeId, x => x.OID))
                };
                foreach (var argExpr in expressionData.SelectToken("args").Children())
                {
                    result.Arguments.Add(ResolveExpression(data, argExpr, forcedRteNumber));
                }
                return(result);
            }

            case "SUBLINK":
            {
                return(new SublinkExpression(data)
                    {
                        SubQuery = ProcessQuery(data, expressionData.SelectToken("subselect"))
                    });
            }

            case "BOOLEXPR":
            {
                var result = new BooleanExpression(data);
                result.Operator = expressionData.SelectToken("boolop").Value <string>();
                foreach (var argExpr in expressionData.SelectToken("args").Children())
                {
                    result.Arguments.Add(ResolveExpression(data, argExpr, forcedRteNumber));
                }
                return(result);
            }

            case "OPEXPR":
            {
                var typeId = expressionData.SelectToken("opresulttype").Value <uint>();
                var result = new OperatorExpression(data)
                {
                    ResultTypeID = typeId,
                    ResultDbType = PostgresDbTypeCovertUtility.Convert(EnumParsingSupport.ConvertUsingAttributeOrDefault <PostgresDbType, PostgresDbTypeIdentificationAttribute, long>(typeId, x => x.OID))
                };
                result.OperatorID = expressionData.SelectToken("opno").Value <uint>();
                foreach (var argExpr in expressionData.SelectToken("args").Children())
                {
                    result.Arguments.Add(ResolveExpression(data, argExpr, forcedRteNumber));
                }
                return(result);
            }

            case "AGGREF":
            {
                var result = new AggregateExpression(data);
                foreach (var argExpr in expressionData.SelectToken("args").Children())
                {
                    result.Arguments.Add(ResolveExpression(data, argExpr, forcedRteNumber));
                }
                return(result);
            }

            case "TARGETENTRY":
            {
                var expr = expressionData.SelectToken("expr");
                return(ResolveExpression(data, expr, forcedRteNumber));
            }

            case "SCALARARRAYOPEXPR":
            {
                var result = new OperatorExpression(data);
                result.OperatorID = expressionData.SelectToken("opno").Value <uint>();
                foreach (var argExpr in expressionData.SelectToken("args").Children())
                {
                    result.Arguments.Add(ResolveExpression(data, argExpr, forcedRteNumber));
                }
                return(result);
            }

            case "NULLTEST":
            {
                var result = new NullTestExpression(data);
                result.TestType = EnumParsingSupport.ConvertFromNumericOrDefault <NullTestType>(expressionData.SelectToken("nulltesttype").Value <int>());
                result.Argument = ResolveExpression(data, expressionData.SelectToken("arg"), forcedRteNumber);
                return(result);
            }

            case "SORTGROUPCLAUSE":
            {
                var tleSortGroupRef = expressionData.SelectToken("tleSortGroupRef").Value <int>();
                if (tleSortGroupRef > 0)
                {
                    var query = expression.Parent.Parent.Parent;
                    foreach (var t in query.SelectToken("targetList").Children())
                    {
                        if (tleSortGroupRef == t.First.First.SelectToken("ressortgroupref").Value <int>())
                        {
                            var expr = t.First.First.SelectToken("expr");
                            return(ResolveExpression(data, expr));
                        }
                    }
                }
                break;
            }
            }
            return(new UnknownExpression(data));
        }
        private CmdType ParseCommandType(JToken jObject)
        {
            var cmdType = jObject.SelectToken("QUERY.commandType");

            return(EnumParsingSupport.ConvertFromNumericOrDefault <CmdType>(cmdType.Value <int>()));
        }