コード例 #1
0
        public ArangoXmlRepository(IServiceProvider services, ILoggerFactory loggerFactory,
                                   string database, string collection, ArangoContext context)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            _logger     = loggerFactory.CreateLogger <ArangoXmlRepository>();
            _services   = services ?? throw new ArgumentNullException(nameof(services));
            _database   = database;
            _collection = collection;
            _context    = context ?? services.GetRequiredService <ArangoContext>();

            try
            {
                if (!_context.Database.ExistAsync(_database).Result)
                {
                    _context.Database.CreateAsync(_database).Wait();
                }

                var collections = _context.Collection.ListAsync(_database).Result;

                if (!collections.Contains(collection))
                {
                    _context.Collection.CreateAsync(_database, _collection, ArangoCollectionType.Document).Wait();
                }
            }
            catch (Exception e)
            {
                var logger = _logger;
                logger?.LogError(e, e.Message);
            }
        }
コード例 #2
0
        public ArangoSerilogSink(
            ArangoContext arango,
            string database       = "logs",
            string collection     = "logs",
            int batchPostingLimit = DefaultBatchPostingLimit,
            TimeSpan?period       = null)
            : base(batchPostingLimit, period ?? DefaultPeriod)
        {
            _arango     = arango;
            _database   = database;
            _collection = collection;

            try
            {
                if (!arango.ExistDatabaseAsync(_database).Result)
                {
                    _arango.CreateDatabaseAsync(_database).Wait();
                    _arango.CreateCollectionAsync(_database, _collection, ArangoCollectionType.Document).Wait();
                }
            }
            catch (Exception)
            {
                //
            }
        }
コード例 #3
0
        public override async Task InitializeAsync()
        {
            Arango =
                new ArangoContext(UniqueTestRealm(),
                                  new ArangoConfiguration
            {
                QueryProfile = (query, bindVars, stats) =>
                {
                    var boundQuery = query;

                    foreach (var p in bindVars.OrderByDescending(x => x.Key.Length))
                    {
                        boundQuery = boundQuery.Replace("@" + p.Key, JsonConvert.SerializeObject(p.Value));
                    }

                    _output.WriteLine(
                        $"{boundQuery}\n{JsonConvert.SerializeObject(stats, Formatting.Indented)}");
                }
            });
            await Arango.Database.CreateAsync("test");
        }
