예제 #1
0
        public void ArangoDoc_CrossJoin()
        {
            var db = DatabaseGenerator.Get();

            var query = db.Query()
                        .For(_ => new int[] { 2011, 2012, 2013 }
                             .For(year => new int[] { 1, 2, 3, 4 }
                                  .Select(quarter => new
            {
                y    = year,
                q    = quarter,
                nice = AQL.Concat(AQL.ToString(quarter), "/", AQL.ToString(year))
            })));

            var queryData = query.GetQueryData();

            Assert.Equal(queryData.Query.RemoveSpaces(), @"
for `year` in @P1
for `quarter` in @P2
return { 
    `y` : `year` , 
    `q` : `quarter` , 
    `nice` : concat( [ to_string( `quarter` ) , @P3 , to_string( `year` ) ] ) 
}
".RemoveSpaces());

            Assert.Equal(queryData.BindVars.Count, 3);
            Assert.Equal(JsonConvert.SerializeObject(queryData.BindVars[0].Value), "[2011,2012,2013]");
            Assert.Equal(JsonConvert.SerializeObject(queryData.BindVars[1].Value), "[1,2,3,4]");
            Assert.Equal(queryData.BindVars[2].Value, "/");
        }
        public void Upsert()
        {
            var query = db.Query()
                        .Upsert <Host>(_ => new Host {
                Ip = "192.168.173.94"
            },
                                       _ => new Host {
                Ip = "192.168.173.94", Name = "chorweiler", Tags = new string[] { "development" }
            },
                                       (_, o) => new Host {
                Tags = AQL.Push(o.Tags, "production", true)
            })
                        .In <Host>();

            // execute query for the first time
            var firstResult = query.Select((n, o) => n).ToList();

            Assert.Equal(firstResult.Count, 1);
            Assert.Equal(firstResult[0].Tags.Count, 1);
            Assert.Equal(firstResult[0].Tags[0], "development");

            // execute query for the second time
            var secondResult = query.Select((n, o) => n).ToList();

            Assert.Equal(secondResult.Count, 1);
            Assert.Equal(secondResult[0].Tags.Count, 2);
            Assert.Equal(secondResult[0].Tags[0], "development");
            Assert.Equal(secondResult[0].Tags[1], "production");
        }
예제 #3
0
        public void UpsertWithFor()
        {
            var db = DatabaseGenerator.Get();

            var query = db.Query <Host>()
                        .Upsert(h => new Host {
                Key = h.Key
            },
                                h => new Host {
            },
                                (h, old) => new Host {
                Tags = AQL.Append(h.Tags, old.Tags)
            });

            var queryData = query.GetQueryData();

            Assert.Equal(queryData.Query.RemoveSpaces(), @"
for `h` in `hosts`
upsert { `_key` : `h`.`_key` }
insert @P1
update { `tags` : append( `h`.`tags` , `OLD` .`tags` ) }
in `hosts`
".RemoveSpaces());

            ObjectUtility.AssertSerialize(queryData.BindVars[0].Value, new { }, db);
        }
예제 #4
0
        public void UpsertComplexUpdate()
        {
            var db = DatabaseGenerator.Get();

            var query = db.Query()
                        .Upsert <Host>(_ => new Host {
                Ip = "192.168.173.94"
            },
                                       _ => new Host {
                Ip = "192.168.173.94", Name = "chorweiler", Tags = new string[] { "development" }
            },
                                       (_, o) => new Host {
                Tags = AQL.Push(o.Tags, "development", true)
            })
                        .In <Host>().ReturnResult(true);

            var queryData = query.GetQueryData();

            Assert.Equal(queryData.Query.RemoveSpaces(), @"
upsert @P1
insert @P2
update { `tags` : push( `OLD` .`tags` , @P3 , @P4  )  }
in `hosts`
let crudResult = NEW 
return crudResult
                    ".RemoveSpaces());

            ObjectUtility.AssertSerialize(queryData.BindVars[0].Value, new { ip = "192.168.173.94" }, db);
            ObjectUtility.AssertSerialize(queryData.BindVars[1].Value, new { ip = "192.168.173.94", name = "chorweiler", tags = new string[] { "development" } }, db);
            Assert.Equal(queryData.BindVars[2].Value, "development");
            Assert.Equal(queryData.BindVars[3].Value, true);
        }
예제 #5
0
        public static List <Appointment> GetApprovedAppointmentsByDateAndTime(DatabaseManager databaseManager, string date, string time, int minutesgap)
        {
            long millisecs = minutesgap * 60 * 1000;

            return(databaseManager.Database.Query <Appointment>().
                   Where(s => s.IsApproved && s.Date == date &&
                         AQL.Abs(AQL.DateTimestamp(time) - AQL.DateTimestamp(s.Time)) < millisecs).ToList());
        }
예제 #6
0
        public void GroupBySelectAggregation()
        {
            var db = DatabaseGenerator.Get();

            var query = db.Query <Person>().GroupBy(x => x.Age)
                        .Select(byAge => new { len = AQL.Length(byAge), byAge.Key, Ages = byAge.Select(x => x.Age) });

            Assert.Equal(query.GetQueryData().Query.RemoveSpaces(),
                         @"for `x` in `Person` collect `CV1` = `x`.`Age` into `C1` return { `len` : length( `C1` ) , `Key` : `CV1` , `Ages` : ( for `x` in `C1` return `x`.`x`.`Age` )  }".RemoveSpaces());
        }
예제 #7
0
        public void GroupByNewSingleSelectExpressionKey_SelectOnlyOneKey()
        {
            var db = DatabaseGenerator.Get();

            db.Setting.Linq.TranslateGroupByIntoName = identifier => identifier;

            var query = db.Query <Person>().GroupBy(x => new { cage = AQL.ToString(x.Age) }).Select(byAge => byAge.Key.cage);

            Assert.Equal(query.GetQueryData().Query.RemoveSpaces(), "for `x` in `Person` collect `cage` = to_string( `x`.`Age` ) into `byAge` return `cage`");

            db.Setting.Linq.TranslateGroupByIntoName = null;
        }
예제 #8
0
        public void GroupBySingleSelectExpressionKey()
        {
            var db = DatabaseGenerator.Get();

            db.Setting.Linq.TranslateGroupByIntoName = identifier => identifier;

            var query = db.Query <Person>().GroupBy(x => AQL.ToString(x.Age)).Select(byAge => byAge.Key);

            Assert.Equal("for `x` in `Person` collect `CV1` = to_string( `x`.`Age` ) into `byAge` return `CV1`", query.GetQueryData().Query.RemoveSpaces());

            db.Setting.Linq.TranslateGroupByIntoName = null;
        }
예제 #9
0
        public IActionResult GetAllUsers([FromQuery] UsersQueryOptions options)
        {
            using (var db = ArangoDatabase.CreateWithSetting())
            {
                var query = from u in db.Query <User>()
                            select new
                {
                    u.Key,
                    u.Username,
                    u.RealName,
                    u.Email,
                    u.Description,
                    u.Occupation,
                    birthday = AQL.DateFormat(u.Birthday, "%dd/%mm/%yyyy")
                };
                if (options.Name != null)
                {
                    query = query.Where(u => AQL.Contains(AQL.Lower(u.Username), AQL.Lower(options.Name)));
                }

                if (options.Email != null)
                {
                    query = from u in query
                            where AQL.Lower(u.Email) == AQL.Lower(options.Email)
                            select u;
                }

                if (options.Limit.HasValue)
                {
                    query = query.Take(options.Limit.Value);
                }

                if (options.Sorted.HasValue && options.Sorted.Value == true)
                {
                    query = query.OrderBy(user => user.Username);
                }

                var defaultValue = query.FirstOrDefault();
                var queryCount   = query.Count();
                if (query.Count() >= 250 || options.Page.HasValue)
                {
                    var skipValue = (options.Page ?? 0) * 250;
                    query = query.Skip(skipValue).Take(250).Select(u => u);
                }

                if (options.MaxElements.HasValue && options.MaxElements.Value > 0)
                {
                    query = query.Take(options.MaxElements.Value);
                }

                return(Ok(query));
            }
        }
 public async Task <TUser> FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken)
 {
     return(await Database.Query <TUser>()
            .Where(d =>
                   AQL.Length(
                       Database.Query <TUser>()
                       .For(a => a.Logins)
                       .Where(b => b.LoginProvider == loginProvider && b.ProviderKey == providerKey)
                       .Select(c => c)
                       ) != 0
                   )
            .Select(d => d)
            .FirstOrDefaultAsync());
 }
예제 #11
0
        public void Create(ConcreteSyntaxEntity syntaxEntity)
        {
            var syntax = _mapper.Map <ConcreteSyntax>(syntaxEntity);

            using (var db = GetDatabase(_config))
            {
                if (!db.ListCollections().Any(c => c.Name == "ConcreteSyntax"))
                {
                    db.CreateCollection("ConcreteSyntax");
                }

                if (db.Query <ConcreteSyntax>().Where(p => AQL.Contains(p.FullName, syntax.FullName)).Count() == 0)
                {
                    db.Insert <ConcreteSyntax>(syntax);
                }
            }
        }
        public void TraversalFilter()
        {
            InitiateGraph();

            var result = db.Query()
                         .Traversal <Person, Follow>(alice.Id)
                         .Depth(1, 6)
                         .Graph(graphName)
                         .Where(g => AQL.Length(
                                    db.Query().For(_ => g.Path.Vertices)
                                    .Where(v => v.Id == charlie.Id)
                                    .Select(v => v))
                                == 0)
                         .Select(g => g.Vertex)
                         .ToList();

            Assert.Equal(2, result.Count);
        }
예제 #13
0
        private string GetLoginFromName(string name)
        {
            name = name.ToLower();
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException();
            }

            string[] parts = name.Split(' ');
            if (parts.Length != 2)
            {
                throw new ArgumentException();
            }

            string userName = parts[0][0].ToString() + "." + parts[1];
            int    repeats  = databaseManager.Database.Query <Credential>()
                              .Where(c => AQL.Contains(c.Key, userName)).Count();

            return(userName + Convert.ToString(repeats));
        }
        public void UpsertOnCollection()
        {
            // insert a host
            db.Insert <Host>(new Host {
                Key = "123", Tags = new string[] { "1", "2", "3" }
            });

            var result = db.Query <Host>()
                         .Upsert(h => new Host {
                Key = h.Key
            },
                                 h => new Host {
            },
                                 (h, old) => new Host {
                Tags = AQL.Append(h.Tags, old.Tags)
            }).Select((n, o) => n).ToList();

            Assert.Equal(result.Count, 1);
            Assert.Equal(result[0].Tags.Count, 6);
            Assert.Equal(result[0].Tags.Count(t => t == "2"), 2);
        }