/// <summary> /// Вспомогательный метод для поиска словаря указанного без версии /// </summary> /// <param name="tempRecord"></param> /// <param name="vocabularySets"></param> /// <returns></returns> public static List <VocabularyInfo> FindVocabWhenVersionNotDefined(BreRecord tempRecord, VocabularyInfo[] vocabularySets) { var searchedVocab = vocabularySets.Where(_ => _.Name.Equals(tempRecord.Name)).ToList(); return(searchedVocab.Count == 0 ? null : searchedVocab); }
} //List<BreRecord> records-заполненяется rule/vocab из БД /// <summary> /// Создает инстанс BreRecord на основе ruleNames из CMD.Далее этот инстанс используется для поиска и создания RuleRecord или VocabRecord в методе CreateFileForWriteList() /// </summary> /// <param name="ruleName"></param> /// <returns></returns> public static BreRecord CreateRecord(string ruleName) { var nameAndVersion = ruleName.Split(','); if (nameAndVersion.Length == 1) { var tempBreRecord = new BreRecord() { Name = ruleName, UseMaxVersion = true }; return(tempBreRecord); } else { var version = nameAndVersion[1].Split('.'); var tempBreRecord = new BreRecord() //version[0]-majorVersion,[1]-minorVersion { Name = nameAndVersion[0], MajorRevision = int.Parse(version[0]), //TODO поверять валидность версий MinorRevision = int.Parse(version[1]), FullFileName = $"{nameAndVersion[0]}-{version[0]}.{version[1]}.xml" }; return(tempBreRecord); } }
/// <summary> /// Вспомогательный метод для поиска правила максимальной версии /// </summary> /// <param name="tempRecord"></param> /// <param name="ruleSetsFromDb"></param> /// <returns></returns> public static RuleSetInfo FindMaxVersionForRule(BreRecord tempRecord, RuleSetInfo[] ruleSetsFromDb) { var subset = ruleSetsFromDb .Where(_ => _.Name == tempRecord.Name) .OrderByDescending(_ => _.MajorRevision) .ThenByDescending(_ => _.MinorRevision) .FirstOrDefault(); //если не нашел вернется null return(subset); }
public void TestCommandLineParserUsingMaxVersion() { var args = new[] { "--mode", "export-list", "--db-server", "name", "--rule-names", "rName1" }; var result = CmdParser.Parse(args); var same = new Args { Mode = Mode.ExportList, BreRecords = new List <BreRecord>() }; var rule = new BreRecord() { UseMaxVersion = true }; same.RuleNames.Add(rule); Assert.AreEqual(result.Mode, same.Mode); for (var i = 0; i < result.RuleNames.Count; i++) { Assert.AreEqual(result.RuleNames[i].UseMaxVersion, same.RuleNames[i].UseMaxVersion); } }
/// <summary> ///При Export List находит rule или vocab В БД.Возвращает инстанс BreRecord предсятавляющий найденый rule/vocab /// </summary> /// <param name="serverName"></param> /// <param name="dbName"></param> /// <param name="tempRecord"></param> public static List <BreRecord> CreateFileForWriteList(string serverName, string dbName, BreRecord tempRecord) // заполняет lIst рапарсенных rule-names { var foundedRuleOrVocab = new List <BreRecord>(); var ruleSetsFromDb = RuleAndVocabDbAdapter.GetRuleSetInfo(serverName, dbName); var vocabularySetsFromDb = RuleAndVocabDbAdapter.GetVocabularyInfoSet(serverName, dbName); if (tempRecord.UseMaxVersion) //для rule ведется поиск максимальной версии на основе переданного имени(версия не указана).При удачном поиске из БД вернется единственная запись-макс.версия для этого правила. { //Для vocab ведется поиск на основе переданного имени, не макс.версии,а всех версий этого vocab.При удачном поиске из БД вернется от 1 до n версий данного словаря var rule = FindMaxVersionForRule(tempRecord, ruleSetsFromDb); //сначала ищем совпадение имени переданного в ЦМД в массиве rule из БД.Совпалений нет?return null if (rule == null) { var searchedVocab = FindVocabWhenVersionNotDefined(tempRecord, vocabularySetsFromDb); // продолжаем поиск в списке vocab из БД.Совпадений нет?Error if (searchedVocab == null) { Error?.Invoke( $@"rule/vocab переданное в CMD {tempRecord.Name} не найдено в БД"); //либо правило\словарь реально отсутствует, либо введено с ошибками } foreach (var file in searchedVocab) { foundedRuleOrVocab.Add(new VocabRecord(file)); } } else { foundedRuleOrVocab.Add(new RuleRecord(rule)); //совпадения есть-запись записываем rule в List } } else //для rule и vocab ведестся поиск конкретной записи по имени и версии. { var fileIsFound = false; foreach (var rule in ruleSetsFromDb) { var fullRuleName = $"{rule.Name}-{rule.MajorRevision}.{rule.MinorRevision}.xml"; if (fullRuleName == tempRecord.FullFileName) //сравниваются имена из БД с именами из ЦМД { foundedRuleOrVocab.Add(new RuleRecord(rule)); fileIsFound = true; break; } foreach (var vocab in vocabularySetsFromDb) { var fullVocabName = $"{vocab.Name}-{vocab.MajorRevision}.{vocab.MinorRevision}.xml"; if (fullVocabName == tempRecord.FullFileName) { foundedRuleOrVocab.Add(new VocabRecord(vocab)); fileIsFound = true; break; } } } if (!fileIsFound) { Error?.Invoke($@"rule/vocab переданное в CMD {tempRecord.Name} не найдено в БД"); } } return(foundedRuleOrVocab); }