예제 #1
0
        public void MarcDiff_MergeOldNew_5_1()
        {
            string strUserRights    = "level-1";
            string strFieldNameList = "*:***-***"; // 所有字段都允许操作

            MarcRecord old_record = new MarcRecord();

            // 旧记录没有 856 字段
            old_record.add(new MarcField("001A1234567"));
            old_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            old_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord new_record = new MarcRecord();

            // 新记录增加一个 856 字段
            new_record.add(new MarcField("001A1234567"));
            new_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            new_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            new_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord target_record = new MarcRecord();

            // 结果记录没有 856 字段
            target_record.add(new MarcField("001A1234567"));
            target_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            target_record.add(new MarcField('$', "701  $aauthor"));

            MarcDiff_MergeOldNew(
                strUserRights,
                strFieldNameList,
                old_record,
                new_record,
                target_record,
                "856!");
        }
예제 #2
0
        // 测试查询书目记录
        public static void TestQueryBiblios(LibraryContext context)
        {
            // 删除可能存在的记录
            {
                var records = context.Biblios
                              .Where(x => x.RecPath.StartsWith("test/")).ToList();
                if (records.Count > 0)
                {
                    context.Biblios.RemoveRange(records);
                    context.SaveChanges();
                }
            }

            // 创建两条书目记录
            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle1$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string1_1"));
                marc.add(new MarcField('$', "690  $aclass_string1_2"));

                CreateTestRecord(context,
                                 "test/1",
                                 marc.Text);
            }

            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle2$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string2_1"));
                marc.add(new MarcField('$', "690  $aclass_string2_2"));

                CreateTestRecord(context,
                                 "test/2",
                                 marc.Text);
            }

            context.SaveChanges();

            // 查询
            var biblios = context.Biblios
                          .Where(x => x.RecPath == "test/1")
                          .ToList();

            // 验证
        }
예제 #3
0
        public void MarcDiff_MergeOldNew_1_4()
        {
            string strUserRights    = "level-1";
            string strFieldNameList = "*:***-***"; // 所有字段都允许操作

            MarcRecord old_record = new MarcRecord();

            // 旧记录有三个 856 字段,第一个的权限禁止当前用户访问
            old_record.add(new MarcField("001A1234567"));
            old_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            old_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            old_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            old_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            old_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord new_record = new MarcRecord();

            // 新记录有两个 856 字段,相当于丢失了旧记录的第一个 856 字段,这模仿了权限不足的用户编辑修改保存的过程。
            // 新记录的两个字段都没有被修改
            new_record.add(new MarcField("001A1234567"));
            new_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            new_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            new_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            new_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord target_record = new MarcRecord();

            // 结果记录有三个 856 字段
            target_record.add(new MarcField("001A1234567"));
            target_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            target_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            target_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            target_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            target_record.add(new MarcField('$', "701  $aauthor"));

            MarcDiff_MergeOldNew(
                strUserRights,
                strFieldNameList,
                old_record,
                new_record,
                target_record,
                "{null}");
        }
예제 #4
0
        public void TestMarcTable_2()
        {
            MarcRecord record = new MarcRecord();

            //
            record.add(new MarcField("001A1234567"));
            record.add(new MarcField('$', "2001 $atitle value$fauthor value"));

            List <NameValueLine> expect_results = new List <NameValueLine>()
            {
                new NameValueLine {
                    Name = "题名与责任者", Type = "title_area", Value = "title value / author value"
                },
            };

            Test(record.Text,
                 "title_area",
                 expect_results);
        }
예제 #5
0
        public static void CreateTestRecords(LibraryContext context)
        {
            // context.Database.Migrate();

            string recpath = "test/1";
            // 删除可能存在的记录
            var record = context.Biblios
                         .Where(x => x.RecPath == recpath).FirstOrDefault();

            if (record != null)
            {
                context.Biblios.Remove(record);
                context.SaveChanges();
            }

            // 创建一条新的记录
            Biblio biblio = new Biblio {
                RecPath = recpath
            };

            MarcRecord marc = new MarcRecord();

            marc.add(new MarcField('$', "200  $atitle$fauthor"));
            marc.add(new MarcField('$', "690  $aclass_string1"));
            marc.add(new MarcField('$', "690  $aclass_string2"));

            if (MarcUtil.Marc2Xml(marc.Text,
                                  "unimarc",
                                  out string xml,
                                  out string error) == -1)
            {
                throw new Exception(error);
            }
            biblio.RecPath = recpath;
            biblio.Xml     = xml;
            biblio.Create(biblio.Xml, biblio.RecPath);
            context.Biblios.Add(biblio);
            context.SaveChanges();
        }
