示例#1
0
        public static async Task <List <HitomiIndexMetadata> > Search3(HitomiDataQuery query)
        {
            int number = Environment.ProcessorCount;
            int term   = HitomiData.Instance.metadata_collection.Count / number;

            List <Task <List <HitomiIndexMetadata> > > arr_task = new List <Task <List <HitomiIndexMetadata> > >();

            for (int i = 0; i < number; i++)
            {
                int k = i;
                if (k != number - 1)
                {
                    arr_task.Add(new Task <List <HitomiIndexMetadata> >(() => search_internal(query, k * term, k * term + term)));
                }
                else
                {
                    arr_task.Add(new Task <List <HitomiIndexMetadata> >(() => search_internal(query, k * term, HitomiData.Instance.metadata_collection.Count)));
                }
            }

            Parallel.ForEach(arr_task, task => task.Start());
            await Task.WhenAll(arr_task);

            List <HitomiIndexMetadata> result = new List <HitomiIndexMetadata>();

            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
        private static List <HitomiIndexMetadata> search_internal(HitomiDataQuery query, int starts, int ends)
        {
            List <HitomiIndexMetadata> result = new List <HitomiIndexMetadata>();

            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 = "n/a"; //v.Language;
                if (v.Language >= 0)
                {
                    lang = HitomiData.Instance.index.Languages[v.Language];
                }
                if (Settings.Instance.Model.Language != "all" &&
                    Settings.Instance.Model.Language != lang)
                {
                    continue;
                }
                if (query.Language != null &&
                    query.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 => HitomiData.Instance.index.Tags[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);
                    if (v.Tags != null)
                    {
                        IntersectCountSplit(v.Tags.Select(x => HitomiData.Instance.index.Tags[x]).ToArray(), query.Common, ref check);
                    }
                    if (v.Artists != null)
                    {
                        IntersectCountSplit(v.Artists.Select(x => HitomiData.Instance.index.Artists[x]).ToArray(), query.Common, ref check);
                    }
                    if (v.Groups != null)
                    {
                        IntersectCountSplit(v.Groups.Select(x => HitomiData.Instance.index.Groups[x]).ToArray(), query.Common, ref check);
                    }
                    if (v.Parodies != null)
                    {
                        IntersectCountSplit(v.Parodies.Select(x => HitomiData.Instance.index.Series[x]).ToArray(), query.Common, ref check);
                    }
                    if (v.Characters != null)
                    {
                        IntersectCountSplit(v.Characters.Select(x => HitomiData.Instance.index.Characters[x]).ToArray(), 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.Select(x => HitomiData.Instance.index.Artists[x]).ToArray(), 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.Select(x => HitomiData.Instance.index.Tags[x]).ToArray(), 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.Select(x => HitomiData.Instance.index.Groups[x]).ToArray(), 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.Select(x => HitomiData.Instance.index.Series[x]).ToArray(), 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.Select(x => HitomiData.Instance.index.Characters[x]).ToArray(), query.Characters); connect = true;
                }
                else if (query.Characters != null)
                {
                    check[0] = false;
                }
                if (check[0] && v.Type != null && query.Type != null)
                {
                    check[0] = query.Type.Any(x => v.Type >= 0 && x == HitomiData.Instance.index.Types[v.Type].Replace(' ', '_')); connect = true;
                }
                else if (query.Type != 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);
        }