public override Exceptional<IObject> Aggregate(AAttributeIndex attributeIndex, GraphDBType graphDBType, DBContext dbContext) { if (attributeIndex is UUIDIndex) { return new Exceptional<IObject>(new Error_NotImplemented(new System.Diagnostics.StackTrace(true), "Aggregating attribute UUID is not implemented!")); } else { var indexRelatedType = dbContext.DBTypeManager.GetTypeByUUID(attributeIndex.IndexRelatedTypeUUID); // HACK: rewrite as soon as we have real attribute index keys if (attributeIndex.IndexKeyDefinition.IndexKeyAttributeUUIDs.Count != 1) { return new Exceptional<IObject>(new Error_NotImplemented(new System.Diagnostics.StackTrace(true))); } var typeAttr = graphDBType.GetTypeAttributeByUUID(attributeIndex.IndexKeyDefinition.IndexKeyAttributeUUIDs.First()); ADBBaseObject oneVal = typeAttr.GetADBBaseObjectType(dbContext.DBTypeManager); return new Exceptional<IObject>(attributeIndex.GetKeyValues(indexRelatedType, dbContext).AsParallel().Select(kv => { var mul = oneVal.Clone(kv.Key); mul.Mul(oneVal.Clone(kv.Value.Count())); return mul; }).Aggregate(oneVal.Clone(), (elem, result) => { result.Add(elem); return result; })); } }
public virtual IEnumerable<ObjectUUID> IndexSingleOperation(AAttributeIndex myIndex, ADBBaseObject myOperationValue, AttributeUUID myAttributeUUID, TypesOfBinaryExpression typeOfBinExpr, DBContext dbContext) { foreach (var keyValPair in myIndex.GetKeyValues(dbContext.DBTypeManager.GetTypeByUUID(myIndex.IndexRelatedTypeUUID), dbContext)) { var res = Compare(keyValPair.Key.IndexKeyValues[0], myOperationValue); if (res.Failed()) { throw new GraphDBException(res.PushIError(new Error_InvalidIndexOperation(myIndex.IndexName, keyValPair.Key.IndexKeyValues[0].Value, myOperationValue.Value)).IErrors); } if (res.Value) { foreach (var aUUID in keyValPair.Value) { yield return aUUID; } } } yield break; }
public override Exceptional<FuncParameter> Aggregate(AAttributeIndex attributeIndex, GraphDBType graphDBType, DBContext dbContext) { if (attributeIndex.IsUUIDIndex) { return new Exceptional<FuncParameter>(new Error_NotImplemented(new System.Diagnostics.StackTrace(true), "AVG(UUID) is not implemented!")); } var indexRelatedType = dbContext.DBTypeManager.GetTypeByUUID(attributeIndex.IndexRelatedTypeUUID); // HACK: rewrite as soon as we have real attribute index keys ADBBaseObject aADBBaseObject = new DBDouble(DBObjectInitializeType.Default); DBUInt64 total = new DBUInt64((UInt64)0); foreach (var idxEntry in attributeIndex.GetKeyValues(indexRelatedType, dbContext)) { aADBBaseObject.Add(aADBBaseObject.Clone(idxEntry.Key)); total += (UInt64)idxEntry.Value.LongCount(); } aADBBaseObject.Div(total); return new Exceptional<FuncParameter>(new FuncParameter(aADBBaseObject)); }
public override IEnumerable<ObjectUUID> IndexSingleOperation(AAttributeIndex myIndex, ADBBaseObject myOperationValue, AttributeUUID myAttributeUUID, TypesOfBinaryExpression typeOfBinExpr, DBContext dbContext) { IndexKey lookup = new IndexKey(myAttributeUUID, myOperationValue, myIndex.IndexKeyDefinition); var currentType = dbContext.DBTypeManager.GetTypeByUUID(myIndex.IndexRelatedTypeUUID); var result = myIndex.Contains(lookup, currentType, dbContext); if (result.Value) { var interestingUUIDs = myIndex.GetValues(lookup, currentType, dbContext); foreach (var aIndexValue in myIndex.GetAllValues(currentType, dbContext)) { foreach (var aUUID in aIndexValue) { if (!interestingUUIDs.Contains(aUUID)) { yield return aUUID; } } } } else { foreach (var aIndexValue in myIndex.GetKeyValues(currentType, dbContext).Select(kv => kv.Value)) { foreach (var aUUID in aIndexValue) { yield return aUUID; } } } yield break; }