예제 #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 /// <param name="mask"></param>
 /// <returns></returns>
 public static bool EqualsWithMask(this Edge a, Edge b, TripleMask mask)
 {
     return((!mask.HasFlag(TripleMask.Subject) || a.Subject.Equals(b.Subject)) &&
            (!mask.HasFlag(TripleMask.Predicate) || a.Predicate.Equals(b.Predicate)) &&
            (!mask.HasFlag(TripleMask.Object) || a.Object.Equals(b.Object)) &&
            (!mask.HasFlag(TripleMask.Context) || a.Context.Equals(b.Context)));
 }
예제 #2
0
 public static IndexKey Create(Edge triple, TripleMask index)
 {
     return(new IndexKey
            (
                index.HasFlag(IndexCoverage.Subject) ? triple.Subject : null,
                index.HasFlag(IndexCoverage.Predicate) ? triple.Predicate : null,
                index.HasFlag(IndexCoverage.Object) ? triple.Object : null,
                index.HasFlag(IndexCoverage.Context) ? triple.Context : null
            ));
 }
예제 #3
0
        // Selects the best index in the supplied IndexCoverage for the given set.
        // Returns a tuple<index, remaining bitfield>
        /// <summary>
        ///
        /// </summary>
        /// <param name="coverage"></param>
        /// <param name="mask"></param>
        /// <returns></returns>
        public static Tuple <IndexCoverage, TripleMask> SelectIndex(this IndexCoverage coverage, TripleMask mask)
        {
            if (mask == TripleMask.None)
            {
                return(Tuple.Create(IndexCoverage.None, TripleMask.None));
            }

            // The prefered order of indices.
            byte[] pref = { 10, 13, 12, 11, 5, 4, 7, 6, 8, 9, 0, 2, 1, 3 };

            // The bitmask for each index.
            byte[] table = { 1, 2, 4, 8, 3, 5, 9, 6, 10, 12, 7, 11, 13, 14 };

            int i;

            for (i = 0; i < 14; i++)
            {
                if (((int)mask & table[pref[i]]) == table[pref[i]] && coverage.HasFlag((IndexCoverage)(1 << pref[i])))
                {
                    break;
                }
            }

            return(Tuple.Create((IndexCoverage)(1 << pref[i]), (TripleMask)((int)mask & ~table[pref[i]])));
        }