private IFunctionData AddMissingProperties(IFunctionData data) { IPropertyData loopResultsProperty; if (data.FindPropertyById(MongoDBMapReduceShared.Names.ReturnOptionsPropertyName) == null) { MongoDBMapReduceShared.ReturnModeType returnModeType = MongoDBMapReduceShared.ReturnModeType.ListOfRows; if (data.TryFindPropertyById("LoopResults", out loopResultsProperty)) { returnModeType = loopResultsProperty.GetValue <bool>() ? MongoDBMapReduceShared.ReturnModeType.RowByRow : MongoDBMapReduceShared.ReturnModeType.ListOfRows; data = data.RemoveProperty(data.FindPropertyById("LoopResults")); } data = data.AddProperty(new Property(MongoDBMapReduceShared.Names.ReturnOptionsPropertyName, typeof(MongoDBMapReduceShared.ReturnModeType), ValueUseOption.DesignTime, returnModeType) { IsVisible = true }); } return(data); }
public override void GenerateCode(IFunctionBuilder functionBuilder) { var outputTypeReference = FunctionData.Properties[MongoDBMapReduceShared.Names.OutputType].GetValue <ITypeReference>(); string outputType = functionBuilder.GetTypeName(outputTypeReference); if (string.IsNullOrEmpty(outputType)) { throw new ArgumentException("MongoDBMapReduce has no OutputType set"); } functionBuilder.AddAssemblyReference(typeof(MongoDBX)); MongoDBCodeGenerator.CompileExpression(functionBuilder, FunctionData, MongoDBMapReduceShared.Names.Query, MongoDBMapReduceShared.Names.QueryExpressions ); MongoDBCodeGenerator.CompileExpression(functionBuilder, FunctionData, MongoDBMapReduceShared.Names.Map, MongoDBMapReduceShared.Names.MapExpressions ); MongoDBCodeGenerator.CompileExpression(functionBuilder, FunctionData, MongoDBMapReduceShared.Names.Reduce, MongoDBMapReduceShared.Names.ReduceExpressions ); MongoDBCodeGenerator.CompileExpression(functionBuilder, FunctionData, MongoDBMapReduceShared.Names.Finalize, MongoDBMapReduceShared.Names.FinalizeExpressions ); GenerateMapReduceCode(functionBuilder, outputTypeReference); MongoDBMapReduceShared.ReturnModeType returnMode = FunctionData.Properties[MongoDBMapReduceShared.Names.ReturnOptionsPropertyName].GetValue <MongoDBMapReduceShared.ReturnModeType>(); switch (returnMode) { case MongoDBMapReduceShared.ReturnModeType.RowByRow: { functionBuilder.AddCode(string.Format(@"{0} = results.Select(v => new Twenty57.Linx.Plugin.Common.CodeGeneration.NextResult(""{1}"", v));", functionBuilder.ExecutionPathOutParamName, MongoDBMapReduceShared.Names.ExecutionPath)); break; } case MongoDBMapReduceShared.ReturnModeType.ListOfRows: { functionBuilder.AddCode("return results.ToList();"); break; } case MongoDBMapReduceShared.ReturnModeType.FirstRow: { functionBuilder.AddCode("if (results.Count() > 0) return results.First(); else throw new Exception(\"No rows returned by query.\");"); break; } case MongoDBMapReduceShared.ReturnModeType.FirstRowElseEmptyRow: { functionBuilder.AddCode("return results.FirstOrDefault();"); break; } } functionBuilder.AddCode("}"); }