public static async Task <List <HitomiMetadata> > Search3(HitomiDataQuery query) { int number = Environment.ProcessorCount; int term = HitomiData.Instance.metadata_collection.Count / number; List <Task <List <HitomiMetadata> > > arr_task = new List <Task <List <HitomiMetadata> > >(); for (int i = 0; i < number; i++) { int k = i; if (k != number - 1) { arr_task.Add(new Task <List <HitomiMetadata> >(() => search_internal(query, k * term, k * term + term))); } else { arr_task.Add(new Task <List <HitomiMetadata> >(() => search_internal(query, k * term, HitomiData.Instance.metadata_collection.Count))); } } Parallel.ForEach(arr_task, task => task.Start()); await Task.WhenAll(arr_task); List <HitomiMetadata> result = new List <HitomiMetadata>(); for (int i = 0; i < number; i++) { result.AddRange(arr_task[i].Result); } result.Sort((a, b) => b.ID - a.ID); return(result); }
public static List <HitomiMetadata> Search2(HitomiDataQuery query) { List <HitomiMetadata> result = new List <HitomiMetadata>(); foreach (var v in HitomiData.Instance.metadata_collection) { if (query.Common.Contains(v.ID.ToString())) { result.Add(v); continue; } if (v.Language != "korean") { continue; } if (query.TagExclude != null) { if (v.Tags != null) { int intersec_count = 0; foreach (var tag in query.TagExclude) { foreach (var vtag in v.Tags) { if (vtag.ToLower().Replace(' ', '_') == tag.ToLower()) { intersec_count++; break; } } if (intersec_count > 0) { break; } } if (intersec_count > 0) { continue; } } } bool[] check = new bool[query.Common.Count]; if (query.Common != null) { IntersectCountSplit(v.Name.Split(' '), query.Common, ref check); IntersectCountSplit(v.Tags, query.Common, ref check); IntersectCountSplit(v.Artists, query.Common, ref check); IntersectCountSplit(v.Groups, query.Common, ref check); IntersectCountSplit(v.Parodies, query.Common, ref check); IntersectCountSplit(v.Characters, query.Common, ref check); } bool connect = false; if (check.Length == 0) { check = new bool[1]; check[0] = true; } if (check[0] && v.Artists != null && query.Artists != null) { check[0] = IsIntersect(v.Artists, query.Artists); connect = true; } else if (query.Artists != null) { check[0] = false; } if (check[0] && v.Tags != null && query.TagInclude != null) { check[0] = IsIntersect(v.Tags, query.TagInclude); connect = true; } else if (query.TagInclude != null) { check[0] = false; } if (check[0] && v.Groups != null && query.Groups != null) { check[0] = IsIntersect(v.Groups, query.Groups); connect = true; } else if (query.Groups != null) { check[0] = false; } if (check[0] && v.Parodies != null && query.Series != null) { check[0] = IsIntersect(v.Parodies, query.Series); connect = true; } else if (query.Series != null) { check[0] = false; } if (check[0] && v.Characters != null && query.Characters != null) { check[0] = IsIntersect(v.Characters, query.Characters); connect = true; } else if (query.Characters != null) { check[0] = false; } if (check.All((x => x)) && ((query.Common.Count == 0 && connect) || query.Common.Count > 0)) { result.Add(v); } } result.Sort((a, b) => b.ID - a.ID); return(result); }
private static List <HitomiMetadata> search_internal(HitomiDataQuery query, int starts, int ends) { List <HitomiMetadata> result = new List <HitomiMetadata>(); for (int i = starts; i < ends; i++) { var v = HitomiData.Instance.metadata_collection[i]; if (query.Common.Contains(v.ID.ToString())) { result.Add(v); continue; } string lang = v.Language; if (v.Language == null) { lang = "N/A"; } if (HitomiSetting.Instance.GetModel().Language != "ALL" && HitomiSetting.Instance.GetModel().Language != lang) { continue; } if (query.TagExclude != null) { if (v.Tags != null) { int intersec_count = 0; foreach (var tag in query.TagExclude) { if (v.Tags.Any(vtag => vtag.ToLower().Replace(' ', '_') == tag.ToLower())) { intersec_count++; } if (intersec_count > 0) { break; } } if (intersec_count > 0) { continue; } } } bool[] check = new bool[query.Common.Count]; if (query.Common.Count > 0) { IntersectCountSplit(v.Name.Split(' '), query.Common, ref check); IntersectCountSplit(v.Tags, query.Common, ref check); IntersectCountSplit(v.Artists, query.Common, ref check); IntersectCountSplit(v.Groups, query.Common, ref check); IntersectCountSplit(v.Parodies, query.Common, ref check); IntersectCountSplit(v.Characters, query.Common, ref check); } bool connect = false; if (check.Length == 0) { check = new bool[1]; check[0] = true; } if (check[0] && v.Artists != null && query.Artists != null) { check[0] = IsIntersect(v.Artists, query.Artists); connect = true; } else if (query.Artists != null) { check[0] = false; } if (check[0] && v.Tags != null && query.TagInclude != null) { check[0] = IsIntersect(v.Tags, query.TagInclude); connect = true; } else if (query.TagInclude != null) { check[0] = false; } if (check[0] && v.Groups != null && query.Groups != null) { check[0] = IsIntersect(v.Groups, query.Groups); connect = true; } else if (query.Groups != null) { check[0] = false; } if (check[0] && v.Parodies != null && query.Series != null) { check[0] = IsIntersect(v.Parodies, query.Series); connect = true; } else if (query.Series != null) { check[0] = false; } if (check[0] && v.Characters != null && query.Characters != null) { check[0] = IsIntersect(v.Characters, query.Characters); connect = true; } else if (query.Characters != null) { check[0] = false; } if (check.All((x => x)) && ((query.Common.Count == 0 && connect) || query.Common.Count > 0)) { result.Add(v); } } // required result.Sort((a, b) => b.ID - a.ID); return(result); }
public List <HitomiMetadata> Search(HitomiDataQuery query) { List <HitomiMetadata> result = new List <HitomiMetadata>(); foreach (var v in data.metadata_collection) { if (v.Language != "korean") { continue; } bool put = true; if (query.TagInclude != null) { if (v.Tags != null) { int intersec_count = 0; foreach (var tag in query.TagInclude) { foreach (var vtag in v.Tags) { if (vtag.ToLower().Contains(tag.ToLower())) { intersec_count++; break; } } } if (intersec_count != query.TagInclude.Count) { put = false; } } else { put = false; } } if (put && query.TagExclude != null) { if (v.Tags != null) { int intersec_count = 0; foreach (var tag in query.TagExclude) { foreach (var vtag in v.Tags) { if (vtag.ToLower().Contains(tag.ToLower())) { intersec_count++; break; } } if (intersec_count > 0) { break; } } if (intersec_count > 0) { put = false; } } else { put = true; } } if (put && query.Title != null) { if (v.Name != null) { int intersec_count = 0; foreach (var tc in query.Title) { if (v.Name.ToLower().Contains(tc.ToLower())) { intersec_count++; } } if (intersec_count != query.Title.Count) { put = false; } } else { put = false; } } if (put && query.Artists != null) { if (v.Artists != null) { int intersec_count = 0; foreach (var tc in query.Artists) { foreach (var vtag in v.Artists) { if (vtag.ToLower().Contains(tc.ToLower())) { intersec_count++; break; } } } if (intersec_count != query.Artists.Count) { put = false; } } else { put = false; } } if (put) { result.Add(v); } } result.Sort((a, b) => a.ID - b.ID); return(result); }