예제 #6
0
        public void MarcDiff_MergeOldNew_2_1()
        {
            string strUserRights    = "level-1";
            string strFieldNameList = "*:***-***"; // 所有字段都允许操作

            MarcRecord old_record = new MarcRecord();

            // 旧记录有三个 856 字段,第一个的权限允许当前用户访问
            old_record.add(new MarcField("001A1234567"));
            old_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            old_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:level-1"));
            old_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            old_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            old_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord new_record = new MarcRecord();

            // 新记录的第一个字段被修改,即将导致权限不足
            new_record.add(new MarcField("001A1234567"));
            new_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            new_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            new_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            new_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            new_record.add(new MarcField('$', "701  $aauthor"));

            MarcRecord target_record = new MarcRecord();

            // 结果记录有三个 856 字段。第一个字段没有允许修改
            target_record.add(new MarcField("001A1234567"));
            target_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            target_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:level-1"));
            target_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            target_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            target_record.add(new MarcField('$', "701  $aauthor"));

            MarcDiff_MergeOldNew(
                strUserRights,
                strFieldNameList,
                old_record,
                new_record,
                target_record,
                "856!");
        }
예제 #7
0
        public static void TestLeftJoin(LibraryContext context)
        {
            // *** 第一步,准备数据
            string recpath = "test/1";

            {
                // 删除可能存在的记录
                var record = context.Biblios
                             .Where(x => x.RecPath == recpath).FirstOrDefault();
                if (record != null)
                {
                    context.Biblios.Remove(record);
                    context.SaveChanges();
                }

                // 创建一条新的记录
                Biblio biblio = new Biblio {
                    RecPath = recpath
                };

                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string1"));
                marc.add(new MarcField('$', "690  $aclass_string2"));

                if (MarcUtil.Marc2Xml(marc.Text,
                                      "unimarc",
                                      out string xml,
                                      out string error) == -1)
                {
                    throw new Exception(error);
                }
                biblio.RecPath = recpath;
                biblio.Xml     = xml;
                biblio.Create(biblio.Xml, biblio.RecPath);
                context.Biblios.Add(biblio);
                context.SaveChanges();
            }

            // *** 第二步,验证 left join
            {
                var biblios = context.Biblios.Where(x => x.RecPath == recpath)
                              .LeftJoin(
                    context.Keys,
                    biblio => new { recpath = biblio.RecPath, type = "class_clc", index = 0 },
                    key => new { recpath = key.BiblioRecPath, type = key.Type, index = key.Index },
                    (biblio, key) => new
                {
                    biblio.RecPath,
                    Class = key.Text,
                }
                    ).ToList();

                if (biblios.Count != 1)
                {
                    throw new Exception("left join 得到的元素个数不正确");
                }

                if (biblios[0].Class != "class_string1")
                {
                    throw new Exception("得到的分类号字符串不正确");
                }

                /*
                 * StringBuilder text = new StringBuilder();
                 * foreach (var biblio in biblios)
                 * {
                 *  text.AppendLine($"bibliorecpath={biblio.RecPath}, class_clc={biblio.Class}");
                 * }
                 *
                 * return text.ToString();
                 */
            }
        }
