示例#1
0
        public void to_upsert_with_duplicated_fields()
        {
            var mapping = DocumentMapping.For <User>();

            mapping.DuplicateField("FirstName");
            mapping.DuplicateField("LastName");

            var function = new UpsertFunction(mapping);

            var args = function.Arguments.Select(x => x.Column).ToArray();

            args.ShouldContain("first_name");
            args.ShouldContain("last_name");
        }
        public DocumentFunctionOperationBuilder(DocumentMapping mapping, UpsertFunction function, OperationRole role,
                                                StoreOptions options)
        {
            _function = function;
            _role     = role;
            _options  = options;

            CommandText = $"select {_function.Identifier}({_function.OrderedArguments().Select(x => "?").Join(", ")})";

            ClassName =
                $"{function.GetType().Name.Replace("Function", "")}{mapping.DocumentType.Name.Sanitize()}Operation";

            _mapping = mapping;
        }
示例#3
0
        public void tenant_id_argument_when_multi_tenanted()
        {
            var options = new StoreOptions();

            options.Connection(ConnectionSource.ConnectionString);
            options.Policies.AllDocumentsAreMultiTenanted();

            var mapping = new DocumentMapping(typeof(User), options);

            mapping.TenancyStyle = TenancyStyle.Conjoined;

            var func = new UpsertFunction(mapping);

            func.Arguments.Any(x => x is TenantIdArgument)
            .ShouldBeTrue();
        }
        public void restore_previous_function_in_rollback()
        {
            writeFunction();

            theMapping.Duplicate(x => x.FirstName);
            writeTable();

            var function = new UpsertFunction(theMapping);

            var ddlRules = new DdlRules();
            var delta    = function.FetchDelta(_conn, ddlRules);

            var patch = new SchemaPatch(ddlRules);

            delta.WritePatch(patch);

            patch.RollbackDDL.ShouldContain(delta.Actual.Body);
        }
示例#5
0
        private void writeFunction()
        {
            var writer   = new StringWriter();
            var function = new UpsertFunction(theMapping);

            function.Write(new DdlRules(), writer);

            var sql = writer.ToString();

            try
            {
                _conn.CreateCommand(sql).ExecuteNonQuery();
            }
            catch (Exception)
            {
                Console.WriteLine(sql);
                throw;
            }
        }
示例#6
0
        public GeneratedType BuildType(GeneratedAssembly assembly)
        {
            var upsertFunction = new UpsertFunction(_mapping);


            var arguments = upsertFunction.OrderedArguments().Where(x => !(x is CurrentVersionArgument)).ToArray();
            var columns   = arguments.Select(x => $"\\\"{x.Column}\\\"").Join(", ");

            var type = assembly.AddType($"{_mapping.DocumentType.Name.Sanitize()}BulkLoader",
                                        typeof(BulkLoader <,>).MakeGenericType(_mapping.DocumentType, _mapping.IdType));

            if (_mapping.IsHierarchy())
            {
                type.AllInjectedFields.Add(new InjectedField(typeof(DocumentMapping), "mapping"));
            }

            type.MethodFor("MainLoaderSql").Frames
            .Return($"COPY {_mapping.Table.QualifiedName}({columns}) FROM STDIN BINARY");

            type.MethodFor("TempLoaderSql").Frames
            .Return($"COPY {_tempTable}({columns}) FROM STDIN BINARY");

            type.MethodFor(nameof(CopyNewDocumentsFromTempTable))
            .Frames.Return(CopyNewDocumentsFromTempTable());

            type.MethodFor(nameof(OverwriteDuplicatesFromTempTable))
            .Frames.Return(OverwriteDuplicatesFromTempTable());

            type.MethodFor(nameof(CreateTempTableForCopying))
            .Frames.Return(CreateTempTableForCopying().Replace("\"", "\\\""));

            var load = type.MethodFor("LoadRow");

            for (int i = 0; i < arguments.Length; i++)
            {
                arguments[i].GenerateBulkWriterCode(type, load, _mapping);
            }

            return(type);
        }