/// <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))); }
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 )); }
// 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]]))); }