public Exceptional<ResultType> RebuildIndex(String myIndexName, String myIndexEdition, GraphDBType myDBTypeStream, IndexSetStrategy myIndexSetStrategy) { var objectLocation = new ObjectLocation(myDBTypeStream.ObjectLocation, DBConstants.DBObjectsLocation); IEnumerable<String> allDBOLocations = null; try { allDBOLocations = _DBContext.DBObjectManager.GetAllStreamsRecursive(objectLocation, DBConstants.DBOBJECTSTREAM); } catch (Exception e) { return new Exceptional<ResultType>(new Error_RebuildIndexFailed(myIndexName, myIndexEdition, e.Message)); } try { var index = myDBTypeStream.GetAttributeIndex(myIndexName, myIndexEdition); index.ClearAndRemoveFromDisc(this); foreach (var loc in allDBOLocations) { var dbo = _DBContext.DBObjectManager.LoadDBObject(new ObjectLocation(myDBTypeStream.ObjectLocation, DBConstants.DBObjectsLocation, _DBContext.DBObjectManager.GetDBObjectStreamShard(myDBTypeStream, new ObjectUUID(loc)), loc)); if (dbo.Failed()) { return new Exceptional<ResultType>(dbo); } if (!dbo.Value.ObjectLocation.Contains(loc)) { //NLOG: temporarily commented ////_Logger.Error("Could not found the correct DBObject for Location " + loc + " the ObjectUUID is now " + dbo.Value.ObjectUUID.ToString()); } else { if (dbo.Value.HasAtLeastOneAttribute(index.IndexKeyDefinition.IndexKeyAttributeUUIDs, myDBTypeStream, null)) { var insertResult = index.Insert(dbo.Value, myIndexSetStrategy, myDBTypeStream, _DBContext); if (!insertResult.Success()) { return new Exceptional<ResultType>(insertResult); } } } } } catch (GraphDBException pe) { var _Exceptional = new Exceptional<ResultType>(); foreach (var _ex in pe.GraphDBErrors) _Exceptional.PushIError(_ex); return _Exceptional; } catch (GraphFSException_IndexKeyAlreadyExist) { //NLOG: temporarily commented ////_Logger.ErrorException("GraphFSException_IndexKeyAlreadyExist", ikae); return new Exceptional<ResultType>(new Error_UniqueConstrainViolation(myDBTypeStream.Name, myIndexName)); } catch { return new Exceptional<ResultType>(new Error_IndexDoesNotExist(myIndexName, myIndexEdition)); } return new Exceptional<ResultType>(ResultType.Successful); }
/// <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; }
public Exceptional<ResultType> RebuildIndex(String myIndexName, String myIndexEdition, GraphDBType myDBTypeStream, IndexSetStrategy myIndexSetStrategy) { var objectLocation = new ObjectLocation(myDBTypeStream.ObjectLocation, DBConstants.DBObjectsLocation); var allDBOLocations = _IGraphFSSession.GetFilteredDirectoryListing(objectLocation, null, null, null, new List<String>(new String[] { DBConstants.DBOBJECTSTREAM }), null, null, null, null, null, null); if (allDBOLocations.Failed() && allDBOLocations.IErrors.First().GetType() != typeof(GraphFSError_ObjectLocatorNotFound)) return new Exceptional<ResultType>(allDBOLocations); try { var index = myDBTypeStream.GetAttributeIndex(myIndexName, myIndexEdition); index.ClearAndRemoveFromDisc(this); if (allDBOLocations.Value != null) { foreach (var loc in allDBOLocations.Value) { var dbo = _DBContext.DBObjectManager.LoadDBObject(new ObjectLocation(myDBTypeStream.ObjectLocation, DBConstants.DBObjectsLocation, loc)); if (dbo.Failed()) { return new Exceptional<ResultType>(dbo); } if (!dbo.Value.ObjectLocation.Contains(loc)) { //NLOG: temporarily commented ////_Logger.Error("Could not found the correct DBObject for Location " + loc + " the ObjectUUID is now " + dbo.Value.ObjectUUID.ToString()); } else { if (dbo.Value.HasAtLeastOneAttribute(index.IndexKeyDefinition.IndexKeyAttributeUUIDs, myDBTypeStream, null)) { var insertResult = index.Insert(dbo.Value, myIndexSetStrategy, myDBTypeStream, _DBContext); if (!insertResult.Success()) { return new Exceptional<ResultType>(insertResult); } } } } } } catch (GraphDBException pe) { var _Exceptional = new Exceptional<ResultType>(); foreach (var _ex in pe.GraphDBErrors) _Exceptional.PushIError(_ex); return _Exceptional; } catch (GraphFSException_IndexKeyAlreadyExist) { //NLOG: temporarily commented ////_Logger.ErrorException("GraphFSException_IndexKeyAlreadyExist", ikae); return new Exceptional<ResultType>(new Error_UniqueConstrainViolation(myDBTypeStream.Name, myIndexName)); } catch { return new Exceptional<ResultType>(new Error_IndexDoesNotExist(myIndexName, myIndexEdition)); } return new Exceptional<ResultType>(ResultType.Successful); }