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);
        }
예제 #2
0
        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);
        }
예제 #4
0
        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);
        }