/// <summary>
        /// Gets the column names for the entity reference specified.
        /// </summary>
        /// <param name="entityReference">
        /// The entity reference.
        /// </param>
        /// <returns>
        /// The column names.
        /// </returns>
        internal IEnumerable<string> ColumnNames(EntityReference entityReference)
        {
            var distinctColumnBindings = this.DistinctColumnBindingsForType(entityReference.EntityType).ToList();
            if (distinctColumnBindings.Count <= 1)
            {
                return distinctColumnBindings.Select(ColumnName);
            }

            var columnBindingComparer = new ColumnBindingComparer();
            var columnFamilyBindings = new Dictionary<string, HashSet<IColumnBinding>>(StringComparer.Ordinal);

            foreach (var binding in distinctColumnBindings)
            {
                HashSet<IColumnBinding> columnBindings;
                if (!columnFamilyBindings.TryGetValue(binding.ColumnFamily, out columnBindings))
                {
                    columnFamilyBindings.Add(binding.ColumnFamily, columnBindings = new HashSet<IColumnBinding>(columnBindingComparer));
                }

                columnBindings.Add(binding);
            }

            var registeredColumnNames = this.RegisteredColumnNames();

            foreach (var binding in distinctColumnBindings.Where(b => b.ColumnQualifier != null))
            {
                ISet<string> columnQualifiers;
                if (registeredColumnNames.TryGetValue(binding.ColumnFamily, out columnQualifiers))
                {
                    if (columnQualifiers.Remove(binding.ColumnQualifier) && columnQualifiers.Count == 0)
                    {
                        columnFamilyBindings[binding.ColumnFamily] = new HashSet<IColumnBinding> { new ColumnBinding(binding.ColumnFamily) };
                    }
                }
            }

            return columnFamilyBindings.Values.SelectMany(s => s).Select(ColumnName);
        }
Beispiel #2
0
        /// <summary>
        /// Reads all entities which belongs to the given scan specification from the database.
        /// </summary>
        /// <param name="entityContext">
        /// The entity context.
        /// </param>
        /// <param name="entityReference">
        /// The entity reference.
        /// </param>
        /// <param name="scanSpec">
        /// The scan spec.
        /// </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, ScanSpec scanSpec, Action<object> entitySink, Behaviors behaviors)
        {
            var entityScanResult = new EntityScanResult(entityReference, entitySink);
            var entityScanner = new EntityScanner(entityContext);
            entityScanner.Add(entityScanResult, scanSpec);

            new EntityReader(entityScanner, behaviors).Read();
        }
Beispiel #3
0
 /// <summary>
 /// The deserializing entity callback.
 /// </summary>
 /// <param name="entityReference">
 /// The entity reference.
 /// </param>
 /// <param name="destinationType">
 /// The destination type.
 /// </param>
 /// <param name="entity">
 /// The entity.
 /// </param>
 private void DeserializingEntity(EntityReference entityReference, Type destinationType, object entity)
 {
     this.entitiesFetched.TryAdd(this.fetchedCell.EntityScanTarget, entity);
     entityReference.SetKey(entity, this.fetchedCell.Cell.Key);
 }
Beispiel #4
0
        /// <summary>
        /// Reads all entities which belongs to the given scan specification from the database.
        /// </summary>
        /// <param name="entityContext">
        /// The entity context.
        /// </param>
        /// <param name="entityReference">
        /// The entity reference.
        /// </param>
        /// <param name="scanSpec">
        /// The scan spec.
        /// </param>
        /// <param name="behaviors">
        /// The behaviors.
        /// </param>
        /// <returns>
        /// The entities.
        /// </returns>
        internal static IEnumerable Read(EntityContext entityContext, EntityReference entityReference, ScanSpec scanSpec, Behaviors behaviors)
        {
            var entityScanResult = new EntityScanResult(entityReference);
            var entityScanner = new EntityScanner(entityContext);
            entityScanner.Add(entityScanResult, scanSpec);

            new EntityReader(entityScanner, behaviors).Read();
            return entityScanResult.Values;
        }
Beispiel #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();
        }
Beispiel #6
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;
 }
Beispiel #7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="EntityReference"/> class.
        /// </summary>
        /// <param name="entityReference">
        /// The entity reference.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="entityReference"/> is null.
        /// </exception>
        internal EntityReference(EntityReference entityReference)
        {
            if (entityReference == null)
            {
                throw new ArgumentNullException("entityReference");
            }

            this.entityType = entityReference.entityType;
            this.tableBinding = entityReference.tableBinding;
            this.columnBinding = entityReference.columnBinding;
            this.keyBinding = entityReference.keyBinding;
        }
Beispiel #8
0
 /// <summary>
 ///     The deserializing entity callback.
 /// </summary>
 /// <param name="entityReference">
 ///     The entity reference.
 /// </param>
 /// <param name="destinationType">
 ///     The destination type.
 /// </param>
 /// <param name="entity">
 ///     The entity.
 /// </param>
 private void DeserializingEntity(EntityReference entityReference, Type destinationType, object entity)
 {
     this.entitiesFetched.TryAdd(this.fetchedCell.EntityScanTarget, entity);
     entityReference.SetKey(entity, this.fetchedCell.Cell.Key);
 }