示例#1
0
        public BulkLoader(ISerializer serializer, DocumentMapping mapping, IdAssignment <T> assignment)
        {
            _mapping    = mapping;
            _assignment = assignment;
            var upsertFunction = new UpsertFunction(mapping);

            _tempTableName = mapping.Table.Name + "_temp";


            var writer          = Expression.Parameter(typeof(NpgsqlBinaryImporter), "writer");
            var document        = Expression.Parameter(typeof(T), "document");
            var alias           = Expression.Parameter(typeof(string), "alias");
            var serializerParam = Expression.Parameter(typeof(ISerializer), "serializer");
            var textWriter      = Expression.Parameter(typeof(CharArrayTextWriter), "writer");
            var tenantId        = Expression.Parameter(typeof(string), "tenantId");

            var arguments   = upsertFunction.OrderedArguments().Where(x => !(x is CurrentVersionArgument)).ToArray();
            var expressions =
                arguments.Select(
                    x => x.CompileBulkImporter(mapping, serializer.EnumStorage, writer, document, alias, serializerParam, textWriter, tenantId));

            var columns = arguments.Select(x => $"\"{x.Column}\"").Join(", ");

            _baseSql = $"COPY %TABLE%({columns}) FROM STDIN BINARY";
            _sql     = _baseSql.Replace("%TABLE%", mapping.Table.QualifiedName);

            var block = Expression.Block(expressions);



            var lambda = Expression.Lambda <Action <T, string, ISerializer, NpgsqlBinaryImporter, CharArrayTextWriter, string> >(block, document, alias,
                                                                                                                                 serializerParam, writer, textWriter, tenantId);

            _transferData = ExpressionCompiler.Compile <Action <T, string, ISerializer, NpgsqlBinaryImporter, CharArrayTextWriter, string> >(lambda);
        }
示例#2
0
        private static TView newView(ITenant tenant, IdAssignment <TView> idAssigner, TId id)
        {
            var view = new TView();

            idAssigner.Assign(tenant, view, id);
            return(view);
        }
示例#3
0
        private static TView newView(IdAssignment <TView> idAssigner, Guid id)
        {
            var view = new TView();

            idAssigner.Assign(view, id);
            return(view);
        }
示例#4
0
 public SubClassDocumentStorage(IDocumentStorage parent)
 {
     _parent             = parent;
     _parentIdAssignment = _parent.As <IdAssignment <TBase> >();
     _parentBulkLoader   = _parent.As <IBulkLoader <TBase> >();
 }