private List <JObject> QueryJoiningContainer(QueriedEntity joinedEntity,
                                                     IEnumerable <JToken> propertyValues)
        {
            var containerName = joinedEntity.EntityName;
            var container     = EnsureContainer(containerName);

            //HACK: pretty limited way to query lots of entities by individual Id
            var counter = 0;
            var query   = propertyValues.Select(propertyValue => new WhereExpression
            {
                Condition = new WhereCondition
                {
                    FieldName = joinedEntity.Join.Right.JoinedFieldName,
                    Operator  = ConditionOperator.EqualTo,
                    Value     = propertyValue.ToObject <object>()
                },
                Operator = counter++ == 0
                    ? LogicalOperator.None
                    : LogicalOperator.Or
            }).ToList().ToAzureCosmosSqlApiWhereClause();

            var selectedPropertyNames = joinedEntity.Selects
                                        .Where(sel => sel.JoinedFieldName.HasValue())
                                        .Select(j => j.JoinedFieldName)
                                        .Concat(new[] { joinedEntity.Join.Right.JoinedFieldName, IdentifierPropertyName });
            var selectedFields = string.Join(", ",
                                             selectedPropertyNames
                                             .Select(name => $"{PrimaryContainerAlias}.{name}"));

            var filter         = $"SELECT {selectedFields} FROM {containerName} {PrimaryContainerAlias} WHERE ({query})";
            var containerQuery = new QueryDefinition(filter);

            return(container.GetItemQueryIterator <object>(containerQuery)
                   .ToList());
        }
        private static Dictionary <string, QueryEntity> QueryJoiningContainer(IRedisClient client,
                                                                              QueriedEntity joinedEntity)
        {
            var containerName = joinedEntity.EntityName;

            if (!Exists(client, containerName))
            {
                return(new Dictionary <string, QueryEntity>());
            }

            var metadata = RepositoryEntityMetadata.FromType(joinedEntity.Join.Right.EntityType);

            return(GetRowKeys(client, containerName)
                   .ToDictionary(rowKey => rowKey,
                                 rowKey => QueryEntity.FromProperties(GetEntityFromContainer(client, rowKey, metadata), metadata)));
        }
Beispiel #3
0
        private Dictionary <string, IReadOnlyDictionary <string, object> > QueryJoiningContainer(QueriedEntity je,
                                                                                                 RepositoryEntityMetadata metadata)
        {
            var containerName = je.EntityName;
            var container     = EnsureContainer(containerName);

            var selected = je.Selects
                           .Where(sel => sel.JoinedFieldName.HasValue())
                           .ToList();

            if (!selected.Any(sel => sel.EntityName.EqualsOrdinal(je.Join.Right.EntityName)))
            {
                selected.Add(new SelectDefinition(je.Join.Right.EntityName, je.Join.Right.JoinedFieldName, null, null));
            }

            var filter = selected.ToCosmosSqlApiSelectClause(containerName);

            this.recorder.TraceInformation($"Executed SQL statement: {filter}");
            return(container.GetItemQueryIterator <object>(new QueryDefinition(filter))
                   .ToList()
                   .ToDictionary(jObj => jObj.Property(IdentifierPropertyName).Value.ToString(),
                                 jObj => jObj.FromContainerEntity(metadata)));
        }