예제 #1
0
        public void UpdateRelationsInBulk()
        {
            _db.Open();

            Console.WriteLine("--------------- Updating Relations ---------------");

            var relations        = _mongoConnector.GetAllRelationsFromChangeset(_localChangeset);
            var tempRelationList = new List <Relation>();

            foreach (var relation in relations)
            {
                tempRelationList.Add(relation);

                if (tempRelationList.Count != 10000)
                {
                    continue;
                }

                var relationTable    = CreateRelationTable();
                var relationTagTable = CreateTagTable();
                var memberTable      = CreatememberTable();

                foreach (var relation1 in tempRelationList)
                {
                    foreach (var tagKey in relation1.Tags.Keys)
                    {
                        var tagRow     = relationTagTable.NewRow();
                        var value      = relation1.Tags[tagKey];
                        var validValue = value.Substring(0, Math.Min(200, value.Length));
                        tagRow.ItemArray = new object[] { relation1.Id, tagKey, validValue };
                        relationTagTable.Rows.Add(tagRow);
                    }

                    var memberReference = new HashSet <long>();
                    foreach (var member in relation1.Members)
                    {
                        if (memberReference.Contains(member.Reference))
                        {
                            continue;
                        }
                        memberReference.Add(member.Reference);

                        var memberRow  = relationTagTable.NewRow();
                        var validValue = member.Role.Substring(0, Math.Min(200, member.Role.Length));
                        memberRow.ItemArray = new object[] { relation1.Id, member.Reference, member.Type, validValue };
                        memberTable.Rows.Add(memberRow);
                    }

                    var sqlRelation = new SqlRelation
                    {
                        Id             = relation1.Id,
                        TimeStamp      = relation1.TimeStamp,
                        LocalChangeset = relation1.LocalChangeset,
                    };


                    var relationRow = relationTable.NewRow();
                    relationRow.ItemArray = new object[]
                    {
                        sqlRelation.Id, sqlRelation.TimeStamp, sqlRelation.LocalChangeset
                    };

                    relationTable.Rows.Add(relationRow);
                }

                using (var bulk = new SqlBulkCopy(_db))
                {
                    bulk.DestinationTableName = "Relation";
                    bulk.WriteToServer(relationTable);
                }

                using (var bulk = new SqlBulkCopy(_db))
                {
                    bulk.DestinationTableName = "RelationTag";
                    bulk.WriteToServer(relationTagTable);
                }

                using (var bulk = new SqlBulkCopy(_db))
                {
                    bulk.DestinationTableName = "Member";
                    bulk.WriteToServer(memberTable);
                }

                tempRelationList = new List <Relation>(10000);
                Console.WriteLine("10000 Passed");
            }

            //----------------------------------------------------------------------------
            // Remains
            var relationTable1    = CreateRelationTable();
            var relationTagTable1 = CreateTagTable();
            var memberTable1      = CreatememberTable();

            foreach (var relation1 in tempRelationList)
            {
                foreach (var tagKey in relation1.Tags.Keys)
                {
                    var tagRow     = relationTagTable1.NewRow();
                    var value      = relation1.Tags[tagKey];
                    var validValue = value.Substring(0, Math.Min(200, value.Length));
                    tagRow.ItemArray = new object[] { relation1.Id, tagKey, validValue };
                    relationTagTable1.Rows.Add(tagRow);
                }

                var memberReference = new HashSet <long>();
                foreach (var member in relation1.Members)
                {
                    if (memberReference.Contains(member.Reference))
                    {
                        continue;
                    }
                    memberReference.Add(member.Reference);

                    var memberRow  = memberTable1.NewRow();
                    var validValue = member.Role.Substring(0, Math.Min(200, member.Role.Length));
                    memberRow.ItemArray = new object[] { relation1.Id, member.Reference, member.Type, validValue };
                    memberTable1.Rows.Add(memberRow);
                }

                var sqlRelation = new SqlRelation
                {
                    Id             = relation1.Id,
                    TimeStamp      = relation1.TimeStamp,
                    LocalChangeset = relation1.LocalChangeset,
                };

                var relationRow = relationTable1.NewRow();
                relationRow.ItemArray = new object[]
                {
                    sqlRelation.Id, sqlRelation.TimeStamp, sqlRelation.LocalChangeset
                };

                relationTable1.Rows.Add(relationRow);
            }

            using (var bulk = new SqlBulkCopy(_db))
            {
                bulk.DestinationTableName = "Relation";
                bulk.WriteToServer(relationTable1);
            }

            using (var bulk = new SqlBulkCopy(_db))
            {
                bulk.DestinationTableName = "RelationTag";
                bulk.WriteToServer(relationTagTable1);
            }

            using (var bulk = new SqlBulkCopy(_db))
            {
                bulk.DestinationTableName = "Member";
                bulk.WriteToServer(memberTable1);
            }

            _db.Close();
        }