public CompareFormVM(GroupVM group, CompareTable compareTable) : base(group) { this.groupModel = group.GroupModel; this.compareTable = compareTable; rows = new ObservableCollection<CompareRowVM>(); }
public GroupFormVM(GroupVM group) : base(group) { this.group = group.GroupModel; this.Times = Options.Times; this.Instruments = Options.Instruments; this.Panels = Options.Panels; this.Geographies = Options.Geographies; this.DataSets = Options.DataSets; this.Languages = Options.Languages; }
public static void ExportGroup(EDOConfig config, GroupVM group, List<StudyUnitVM> studyUnits) { string path = IOUtils.QuerySavePathName(Resources.GroupExport, null, DDI_GROUP_FILTER, true); if (string.IsNullOrEmpty(path)) { return; } DDI3Writer writer = new DDI3Writer(config); writer.WriteGroup(path, group, studyUnits); DDI3Reader.Validate(path); }
public void WriteGroup(string path, GroupVM group, List<StudyUnitVM> studyUnits) { Debug.Assert(!string.IsNullOrEmpty(path)); ClearError(); XmlWriterSettings xws = new XmlWriterSettings(); xws.Indent = true; xws.Encoding = Encoding.UTF8; using (XmlWriter xw = XmlWriter.Create(path, xws)) { XElement gr = CreateGroup(group, studyUnits); foreach (StudyUnitVM studyUnit in studyUnits) { XElement su = new XElement(g + TAG_STUDY_UNIT); gr.Add(su); this.studyUnit = studyUnit; su.Add(CreateStudyUnit()); } gr.Add(CreateComparison(group, studyUnits)); XDocument doc = new XDocument( DECLARATION, new XElement(ddi + TAG_DDI_INSTANCE, CreateIDAttribute(group.GroupModel.InstanceId), CreateVersionAttribute(), CreateAgencyAttribute(), new XAttribute(XNamespace.Xmlns + "ddi", ddi), new XAttribute(XNamespace.Xmlns + "s", s), new XAttribute(XNamespace.Xmlns + "r", r), new XAttribute(XNamespace.Xmlns + "a", a), new XAttribute(XNamespace.Xmlns + "c", c), new XAttribute(XNamespace.Xmlns + "d", d), new XAttribute(XNamespace.Xmlns + "l", l), new XAttribute(XNamespace.Xmlns + "p", p), new XAttribute(XNamespace.Xmlns + "pi", pi), new XAttribute(XNamespace.Xmlns + "g", g), new XAttribute(XNamespace.Xmlns + "cm", cm), new XAttribute(XNamespace.Xmlns + "dce", dce), new XAttribute(XNamespace.Xmlns + "dc", dc), gr )); CheckError(); doc.WriteTo(xw); } }
private XElement CreateGroup(GroupVM group, List<StudyUnitVM> studyUnits) { Group groupModel = group.GroupModel; XElement gr = new XElement(g + TAG_GROUP, CreateIDAttribute(groupModel.Id), CreateVersionAttribute(), CreateAgencyAttribute(), new XAttribute(ATTR_DATA_SET, groupModel.DataSetCode), new XAttribute(ATTR_GEOGRAPHY, groupModel.GeographyCode), new XAttribute(ATTR_INSTRUMENT,groupModel.InstrumentCode), new XAttribute(ATTR_LANGUAGE, groupModel.LanguageCode), new XAttribute(ATTR_PANEL, groupModel.PanelCode), new XAttribute(ATTR_TIME, groupModel.TimeCode), new XElement(r + TAG_CITATION, new XElement(r + TAG_TITLE, group.Title)), new XElement(g + TAG_PURPOSE, CreateIDAttribute(groupModel.PurposeId), CreateContent(groupModel.Purpose)) ); //共通の母集団、変数の概念を書き出す //StudyUnit sharedStudyUnitModel = group.GroupModel.SharedStudyUnit; //XElement concepts = new XElement(g + TAG_CONCEPT); //XElement conceptualComponent = new XElement(c + TAG_CONCEPTUAL_COMPONENT); StudyUnitVM sharedStudyUnit = new StudyUnitVM(group.Main, group.GroupModel.SharedStudyUnit); this.studyUnit = sharedStudyUnit; XElement conceptualComponent = CreateConceptualComponent(true); if (conceptualComponent != null) { XElement concepts = new XElement(g + TAG_CONCEPTS, conceptualComponent); gr.Add(concepts); } XElement logicalProduct = CreateLogicalProduct(); if (logicalProduct != null) { XElement logical = new XElement(g + TAG_LOGICAL_PRODUCT, logicalProduct); gr.Add(logical); } return gr; }
private List<XElement> CreateConceptSchemeMap(GroupVM group, List<StudyUnitVM> studyUnits) { //ConceptとConceptSchemeの比較関係をタグに保存するだけなのだが親子関係を考慮しないといけないので複雑な処理となる。 //処理の流れは //・Conceptの比較結果を取得。 //・Conceptの比較結果を、同じ対応を持つConceptSchemeの比較結果ごとにまとめる //・ConceptSchemeの比較結果を取得。 //・ConceptSchemeの比較結果を書き出す。対応したConceptの比較結果のリストが存在する場合これを書き出す。 //・残りのConceptの比較結果を書き出す(ConceptSchemeレベルでは比較結果が存在しないがConceptでは違う場合がありうる)。 //Conceptの対応関係を取得する List<CompareItem> conceptItems = DoCreateCompareItem(group, studyUnits, group.GroupModel.ConceptCompareTable); Dictionary<string, List<CompareItem>> conceptMap = new Dictionary<string,List<CompareItem>>(); //同じ比較元、比較先のConceptScheme(親)をもつものは同じタグにぶら下げる必要があるためconceptMapを使って振り分けていく。 foreach (CompareItem item in conceptItems) { //親をユニークに識別するためのPaentIdはConcept_XXXXX_YYYYYという形式。 item.ParentIdPrefix = "Concept"; item.ParentSourceId = FindParentConceptSchemeIdByConceptId(studyUnits, item.SourceId); item.ParentTargetId = FindParentConceptSchemeIdByConceptId(studyUnits, item.TargetId); List<CompareItem> list = null; if (conceptMap.ContainsKey(item.ParentId)) { list = conceptMap[item.ParentId]; } else { list = new List<CompareItem>(); conceptMap[item.ParentId] = list; } list.Add(item); } //ConceptSchemeの対応を取得する List<CompareItem> conceptSchemeItems = DoCreateCompareItem(group, studyUnits, group.GroupModel.ConceptSchemeCompareTable); List<XElement> elements = new List<XElement>(); foreach (CompareItem item in conceptSchemeItems) { XElement element = CreateConceptSchemeElement(item, "Concept"); elements.Add(element); if (conceptMap.ContainsKey(item.Id)) { List<CompareItem> concepts = conceptMap[item.Id]; foreach (CompareItem childItem in concepts) { XElement childElement = CreateItemElement(childItem); element.Add(childElement); } conceptMap.Remove(item.Id); } } //残りのConceptMapを保存する。 foreach (KeyValuePair<string, List<CompareItem>> pair in conceptMap) { List<CompareItem> concepts = pair.Value; CompareItem first = concepts.First(); CompareItem parentItem = new CompareItem( first.ParentSourceId, first.ParentTargetId, Resources.GenerateForCmpareConcept, "0"); //Concept比較のために生成 XElement element = CreateConceptSchemeElement(parentItem, "Variable"); elements.Add(element); foreach (CompareItem childItem in concepts) { XElement childElement = CreateItemElement(childItem); element.Add(childElement); } } return elements; }
private XElement CreateComparison(GroupVM group, List<StudyUnitVM> studyUnits) { //グループの比較結果を保存する Group groupModel = group.GroupModel; //cm::Comparison XElement comparison = new XElement(cm + TAG_COMPARISON, CreateIDAttribute(groupModel.ComparisonId), CreateVersionAttribute(), CreateAgencyAttribute() ); //ConceptSchemeとConceptの比較結果のリスト List<XElement> conceptSchemeMaps = CreateConceptSchemeMap(group, studyUnits); foreach (XElement conceptSchemeMap in conceptSchemeMaps) { comparison.Add(conceptSchemeMap); } //Variableの比較結果のリスト List<XElement> variableMaps = CreateVariableMap(group, studyUnits); foreach (XElement variableMap in variableMaps) { comparison.Add(variableMap); } return comparison; }
private List<CompareItem> DoCreateCompareItem(GroupVM group, List<StudyUnitVM> studyUnits, CompareTable compareTable) { //■グループ比較テーブルを見て、CompareLitemの配列を返す。 //画面で使用するのはCompareRow。この内部はCompareCellの配列を持っている。 //これをDDI形式で使用するペア形式(CompareItem)の配列に変換する昨日を持つ。 // //■CompareItemに保存されるIDは、 //CompareTableがConceptSchemeのID、ConceptのID、VariableのIDのどれかになる。 List<CompareItem> items = new List<CompareItem>(); foreach (CompareRow row in compareTable.Rows) { //有効な○のセルをすべて取得して保存する。」 //有効な○のセルとは「○がセットされてる、かつその列のStudyUnitに行の変数がふくまれているもの」 // // S1にV1が、S2にV2が含まれている場合※の位置に入力された値は無視しないといけない。 // // S1 S2 // V1 ※ // V2 ※ //○の保存 List<CompareCell> matchCells = row.MatchValidCells(); if (matchCells.Count > 1) { //比較対象の○が存在しないと保存しない。○の場合次のように同じ行にペアで存在しないとだめ。 // S1 S2 // V1 ○ ○ //セルに該当する変数を取得する。同じStudyUnitに同じ変数名の変数が存在する可能性があるため //Listで処理する必要がある。 List<GroupId> sourceIds = row.RelatedGroupIds(matchCells[0]); for (int i = 1; i < matchCells.Count; i++) { List<GroupId> targetIds = row.RelatedGroupIds(matchCells[i]); foreach (GroupId sourceId in sourceIds) { foreach (GroupId targetId in targetIds) { CompareItem item = CompareItem.CreateMatch(sourceId, targetId, row.Memo); items.Add(item); } } } } //△の保存 List<CompareCell> partialMatchCells = row.PartialMatchValidCells(); foreach (CompareCell targetCell in partialMatchCells) { List<GroupId> targetIds = row.RelatedGroupIds(targetCell); //△の場合他の行と比較しているので対象の行をみつけないといけない。 //それには△(V1)のように選択されている対象の変数をタイトルでみつける //(行はタイトルでユニーク化されているのでひとつだけ見つかるはず)。 CompareRow sourceRow = compareTable.FindRowByTitle(targetCell.TargetTitle); //対象行の全ての有効なセルた処理対象。 // S1 S2 S3 //V1 △(V2) //V2 △(V1) △(V1) List<CompareCell> validCells = sourceRow.ValidCells(); foreach (CompareCell sourceCell in validCells) { List<GroupId> sourceIds = sourceRow.RelatedGroupIds(sourceCell); foreach (GroupId sourceId in sourceIds) { foreach (GroupId targetId in targetIds) { CompareItem item = CompareItem.CreatePartialMatch(sourceId, targetId, row.Memo); items.Add(item); } } } } //※いまのところ資料にある暗黙の関係性までは保存していない } return items; }
private List<XElement> CreateVariableMap(GroupVM group, List<StudyUnitVM> studyUnits) { List<CompareItem> variableItems = DoCreateCompareItem(group, studyUnits, group.GroupModel.VariableCompareTable); Dictionary<string, List<CompareItem>> variableMap = new Dictionary<string, List<CompareItem>>(); foreach (CompareItem item in variableItems) { item.ParentSourceId = FindParentConceptSchemeIdByVariableId(studyUnits, item.SourceId); item.ParentTargetId = FindParentConceptSchemeIdByVariableId(studyUnits, item.TargetId); List<CompareItem> list = null; if (variableMap.ContainsKey(item.ParentId)) { list = variableMap[item.ParentId]; } if (list == null) { list = new List<CompareItem>(); variableMap[item.ParentId] = list; } list.Add(item); } List<XElement> elements = new List<XElement>(); foreach (KeyValuePair<string, List<CompareItem>> pair in variableMap) { List<CompareItem> variables = pair.Value; CompareItem first = variables.First(); CompareItem parentItem = new CompareItem( first.ParentSourceId, first.ParentTargetId, Resources.GenerateForCmpareVariable, "0"); //Variable比較のために生成 XElement element = CreateVariableElement(parentItem); elements.Add(element); foreach (CompareItem childItem in variables) { XElement childElement = CreateItemElement(childItem); element.Add(childElement); } } return elements; }
private XElement CreateSharedStudyUnit(GroupVM group) { XElement su = new XElement(g + TAG_STUDY_UNIT); StudyUnitVM sharedStudyUnit = new StudyUnitVM(group.Main, group.GroupModel.SharedStudyUnit); this.studyUnit = sharedStudyUnit; su.Add(CreateStudyUnit()); if (HasError) { DumpError(); } int errorCount = RemoveError(sharedStudyUnit); if (errorCount > 0) { //エラーが発生した場合は出力しない(他のStudyUnitと区別できない?) return null; } return su; }