Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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();
        }
Ejemplo n.º 6
0
        /// <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);
            }
        }
Ejemplo n.º 7
0
        /// <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);
            }
        }
Ejemplo n.º 8
0
        /// <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);
            }
        }
Ejemplo n.º 9
0
        /// <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;
        }
Ejemplo n.º 10
0
 /// <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);
Ejemplo n.º 11
0
 /// <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);
Ejemplo n.º 12
0
 /// <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;
 }