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!"); }
// 测试查询书目记录 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(); // 验证 }
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}"); }
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); }
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(); }
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!"); }
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(); */ } }
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()}' 在检索结果中没有找到"); } } }
// 测试 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("得到的分类号字符串不正确"); } } }
// 测试删除书目记录的时候是否也正确删除了 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 条书目记录的检索点才对"); } } }
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 }