Beispiel #1
0
        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);
        }
Beispiel #2
0
        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("}");
        }