/// <summary> /// Gets or adds an entity scan target. /// </summary> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <param name="entityScanTargetExisting"> /// The existing entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target has been added, otherwise <c>false</c>. /// </returns> protected override bool GetOrAdd(EntityScanTarget entityScanTarget, out EntityScanTarget entityScanTargetExisting) { if (entityScanTarget == null) { throw new ArgumentNullException(nameof(entityScanTarget)); } var added = false; if (string.IsNullOrEmpty(entityScanTarget.Key.ColumnFamily)) { entityScanTargetExisting = this.unqualifiedKeys.GetOrAdd( entityScanTarget.Key, key => { added = true; return(entityScanTarget); }); } else { entityScanTargetExisting = this.keys.GetOrAdd( entityScanTarget.Key, key => { added = true; return(entityScanTarget); }); } return(added); }
/// <summary> /// Try get a scan target for the entity key specified. /// </summary> /// <param name="key"> /// The entity key. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target as been found for the entity key specified, otherwise <c>false</c>. /// </returns> public override bool TryRemoveScanTarget(Key key, out EntityScanTarget entityScanTarget) { if (this.keys.TryRemove(key, out entityScanTarget)) { return(true); } return(this.unqualifiedKeys.TryGetValue(key, out entityScanTarget)); }
/// <summary> /// Try get a scan target for the entity key specified. /// </summary> /// <param name="key"> /// The entity key. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target as been found for the entity key specified, otherwise <c>false</c>. /// </returns> public bool TryRemoveScanTarget(Key key, out EntityScanTarget entityScanTarget) { lock (this.syncRoot) { entityScanTarget = new EntityQueryScanTarget(this.entityScanResult.EntityType, this.entityScanResult, key, this.entityScanResult.ValueSink); } return(true); }
/// <summary> /// Reads an entity which belongs to the given database key from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="key"> /// The database key. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> /// <returns> /// The entity. /// </returns> internal static object Read(EntityContext entityContext, EntityReference entityReference, object key, Behaviors behaviors) { var entityScanTarget = new EntityScanTarget(entityReference, key); var entityScanner = new EntityScanner(entityContext); entityScanner.Add(entityScanTarget); new EntityReader(entityScanner, behaviors).Read(); return(entityScanTarget.Value); }
/// <summary> /// Reads all entities which belongs to the given database keys from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="keys"> /// The entity keys. /// </param> /// <param name="entitySink"> /// The entity sink, receives the entities fetched. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> internal static void Read(EntityContext entityContext, EntityReference entityReference, IEnumerable keys, Action <object> entitySink, Behaviors behaviors) { var entityScanner = new EntityScanner(entityContext); var entityScanTargets = new ChunkedCollection <EntityScanTarget>(); foreach (var key in keys) { if (key != null) { var entityScanTarget = new EntityScanTarget(entityReference, entityReference.GetKeyFromObject(key, false), entitySink); entityScanTargets.Add(entityScanTarget); entityScanner.Add(entityScanTarget); } } new EntityReader(entityScanner, behaviors).Read(); }
/// <summary> /// The entity fetched callback. /// </summary> /// <param name="cell"> /// The fetched cell, if null then key, buffer, length must be provided. /// </param> /// <param name="key"> /// The cell key. /// </param> /// <param name="buffer"> /// The cell buffer. /// </param> /// <param name="length"> /// The cell buffer length. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> private void EntityFetched(ICell cell, Key key, IntPtr buffer, int length, EntityScanTarget entityScanTarget) { object entity; if (cell != null) { entity = EntityDeserializer.Deserialize( this, typeof(object), cell.Value, cell.ValueLength, (reference, type, value) => { this.entitiesFetched.TryAdd(entityScanTarget, value); reference.SetKey(value, cell.Key); }); } else { entity = EntityDeserializer.Deserialize( this, typeof(object), buffer, length, (reference, type, value) => { this.entitiesFetched.TryAdd(entityScanTarget, value); reference.SetKey(value, key); }); } if (!this.behaviors.DoNotCache()) { this.entitySpecsFetched.Add(new EntitySpec(entityScanTarget)); } if (entity == null || entityScanTarget.EntityType.IsAssignableFrom(entity.GetType())) { entityScanTarget.SetValue(entity); } }
/// <summary> /// The deferred read object. /// </summary> /// <param name="tag"> /// The tag. /// </param> /// <param name="destinationType"> /// The destination type. /// </param> /// <param name="any"> /// The any. /// </param> /// <param name="action"> /// The action. /// </param> /// <typeparam name="T"> /// Type of object to read. /// </typeparam> /// <exception cref="ArgumentNullException"> /// If <paramref name="action" /> in null. /// </exception> protected override void DeferredReadObject <T>(Tags tag, Type destinationType, object any, Action <T> action) { var entitySpec = any as EntitySpec; if (entitySpec != null) { var entityScanTarget = new EntityScanTarget(destinationType, entitySpec, (target, value) => action((T)value)); if (IsEntityReference(tag)) { this.entityScanner.Add(entityScanTarget); this.ObjectRefs.Add(entityScanTarget); } else if (tag == Tags.ObjectRef) { ((EntityScanTarget)entitySpec).AddScanTargetRef(entityScanTarget); } } else { base.DeferredReadObject(tag, destinationType, any, action); } }
/// <summary> /// Sets an object property. /// </summary> /// <param name="inspectedProperty"> /// The inspected property. /// </param> /// <param name="target"> /// The target. /// </param> /// <param name="value"> /// The property value. /// </param> /// <param name="tag"> /// The tag. /// </param> internal override void SetObjectProperty(InspectedProperty inspectedProperty, object target, object value, Tags tag) { var entitySpec = value as EntitySpec; if (entitySpec != null) { var entityScanTarget = new EntityScanTarget(inspectedProperty, entitySpec, target); if (IsEntityReference(tag)) { this.entityScanner.Add(entityScanTarget); this.ObjectRefs.Add(entityScanTarget); } else if (tag == Tags.ObjectRef) { ((EntityScanTarget)entitySpec).AddScanTargetRef(entityScanTarget); } } else { base.SetObjectProperty(inspectedProperty, target, value, tag); } }
/// <summary> /// Try get a scan target for the entity key specified. /// </summary> /// <param name="key"> /// The entity key. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target as been found for the entity key specified, otherwise <c>false</c>. /// </returns> public bool TryRemoveScanTarget(Key key, out EntityScanTarget entityScanTarget) { lock (this.syncRoot) { entityScanTarget = new EntityQueryScanTarget(this.entityScanResult.EntityType, this.entityScanResult, key, this.entityScanResult.ValueSink); } return true; }
/// <summary> /// Gets or adds an entity scan target. /// </summary> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <param name="entityScanTargetExisting"> /// The existing entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target has been added, otherwise <c>false</c>. /// </returns> protected abstract bool GetOrAdd(EntityScanTarget entityScanTarget, out EntityScanTarget entityScanTargetExisting);
/// <summary> /// Try remove a scan target for the entity key specified. /// </summary> /// <param name="key"> /// The entity key. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> /// <returns> /// <c>true</c> if a scan target as been found for the entity key specified, otherwise <c>false</c>. /// </returns> public abstract bool TryRemoveScanTarget(Key key, out EntityScanTarget entityScanTarget);
/// <summary> /// Initializes a new instance of the <see cref="FetchedCell" /> struct. /// </summary> /// <param name="cell"> /// The fetched cell. /// </param> /// <param name="entityScanTarget"> /// The entity scan target. /// </param> internal FetchedCell(Cell cell, EntityScanTarget entityScanTarget) { this.Cell = cell; this.EntityScanTarget = entityScanTarget; }