internal static IOdbComparable BuildIndexKey(string indexName, AttributeValuesMap values, IList <string> fields) { if (fields.Count == 1) { return(new SimpleCompareKey(values.GetComparable(fields[0]))); } var keys = new IOdbComparable[fields.Count]; for (var i = 0; i < fields.Count; i++) { try { var @object = (IComparable)values[fields[i]]; keys[i] = new SimpleCompareKey(@object); } catch (Exception) { throw new OdbRuntimeException( NDatabaseError.IndexKeysMustImplementComparable.AddParameter(indexName).AddParameter(fields[i]). AddParameter(values[fields[i]].GetType().FullName)); } } return(new ComposedCompareKey(keys)); }
internal static IOdbComparable BuildIndexKey(string indexName, NonNativeObjectInfo oi, int[] fieldIds) { var keys = new IOdbComparable[fieldIds.Length]; for (var i = 0; i < fieldIds.Length; i++) { try { var aoi = oi.GetAttributeValueFromId(fieldIds[i]); var item = (IComparable) aoi.GetObject(); // If the index is on NonNativeObjectInfo, then the key is the oid of the object if (aoi.IsNonNativeObject()) { var nnoi = (NonNativeObjectInfo) aoi; item = nnoi.GetOid(); } keys[i] = new SimpleCompareKey(item); } catch (Exception) { throw new OdbRuntimeException( NDatabaseError.IndexKeysMustImplementComparable.AddParameter(indexName).AddParameter(fieldIds[i]).AddParameter( oi.GetAttributeValueFromId(fieldIds[i]).GetType().FullName)); } } return keys.Length == 1 ? keys[0] : new ComposedCompareKey(keys); }
public void ObjectMatch(OID oid, object o, IOdbComparable orderByKey) { var nnoi = (NonNativeObjectInfo)o; if (_inMemory) { if (_returnObjects) { if (_queryHasOrderBy) { _result.AddWithKey(orderByKey, (T)GetCurrentInstance(nnoi)); } else { _result.Add((T)GetCurrentInstance(nnoi)); } } } else { if (_queryHasOrderBy) { _result.AddWithKey(orderByKey, (T)oid); } else { _result.AddOid(oid); } } }
internal static IOdbComparable BuildIndexKey(string indexName, NonNativeObjectInfo oi, int[] fieldIds) { var keys = new IOdbComparable[fieldIds.Length]; for (var i = 0; i < fieldIds.Length; i++) { try { var aoi = oi.GetAttributeValueFromId(fieldIds[i]); var item = (IComparable)aoi.GetObject(); // If the index is on NonNativeObjectInfo, then the key is the oid of the object if (aoi.IsNonNativeObject()) { var nnoi = (NonNativeObjectInfo)aoi; item = nnoi.GetOid(); } keys[i] = new SimpleCompareKey(item); } catch (Exception) { throw new OdbRuntimeException( NDatabaseError.IndexKeysMustImplementComparable.AddParameter(indexName).AddParameter(fieldIds[i]).AddParameter( oi.GetAttributeValueFromId(fieldIds[i]).GetType().FullName)); } } return(keys.Length == 1 ? keys[0] : new ComposedCompareKey(keys)); }
public void ObjectMatch(OID oid, IOdbComparable orderByKey) { if (_queryHasOrderBy) { _result.AddWithKey(orderByKey, (T)oid); } else { _result.Add((T)oid); } }
private void Merge(IOdbComparable key, IValues values) { while (values.HasNext()) { if (_queryHasOrderBy) { _result.AddWithKey(key, values.NextValues()); } else { _result.Add(values.NextValues()); } } }
// This method os not used in Values Query API public void ObjectMatch(OID oid, object @object, IOdbComparable orderByKey) { var values = (AttributeValuesMap)@object; var groupByKey = IndexTool.BuildIndexKey("GroupBy", values, _groupByFieldList); var result = _groupByResult[groupByKey]; if (result == null) { result = new ValuesQueryResultAction(_query, null, _instanceBuilder); result.Start(); _groupByResult.Add(groupByKey, result); } result.ObjectMatch(oid, @object, orderByKey); }
// This method os not used in Values Query API public void ObjectMatch(OID oid, object @object, IOdbComparable orderByKey) { if (_query.IsMultiRow()) { var values = ConvertObject((AttributeValuesMap)@object); if (_queryHasOrderBy) { _result.AddWithKey(orderByKey, values); } else { _result.Add(values); } } else { Compute((AttributeValuesMap)@object); } }
internal static IOdbComparable BuildIndexKey(string indexName, AttributeValuesMap values, IList<string> fields) { if (fields.Count == 1) return new SimpleCompareKey(values.GetComparable(fields[0])); var keys = new IOdbComparable[fields.Count]; for (var i = 0; i < fields.Count; i++) { try { var @object = (IComparable) values[fields[i]]; keys[i] = new SimpleCompareKey(@object); } catch (Exception) { throw new OdbRuntimeException( NDatabaseError.IndexKeysMustImplementComparable.AddParameter(indexName).AddParameter(fields[i]). AddParameter(values[fields[i]].GetType().FullName)); } } return new ComposedCompareKey(keys); }
public void ObjectMatch(OID oid, IOdbComparable orderByKey) { }
/// <summary> /// Execute query using index /// </summary> /// <param name="index"> </param> /// <param name="inMemory"> </param> /// <param name="returnObjects"> </param> /// <param name="queryResultAction"> </param> private IInternalObjectSet <T> ExecuteUsingIndex <T>(ClassInfoIndex index, bool inMemory, bool returnObjects, IMatchingObjectAction queryResultAction) { // Index that have not been used yet do not have persister! if (index.BTree.GetPersister() == null) { index.BTree.SetPersister(new LazyOdbBtreePersister(StorageEngine)); } var nbObjects = ClassInfo.NumberOfObjects; var btreeSize = index.BTree.GetSize(); // the two values should be equal if (nbObjects != btreeSize) { var classInfo = StorageEngine.GetSession().GetMetaModel().GetClassInfoFromId(index.ClassInfoId); throw new OdbRuntimeException( NDatabaseError.IndexIsCorrupted.AddParameter(index.Name).AddParameter(classInfo.FullClassName). AddParameter(nbObjects).AddParameter(btreeSize)); } if (OdbConfiguration.IsLoggingEnabled()) { DLogger.Debug(string.Format("GenericQueryExecutor: loading {0} instance(s) of {1}", nbObjects, ClassInfo.FullClassName)); } if (ExecuteStartAndEndOfQueryAction()) { queryResultAction.Start(); } PrepareQuery(); if (Query != null) { _queryHasOrderBy = Query.HasOrderBy(); } var tree = index.BTree; var isUnique = index.IsUnique; // Iterator iterator = new BTreeIterator(tree, // OrderByConstants.ORDER_BY_ASC); var key = ComputeIndexKey(index); IList list = null; // If index is unique, get the object if (isUnique) { var treeSingle = (IBTreeSingleValuePerKey)tree; var value = treeSingle.Search(key); if (value != null) { list = new List <object> { value } } ; } else { var treeMultiple = (IBTreeMultipleValuesPerKey)tree; list = treeMultiple.Search(key); } if (list != null) { foreach (OID oid in list) { // FIXME Why calling this method ObjectReader.GetObjectPositionFromItsOid(oid, true, true); _orderByKey = null; var objectMatches = MatchObjectWithOid(oid, returnObjects, inMemory); if (objectMatches) { queryResultAction.ObjectMatch(oid, GetCurrentObjectMetaRepresentation(), _orderByKey); } } queryResultAction.End(); return(queryResultAction.GetObjects <T>()); } if (ExecuteStartAndEndOfQueryAction()) { queryResultAction.End(); } return(queryResultAction.GetObjects <T>()); }
public void AddWithKey(IOdbComparable key, T @object) { throw new OdbRuntimeException(NDatabaseError.OperationNotImplemented); }
public override void AddWithKey(IOdbComparable key, IObjectValues @object) { throw new OdbRuntimeException(NDatabaseError.OperationNotImplemented.AddParameter("addWithKey")); }
public ComposedCompareKey(IOdbComparable[] keys) { _keys = keys; }
/// <summary> /// Adds the object in the btree with the specific key /// </summary> public virtual void AddWithKey(IOdbComparable key, TItem o) { _tree.Insert(key, o); _size++; }
public virtual void AddWithKey(IOdbComparable key, TItem o) { Add(o); }
/// <summary> /// Query execution full scan <pre>startIndex & endIndex /// A B C D E F G H I J K L /// [1,3] : nb >=1 && nb<3 /// 1) /// analyze A /// nb = 0 /// nb E [1,3] ? no /// r=[] /// 2) /// analyze B /// nb = 1 /// nb E [1,3] ? yes /// r=[B] /// 3) analyze C /// nb = 2 /// nb E [1,3] ? yes /// r=[B,C] /// 4) analyze C /// nb = 3 /// nb E [1,3] ? no and 3> upperBound([1,3]) => exit</pre> /// </summary> /// <param name="inMemory"> </param> /// <param name="startIndex"> </param> /// <param name="endIndex"> </param> /// <param name="returnObjects"> </param> /// <param name="queryResultAction"> </param> private IInternalObjectSet <T> ExecuteFullScan <T>(bool inMemory, int startIndex, int endIndex, bool returnObjects, IMatchingObjectAction queryResultAction) { if (StorageEngine.IsClosed()) { throw new OdbRuntimeException( NDatabaseError.OdbIsClosed.AddParameter(StorageEngine.GetBaseIdentification().Id)); } var nbObjects = ClassInfo.NumberOfObjects; if (OdbConfiguration.IsLoggingEnabled()) { DLogger.Debug(string.Format("GenericQueryExecutor: loading {0} instance(s) of {1}", nbObjects, ClassInfo.FullClassName)); } if (ExecuteStartAndEndOfQueryAction()) { queryResultAction.Start(); } OID currentOID = null; // TODO check if all instances are in the cache! and then load from the cache NextOID = ClassInfo.CommitedZoneInfo.First; if (nbObjects > 0 && NextOID == null) { // This means that some changes have not been commited! // Take next position from uncommited zone NextOID = ClassInfo.UncommittedZoneInfo.First; } PrepareQuery(); if (Query != null) { _queryHasOrderBy = Query.HasOrderBy(); } // used when startIndex and endIndex are not negative var nbObjectsInResult = 0; for (var i = 0; i < nbObjects; i++) { // Reset the order by key _orderByKey = null; var prevOID = currentOID; currentOID = NextOID; // This is an error if (currentOID == null) { throw new OdbRuntimeException( NDatabaseError.NullNextObjectOid.AddParameter(ClassInfo.FullClassName).AddParameter(i). AddParameter(nbObjects).AddParameter(prevOID)); } // If there is an endIndex condition if (endIndex != -1 && nbObjectsInResult >= endIndex) { break; } // If there is a startIndex condition bool objectInRange; if (startIndex != -1 && nbObjectsInResult < startIndex) { objectInRange = false; } else { objectInRange = true; } // There is no query if (!inMemory && Query == null) { nbObjectsInResult++; // keep object position if we must if (objectInRange) { _orderByKey = BuildOrderByKey(CurrentNnoi); // TODO Where is the key for order by queryResultAction.ObjectMatch(NextOID, _orderByKey); } NextOID = ObjectReader.GetNextObjectOID(currentOID); } else { var objectMatches = MatchObjectWithOid(currentOID, returnObjects, inMemory); if (objectMatches) { nbObjectsInResult++; if (objectInRange) { if (_queryHasOrderBy) { _orderByKey = BuildOrderByKey(GetCurrentObjectMetaRepresentation()); } queryResultAction.ObjectMatch(currentOID, GetCurrentObjectMetaRepresentation(), _orderByKey); } } } } if (ExecuteStartAndEndOfQueryAction()) { queryResultAction.End(); } return(queryResultAction.GetObjects <T>()); }