private static Expression GetOrAddParameterRefToCompilationContext(ParsedRequest parsedRequest, PqlCompilerState compilerState, int parameterOrdinal) { Tuple <ParameterExpression, Expression> refTuple; if (compilerState.ParamRefs.TryGetValue(parameterOrdinal, out refTuple)) { return(refTuple.Item1); } ParameterExpression paramRef; Expression paramExtractor; var localOrdinal = parsedRequest.Params.OrdinalToLocalOrdinal[parameterOrdinal]; var dbType = parsedRequest.Params.DataTypes[parameterOrdinal]; if (BitVector.Get(compilerState.RequestParameters.IsCollectionFlags, parameterOrdinal)) { var rowData = Expression.Field(compilerState.Context, "InputParametersCollections"); var hashsetType = typeof(HashSet <>).MakeGenericType(DriverRowData.DeriveSystemType(dbType)); paramExtractor = Expression.Convert(Expression.ArrayIndex(rowData, Expression.Constant(localOrdinal, typeof(int))), hashsetType); paramRef = Expression.Variable(paramExtractor.Type); } else { var rowData = Expression.Field(compilerState.Context, "InputParametersRow"); paramExtractor = DriverRowData.CreateReadAccessor(rowData, dbType, localOrdinal); paramRef = Expression.Variable(paramExtractor.Type); } compilerState.ParamRefs.Add( parameterOrdinal, new Tuple <ParameterExpression, Expression>(paramRef, paramExtractor)); return(paramRef); }
public static Expression CompileFieldValueExtractorClause(PqlCompilerState compilerState, FieldMetadata field, DataContainerDescriptor containerDescriptor, RequestExecutionContextCacheInfo cacheInfo, Type returnType) { var ordinal = GetFieldOrdinalInDriverFetchFields(cacheInfo.ParsedRequest, field); var rowData = Expression.Field(compilerState.Context, "InputRow"); return(s_expressionRuntime.AdjustReturnType(DriverRowData.CreateReadAccessor(rowData, field.DbType, ordinal), returnType)); }
private static Expression GetOrAddFieldRefToCompilationContext(ParsedRequest parsedRequest, PqlCompilerState compilerState, FieldMetadata field) { Tuple <ParameterExpression, Expression> refTuple; if (compilerState.FieldRefs.TryGetValue(field.FieldId, out refTuple)) { return(refTuple.Item1); } var ordinal = GetFieldOrdinalInDriverFetchFields(parsedRequest, field); var rowData = Expression.Field(compilerState.Context, "InputRow"); var fieldAccessor = DriverRowData.CreateReadAccessor(rowData, field.DbType, ordinal); var fieldRef = Expression.Variable(fieldAccessor.Type); compilerState.FieldRefs.Add( field.FieldId, new Tuple <ParameterExpression, Expression>(fieldRef, fieldAccessor)); return(fieldRef); }