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); } }
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>())); }