コード例 #4
0
        public override async Task InitializeAsync()
        {
            Arango = new ArangoContext(UniqueTestRealm());
            await Arango.Database.CreateAsync(D);

            await Arango.Collection.CreateAsync(D, nameof(Client), ArangoCollectionType.Document);

            await Arango.Collection.CreateAsync(D, nameof(Project), ArangoCollectionType.Document);

            await Arango.Collection.CreateAsync(D, nameof(Activity), ArangoCollectionType.Document);

            await Arango.Document.CreateManyAsync(D, nameof(Client), new List <Client>
            {
                new()
                {
                    Key  = "CA",
                    Name = "Client A"
                },
                new()
                {
                    Key  = "CB",
                    Name = "Client B"
                }
            });
コード例 #5
0
 public ArangoQueryableContext(ArangoContext arango, ArangoHandle handle, string collection)
 {
     Provider   = new ArangoProvider(arango, handle, collection);
     Expression = Expression.Constant(this);
 }
コード例 #6
0
ファイル: ArangoTransform.cs プロジェクト: robsiera/ArangoDB
        /// <summary>
        ///     Executes transformed query
        /// </summary>
        public async Task <DxLoadResult> ExecuteAsync <T>(ArangoContext arango,
                                                          ArangoHandle handle,
                                                          string collection,
                                                          CancellationToken cancellationToken = default)
            where T : new()
        {
            if (!_isTransformed)
            {
                throw new Exception("call transform first");
            }

            var queryBuilder = new StringBuilder();

            if (!string.IsNullOrWhiteSpace(_settings.Preamble))
            {
                queryBuilder.AppendLine(_settings.Preamble);
            }

            queryBuilder.AppendLine($"FOR {_settings.IteratorVar} IN {collection}");
            queryBuilder.AppendLine("FILTER " + FilterExpression);

            if (_settings.Filter != null)
            {
                queryBuilder.AppendLine(" && " + _settings.Filter);
            }

            if (HasGrouping)
            {
                queryBuilder.AppendLine(AggregateExpression);
            }
            else
            {
                Parameter.TryAdd("SKIP", Skip);
                Parameter.TryAdd("TAKE", Take);

                queryBuilder.AppendLine(SortExpression);
                queryBuilder.AppendLine("LIMIT @SKIP, @TAKE");
                queryBuilder.AppendLine($"RETURN {_settings.Projection ?? _settings.IteratorVar}");
            }

            var query = queryBuilder.ToString();


            if (HasGrouping)
            {
                var res = await arango.QueryAsync <JObject>(handle, query, Parameter,
                                                            cancellationToken : cancellationToken);

                return(new DxLoadResult
                {
                    Data = BuildGrouping(this, res)
                });
            }
            else
            {
                var res = await arango.QueryAsync <T>(handle, query, Parameter,
                                                      fullCount : _loadOption.RequireTotalCount, cancellationToken : cancellationToken);

                decimal?[] summary = null;

                if (_loadOption.TotalSummary?.Any() == true)
                {
                    var summaryQueryBuilder = new StringBuilder();

                    if (!string.IsNullOrWhiteSpace(_settings.Preamble))
                    {
                        summaryQueryBuilder.AppendLine(_settings.Preamble);
                    }

                    summaryQueryBuilder.AppendLine($"FOR {_settings.IteratorVar} IN {collection}");
                    summaryQueryBuilder.AppendLine("FILTER " + FilterExpression);

                    if (_settings.Filter != null)
                    {
                        summaryQueryBuilder.AppendLine(" && " + _settings.Filter);
                    }
                    summaryQueryBuilder.AppendLine(AggregateExpression);

                    // TODO: refactor
                    Parameter.Remove("SKIP");
                    Parameter.Remove("TAKE");

                    var summaryQuery = summaryQueryBuilder.ToString();

                    var summaryResult = await arango.QueryAsync <JObject>(handle, summaryQuery, Parameter,
                                                                          cancellationToken : cancellationToken);

                    summary = summaryResult.SingleOrDefault()?.PropertyValues()
                              .Select(x => x.Value <decimal?>()).Skip(1).ToArray();
                }

                return(new DxLoadResult
                {
                    Data = res,
                    Summary = summary,
                    TotalCount = res.FullCount ?? -1
                });
            }
        }
コード例 #7
0
 public static IQueryable <T> AsQueryable <T>(this ArangoContext arango, ArangoHandle db, string collection = null)
 {
     return(new ArangoQueryableContext <T>(arango, db, collection ?? typeof(T).Name));
 }
コード例 #8
0
ファイル: ArangoProvider.cs プロジェクト: bordereast/ArangoDB
 public ArangoProvider(ArangoContext arango, ArangoHandle handle, string collection)
 {
     _arango     = arango;
     _handle     = handle;
     _collection = collection;
 }
コード例 #9
0
        /// <summary>
        /// Stores DataProtection keys in ArangoDB
        /// </summary>
        /// <param name="database">Name of the database suffix</param>
        /// <param name="collection">Name of the collection</param>
        /// <param name="context">Arango context (if not supplied it will be tried via dependency injection)</param>
        public static IDataProtectionBuilder PersistKeysToArangoDB(this IDataProtectionBuilder builder,
                                                                   string database = "dataprotection", string collection = "keys", ArangoContext context = null)
        {
            builder.Services.AddSingleton <IConfigureOptions <KeyManagementOptions> >(services =>
            {
                var loggerFactory = services.GetService <ILoggerFactory>() ?? NullLoggerFactory.Instance;
                return(new ConfigureOptions <KeyManagementOptions>(options =>
                {
                    options.XmlRepository = new ArangoXmlRepository(services, loggerFactory, database, collection, context);
                }));
            });

            return(builder);
        }