/// <summary> /// Loads an index from a corresponding type. /// </summary> /// <param name="myAttribute">The interesting attribute.</param> /// <param name="dbContext">The TypeManager of the database.</param> /// <param name="myType">The type of the interesing attribute.</param> /// <returns></returns> protected IEnumerable<Tuple<GraphDBType, AAttributeIndex>> GetIndex(TypeAttribute myAttribute, DBContext dbContext, GraphDBType myType, Object myExtraordinary) { #region INPUT EXCEPTIONS if (myType == null || myAttribute == null || dbContext == null) { throw new ArgumentNullException(); } #endregion if (myExtraordinary == null) { #region eventual speedup //direct match of idx if (myType.HasAttributeIndices(myAttribute.UUID)) { yield return new Tuple<GraphDBType, AAttributeIndex>(myType, myType.GetAttributeIndex(dbContext, new IndexKeyDefinition(myAttribute.UUID), null).Value); } else { //no direct match... lets try the subtypes foreach (var aSubType in dbContext.DBTypeManager.GetAllSubtypes(myType, true)) { if (aSubType.HasAttributeIndices(myAttribute.UUID)) { yield return new Tuple<GraphDBType, AAttributeIndex>(aSubType, aSubType.GetAttributeIndex(dbContext, new IndexKeyDefinition(myAttribute.UUID), null).Value); } else { yield return new Tuple<GraphDBType, AAttributeIndex>(aSubType, aSubType.GetUUIDIndex(dbContext)); } } } #endregion } else { var checkResult = myType.HasAttributeIndices(myExtraordinary as IDChainDefinition); if (checkResult.Failed()) { throw new GraphDBException(checkResult.IErrors); } if (checkResult.Value) { yield return new Tuple<GraphDBType, AAttributeIndex>(myType, myType.GetAttributeIndex(dbContext, myExtraordinary as IDChainDefinition).Value); } else { foreach (var aSubType in dbContext.DBTypeManager.GetAllSubtypes(myType, true)) { yield return new Tuple<GraphDBType, AAttributeIndex>(aSubType, aSubType.GetUUIDIndex(dbContext)); } } } yield break; }