public static void RemoveDuplicatedDisjuncts(ArrayList<ArrayList<QueryToken>> disjuncts)
        {
            IEqualityComparer<string> tokenComparer = new DefaultTokenComparer(DefaultTokenComparer.Options.ConvertUmlauts | DefaultTokenComparer.Options.RemoveDiacritics);

            ArrayList<int> disjunctsToRemove = new ArrayList<int>();

            for (int i = 0; i < disjuncts.Count(); ++i)
                for (int j = i + 1; j < disjuncts.Count(); ++j)
                {
                    if (ContainsTokenSubset(disjuncts.ElementAt(j), disjuncts.ElementAt(i)))
                    {
                        disjunctsToRemove.Add(i);
                        break;
                    }
                }

            disjunctsToRemove.Sort();
            disjunctsToRemove.Reverse();

            foreach (var toRemove in disjunctsToRemove.Distinct())
                disjuncts.RemoveAt(toRemove);
        }
        private static ArrayList<ArrayList<QueryToken>> GetSubsets(ArrayList<QueryToken> array)
        {
            ArrayList<ArrayList<QueryToken>> subsets = new ArrayList<ArrayList<QueryToken>>();
            int count = 1 << array.Count; // 2^n

            for (int i = 1; i < count; i++)
            {
                ArrayList<QueryToken> subsetTerms = new ArrayList<QueryToken>();
                BitArray bitArray = new BitArray(BitConverter.GetBytes(i));

                for (int bit = 0; bit < bitArray.Count; bit++)
                {
                    if (bitArray[bit])
                        subsetTerms.Add(array.ElementAt(bit));
                }

                if (subsetTerms.Count > 0)
                    subsets.Add(subsetTerms);
                Debug.Assert(subsetTerms.Count > 0, "QueryConverterUtils.GetSubsets: subsetTerms.Count shoudln't be 0!");
            }

            return subsets;
        }
        private static void RemoveDisjunctsContainingSubsets(ArrayList<ArrayList<QueryToken>> disjuncts, ArrayList<QueryToken> subset)
        {
            ArrayList<int> disjunctsToRemove = new ArrayList<int>();
           
            for (int i = 0; i < disjuncts.Count(); ++i)
            {
                if (ContainsTokenSubset(subset, disjuncts.ElementAt(i)))
                    disjunctsToRemove.Add(i);
            }

            disjunctsToRemove.Sort();
            disjunctsToRemove.Reverse();

            foreach (var toRemove in disjunctsToRemove.Distinct())
            {
                disjuncts.RemoveAt(toRemove);
            }
        }
        public void ElementAtShouldNotAllowIndexOutOfRange()
        {
            var target = new ArrayList();
            var ex = Assert.Throws<ArgumentOutOfRangeException>( () => target.ElementAt( -1 ) );
            Assert.Equal( "index", ex.ParamName );

            ex = Assert.Throws<ArgumentOutOfRangeException>( () => target.ElementAt( 1 ) );
            Assert.Equal( "index", ex.ParamName );
        }