예제 #8
0
        public static void TestAddOrUpdateBiblio(ref LibraryContext context)
        {
            string recpath = "test/1";
            // 删除可能存在的记录
            var record = context.Biblios
                         .Where(x => x.RecPath == recpath).FirstOrDefault();

            if (record != null)
            {
                context.Biblios.Remove(record);
                context.SaveChanges();
            }

            // 创建一条新的记录
            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle1$fauthor1"));
                marc.add(new MarcField('$', "690  $aclass_string1"));
                Biblio biblio = new Biblio {
                    RecPath = recpath
                };
                if (MarcUtil.Marc2Xml(marc.Text,
                                      "unimarc",
                                      out string xml,
                                      out string error) == -1)
                {
                    throw new Exception(error);
                }
                biblio.RecPath = recpath;
                biblio.Xml     = xml;
                biblio.Create(biblio.Xml, biblio.RecPath);
                context.Add(biblio);
                context.SaveChanges();
            }

            context.Dispose();
            context = new LibraryContext();

            // 用于最后阶段比对检索点
            List <Key> save_keys = new List <Key>();

            // 更新上述书目记录
            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle2$fauthor2"));
                marc.add(new MarcField('$', "690  $aclass_string2"));
                if (MarcUtil.Marc2Xml(marc.Text,
                                      "unimarc",
                                      out string xml,
                                      out string error) == -1)
                {
                    throw new Exception(error);
                }

                var biblio = context.Biblios.SingleOrDefault(c => c.RecPath == recpath)
                             ?? new Biblio {
                    RecPath = recpath
                };

                Debug.Assert(biblio.RecPath == recpath);

                biblio.RecPath = recpath;
                biblio.Xml     = xml;
                biblio.Create(biblio.Xml, biblio.RecPath);

                save_keys.AddRange(biblio.Keys);

                context.AddOrUpdate(biblio);
                context.SaveChanges();
            }

            context.Dispose();
            context = new LibraryContext();

            // 检查检索点是否正确
            var keys = context.Keys
                       .Where(x => x.BiblioRecPath == recpath)
                       .ToList();

            if (keys.Count != save_keys.Count)
            {
                throw new Exception($"keys.Count ({keys.Count}) 和 save_keys.Count ({save_keys.Count})应该相等");
            }

            foreach (var current in save_keys)
            {
                if (Key.IndexOf(keys, current) == -1)
                {
                    throw new Exception($"key '{current.ToString()}' 在检索结果中没有找到");
                }
            }
        }
예제 #9
0
        // 测试 biblio left join keys 在丢失对应的 keys 的情况下的正确性
        public static void TestLeftJoinMissingKeys(LibraryContext context)
        {
            string recpath = "test/1";

            // 删除可能存在的记录
            {
                var records = context.Biblios
                              .Where(x => x.RecPath.StartsWith("test/")).ToList();
                if (records.Count > 0)
                {
                    context.Biblios.RemoveRange(records);
                    context.SaveChanges();
                }
            }

            // 创建一条书目记录
            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle1$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string1"));
                marc.add(new MarcField('$', "690  $aclass_string2"));

                CreateTestRecord(context,
                                 recpath,
                                 marc.Text);
            }

            context.SaveChanges();

            // 删除第一条书目记录的 keys。注意书目记录依然存在
            {
                context.RemoveRange(context.Keys
                                    .Where(x => x.BiblioRecPath == recpath)
                                    .ToList());
                context.SaveChanges();
            }

            // 进行 left join
            {
                var biblios = context.Biblios.Where(x => x.RecPath == recpath)
                              .LeftJoin(
                    context.Keys,
                    biblio => new { recpath = biblio.RecPath, type = "class_clc", index = 0 },
                    key => new { recpath = key.BiblioRecPath, type = key.Type, index = key.Index },
                    (biblio, key) => new
                {
                    biblio.RecPath,
                    Class = key.Text,           // 这一句不会抛出异常
                }
                    ).ToList();

                if (biblios.Count != 1)
                {
                    throw new Exception("left join 得到的元素个数不正确");
                }

                if (biblios[0].Class != null)
                {
                    throw new Exception("得到的分类号字符串不正确");
                }
            }
        }
예제 #10
0
        // 测试删除书目记录的时候是否也正确删除了 keys
        public static void TestDeleteBiblioKeys(LibraryContext context)
        {
            // 删除可能存在的记录
            {
                var records = context.Biblios
                              .Where(x => x.RecPath.StartsWith("test/")).ToList();
                if (records.Count > 0)
                {
                    context.Biblios.RemoveRange(records);
                    context.SaveChanges();
                }
            }

            // 创建两条书目记录
            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle1$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string1_1"));
                marc.add(new MarcField('$', "690  $aclass_string1_2"));

                CreateTestRecord(context,
                                 "test/1",
                                 marc.Text);
            }

            {
                MarcRecord marc = new MarcRecord();
                marc.add(new MarcField('$', "200  $atitle2$fauthor"));
                marc.add(new MarcField('$', "690  $aclass_string2_1"));
                marc.add(new MarcField('$', "690  $aclass_string2_2"));

                CreateTestRecord(context,
                                 "test/2",
                                 marc.Text);
            }

            context.SaveChanges();

            // 删除第一条书目记录
            {
                var records = context.Biblios
                              .Where(x => x.RecPath == "test/1").ToList();
                if (records.Count > 0)
                {
                    context.Biblios.RemoveRange(records);
                    context.SaveChanges();
                }
            }

            // 检查 keys 第二条是否还存在
            var keys = context.Keys
                       .Where(x => x.BiblioRecPath == "test/2")
                       .ToList();

            //if (keys.Count != 3)
            //    throw new Exception("left join 的结果元素应该只有 3 个");

            foreach (var key in keys)
            {
                if (key.BiblioRecPath != "test/2")
                {
                    throw new Exception("剩下的应该都是 第 2 条书目记录的检索点才对");
                }
            }
        }
