public void Process(ResultItems resultItems, ITask task) { var resultItemsAll = resultItems.GetAll(); foreach (var item in resultItemsAll) { if (item.Value is IMultiPageModel multiPageModel) { pageMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), false); lock (this) { pageMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), true); var otherPages = multiPageModel.GetOtherPages(); if (otherPages?.Count > 0) { foreach (var otherPage in otherPages) { if (pageMap.Get(multiPageModel.GetPageKey(), otherPage) == false) { pageMap.Put(multiPageModel.GetPageKey(), otherPage, false); } } } var booleanMap = pageMap.Get(multiPageModel.GetPageKey()); objectMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), multiPageModel); if (booleanMap == null) { return; } foreach (var stringBooleanEntry in booleanMap) { if (!stringBooleanEntry.Value) { booleanMap.Remove(stringBooleanEntry.Key); return; } } var range = objectMap.Get(multiPageModel.GetPageKey()); var entryList = range.ToList(); if (entryList.Count > 0) { //entryList.Sort(); //pai xu sort var value = entryList[0].Value; for (int i = 1; i < entryList.Count; i++) { value = value.Combine(entryList[i].Value); } resultItemsAll[item.Key] = value; } } } } }
private void HandleObject(DictionaryEntry iterator, out bool needDelete) { needDelete = false; object o = iterator.Value; var model = o as IMultiPageModel; if (model != null) { IMultiPageModel multiPageModel = model; _pageMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), true); if (multiPageModel.GetOtherPages() != null) { foreach (string otherPage in multiPageModel.GetOtherPages()) { bool aBoolean = _pageMap.Get(multiPageModel.GetPageKey(), otherPage); if (!aBoolean) { _pageMap.Put(multiPageModel.GetPageKey(), otherPage, false); } } } //check if all pages are processed Dictionary <string, bool> booleanMap = _pageMap.Get(multiPageModel.GetPageKey()); _objectMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), multiPageModel); if (booleanMap == null) { return; } if (booleanMap.Any(stringBooleanEntry => !stringBooleanEntry.Value)) { needDelete = true; return; } List <EntryObject> entryList = _objectMap.Get(multiPageModel.GetPageKey()).Select(entry => new EntryObject() { Entry = entry }).ToList(); if (entryList.Count != 0) { entryList.Sort(); IMultiPageModel value = entryList[0].Entry.Value; for (int i = 1; i < entryList.Count; i++) { value = value.Combine(entryList[i].Entry.Value); } iterator.Value = value; } } }
/// <summary> /// Adds a function if it does not currently /// exist in the registry, or replaces the existing one /// with the same signature. /// </summary> /// <param name="func">A function</param> public void Add(IGeometryFunction func) { _functions.Add(func); _sortedFunctions.Add(func.Name, func); _categorizedFunctions.Put(func.Category, func.Name, func); if (HasGeometryResult(func)) { _categorizedGeometryFunctions.Put(func.Category, func.Name, func); } }
public void Process(ResultItems resultItems, ITask task) { var resultItemsAll = resultItems.GetAll(); foreach (var item in resultItemsAll) { var o = item.Value; if (o is IMultiPageModel multiPageModel) { pageMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), false); //每个key单独加锁 lock (pageMap.Get(multiPageModel.GetPageKey())) { pageMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), true); //其他需要拼凑的部分 if (multiPageModel.GetOtherPages() != null) { foreach (var otherPage in multiPageModel.GetOtherPages()) { var aBoolean = pageMap.Get(multiPageModel.GetPageKey(), otherPage); pageMap.Put(multiPageModel.GetPageKey(), otherPage, false); } } //check if all pages are processed var booleanMap = pageMap.Get(multiPageModel.GetPageKey()); objectMap.Put(multiPageModel.GetPageKey(), multiPageModel.GetPage(), multiPageModel); if (booleanMap == null) { return; } // /过滤,这次完成的page item中,还未拼凑完整的item,不进入下一个pipeline foreach (var stringBooleanEntry in booleanMap) { if (!stringBooleanEntry.Value) { //item.remove(); return; } } var entryList = new List <KeyValuePair <String, IMultiPageModel> >(); entryList.AddRange(objectMap.Get(multiPageModel.GetPageKey())); if (entryList.Count != 0) { var comparison = new Comparison <KeyValuePair <string, IMultiPageModel> > ((KeyValuePair <string, IMultiPageModel> d1, KeyValuePair <string, IMultiPageModel> d2) => { try { int i1 = int.Parse(d1.Key); int i2 = int.Parse(d2.Key); return(i1 - i2); } catch { return(d1.Key.CompareTo(d2.Key)); } }); entryList.Sort(comparison); } // 合并 var value = entryList[0].Value; for (int i = 1; i < entryList.Count; i++) { value = value.Combine(entryList[i].Value); } } } } }