예제 #11
0
        public void MarcDiff_MergeOldNew_1_1()
        {
            string strComment = "";
            string strError   = "";
            int    nRet       = 0;

            string strUserRights    = "level-1";
            string strFieldNameList = "*:***-***"; // 所有字段都允许操作

            MarcRecord old_record = new MarcRecord();

            // 旧记录有三个 856 字段,第一个的权限禁止当前用户访问
            old_record.add(new MarcField("001A1234567"));
            old_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            old_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            old_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage"));
            old_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            old_record.add(new MarcField('$', "701  $aauthor"));
#if NO
            string strOldMarc = old_record.Text;

            nRet = LibraryApplication.MaskCantGet856(
                strUserRights,
                ref strOldMarc,
                out strError);
            if (nRet == -1)
            {
                throw new Exception(strError);
            }
            Assert.AreEqual(nRet, 1, "应当是只标记了一个 856 字段");
#endif

            MarcRecord new_record = new MarcRecord();
            // 新记录有两个 856 字段,相当于丢失了旧记录的第一个 856 字段,这模仿了权限不足的用户编辑修改保存的过程。
            // 新记录的第一个 856 字段被修改了,增加了 $zZZZ
            new_record.add(new MarcField("001A1234567"));
            new_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            new_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage$zZZZ"));
            new_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            new_record.add(new MarcField('$', "701  $aauthor"));
#if NO
            string strNewMarc = new_record.Text;

            // 对 strNewMarc 进行过滤,将那些当前用户无法读取的 856 字段删除
            // 对 MARC 记录进行过滤,将那些当前用户无法读取的 856 字段删除
            // return:
            //      -1  出错
            //      其他  滤除的 856 字段个数
            nRet = LibraryApplication.MaskCantGet856(
                strUserRights,
                ref strNewMarc,
                out strError);
            if (nRet == -1)
            {
                throw new Exception(strError);
            }
            Assert.AreEqual(nRet, 0, "应当没有标记任何 856 字段");
#endif

            MarcRecord target_record = new MarcRecord();
            // 结果记录有三个 856 字段
            // 结果记录的第二个 856 字段兑现了修改,增加了 $zZZZ。旧记录的第一个 856 字段得到了保护
            target_record.add(new MarcField("001A1234567"));
            target_record.add(new MarcField('$', "2001 $atitle$fauthor"));
            target_record.add(new MarcField('$', "85642$3Cover image 1$uURL1$qimage/jpeg$xtype:FrontCover.SmallImage;rights:group"));
            target_record.add(new MarcField('$', "85642$3Cover image 2$uURL2$qimage/jpeg$xtype:FrontCover.MediumImage$zZZZ"));
            target_record.add(new MarcField('$', "85642$3Cover image 3$uURL3$qimage/jpeg$xtype:FrontCover.LargeImage"));
            target_record.add(new MarcField('$', "701  $aauthor"));

            MarcDiff_MergeOldNew(
                strUserRights,
                strFieldNameList,
                old_record,
                new_record,
                target_record,
                "{null}");

#if NO
            // 按照字段修改权限定义,合并新旧两个 MARC 记录
            // parameters:
            //      strDefaultOperation   insert/replace/delete 之一或者逗号间隔组合
            // return:
            //      -1  出错
            //      0   成功
            //      1   有部分修改要求被拒绝
            nRet = MarcDiff.MergeOldNew(
                "insert,replace,delete",
                strFieldNameList,
                strOldMarc,
                ref strNewMarc,
                out strComment,
                out strError);
            if (nRet == -1)
            {
                throw new Exception(strError);
            }

            // 检查 strNewMarc
            if (strNewMarc != target_record.Text)
            {
                throw new Exception("和期望的结果不符合");
            }

            // 检查 strComment
#endif
        }