Exemplo n.º 1
0
        public static void AddNotExpression(
            this Dictionary <string, object> query, MongoQueryBuilder queryBuilder)
        {
            var builtQuery = queryBuilder.Build();

            query[MongoOperator.Not.Value] = builtQuery;
        }
Exemplo n.º 2
0
        public void TestMongoQuery()
        {
            var mongoQuery = new MongoQueryBuilder().GreaterOrEquals("foo", 42);
            var query      = _qb.MongoQuery(mongoQuery).Build();
            var result     = query["_q"];

            Check.That(result).IsEqualTo(@"{""foo"":{""$gte"":42}}");
        }
        public void TestNot()
        {
            var queryToNegate = new MongoQueryBuilder().GreaterOrEquals("foo", 42);
            var query         = _qb.Not(queryToNegate);

            var result     = (Dictionary <string, object>)query.Build()["$not"];
            var innerQuery = (Dictionary <string, object>)result["foo"];

            Check.That(innerQuery["$gte"]).IsEqualTo(42);
        }
Exemplo n.º 4
0
        protected async Task UpdateManyByQuery(MongoQueryBuilder <TEntity, TKey> query)
        {
            if (query.Filter == null)
            {
                query.Where(x => true);
            }

            query.UpdateSet(x => x.UpdateTime, DateTime.UtcNow);

            await _collection.UpdateManyAsync(query.Filter, query.Update);
        }
        public void TestAddIfNotNull()
        {
            MongoQueryBuilder queryBuilder = new MongoQueryBuilder();
            queryBuilder.AddIfNotNull("Test Key", "Some Not Null", aString => new BsonString("Test Value"));

            Assert.AreEqual(1, queryBuilder.Count);

            queryBuilder.AddIfNotNull<string>("Test Null Key", null, aString => new BsonString(aString));

            Assert.AreEqual(1, queryBuilder.Count);
        }
 protected MongoQueryBuilder <AppUser, string> _shortUserProjection(MongoQueryBuilder <AppUser, string> query)
 => query
 .ProjectionInclude(x => x.Image)
 .ProjectionInclude(z => z.Birthday)
 .ProjectionInclude(z => z.CreateTime)
 .ProjectionInclude(z => z.Email)
 .ProjectionInclude(z => z.FirstName)
 .ProjectionInclude(z => z.Id)
 .ProjectionInclude(z => z.Isblocked)
 .ProjectionInclude(z => z.IsEmailConfirmed)
 .ProjectionInclude(z => z.LastName)
 .ProjectionInclude(z => z.UpdateTime)
 .ProjectionInclude(z => z.Status)
 .ProjectionInclude(z => z.UserName);
Exemplo n.º 7
0
        public void TestMultipleParams()
        {
            var mongoQueryOperations = new Dictionary <MongoOperator, object>
            {
                [MongoOperator.GreaterThan] = 42, [MongoOperator.NotIn] = new List <string> {
                    "baz", "bam"
                }
            };
            var greaterThanQuery = new MongoQueryBuilder().Greater("foo", 42);
            var notInQuery       = new MongoQueryBuilder().NotIn("foo", new List <string> {
                "baz", "bam"
            });
            var mongoQuery = new MongoQueryBuilder().And(new List <MongoQueryBuilder> {
                greaterThanQuery, notInQuery
            });

            var query = _qb
                        .Id("012345")
                        .CreatorId("12")
                        .CreatedAt("34")
                        .UpdaterId("56")
                        .UpdatedAt("78")
                        .MongoQuery(mongoQuery)
                        .State(State.Trash)
                        .Properties(new List <string> {
                "foo", "bar"
            })
                        .Limit(42)
                        .Skip(10)
                        .Sort("bam")
                        .Build();

            Check.That(query["_id"]).IsEqualTo("012345");
            Check.That(query["creatorId"]).IsEqualTo("12");
            Check.That(query["createdAt"]).IsEqualTo("34");
            Check.That(query["updaterId"]).IsEqualTo("56");
            Check.That(query["updatedAt"]).IsEqualTo("78");

            Check.That(query["_q"])
            .IsEqualTo(@"{""$and"":[{""foo"":{""$gt"":42}},{""foo"":{""$nin"":[""baz"",""bam""]}}]}");
            Check.That(query["_st"]).IsEqualTo(State.Trash.Value);
            Check.That(query["_p"]).IsEqualTo(@"[""foo"",""bar""]");
            Check.That(query["_l"]).IsEqualTo("42");
            Check.That(query["_sk"]).IsEqualTo("10");
            Check.That(query["_s"]).IsEqualTo("bam");
        }
        public void TestOr()
        {
            var values = new List <string> {
                "bar", "baz", "bam"
            };
            var qb1           = new MongoQueryBuilder().NotIn("foo", values);
            var qb2           = new MongoQueryBuilder().Equals("foo", "bum");
            var queryBuilders = new List <MongoQueryBuilder> {
                qb1, qb2
            };

            var globalQuery          = _qb.Or(queryBuilders).Build();
            var queries              = (List <Dictionary <string, object> >)globalQuery["$or"];
            var firstQueryOperation  = (Dictionary <string, IList>)queries[0]["foo"];
            var secondQueryOperation = (string)queries[1]["foo"];

            Check.That(firstQueryOperation.Keys.First()).IsEqualTo("$nin");
            Check.That(firstQueryOperation["$nin"]).IsEqualTo(values);
            Check.That(secondQueryOperation).IsEqualTo("bum");
        }
Exemplo n.º 9
0
        protected virtual async Task <TEntity> GetByQueryFirst(MongoQueryBuilder <TEntity, TKey> query)
        {
            if (query.Filter == null)
            {
                query.Where(x => true);
            }

            var fluent = _collection.Find(query.Filter);

            if (query.Sort != null)
            {
                fluent = fluent.Sort(query.Sort).Skip(query.PropertySkip);
            }

            if (query.Projection != null)
            {
                fluent = fluent.Project <TEntity>(query.Projection);
            }

            return(await fluent.FirstOrDefaultAsync());
        }
        public void Parse_IsValidSimpleRequest_ReturnsRequest()
        {
            // TODO: Remove, did for fun, need to remove and put mock
            // var queryString = "?$select=id,name,parentSkillName&$filter=((not(id%20in%20(%276031351af50caef5fab69886%27))))&$top=20";
            var queryString = "?$select=id&$filter=(((id eq '1') or (parentId in ('1234','4554','6687')) or (((value eq 100)) and (not(firstName eq 'firstName')))) and not(name eq 'name' and name eq '1'))&$top=20"; //  (startswith(name,'s')) or (contains(name,'s'))

            // new {find({ "$or" : [{ "_id" : 1 }, { "parentId" : { "$in" : [1234, 4554, 6687] } }, { "value" : { "$gt" : 100 }, "firstName" : { "$ne" : "firstName" } }], "name" : { "$ne" : "name" } }, { "name" : 1 }).sort({ "name" : -1 }).skip(20).limit(20)}
            queryString = "?$filter=EnumValue eq 'Option2'";

            var request = new UriParser().Parse <SampleModel>(queryString);

            // TODO: Remove, did for fun, need to remove and put mock
            var collection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <BsonDocument>("users");

            var mongoQueryBuilder = new MongoQueryBuilder <BsonDocument>(request, collection);

            // {find({ "$or" : [{ "_id" : "1" }, { "ParentId" : { "$in" : ["1234", "4554", "6687"] } }, { "Value" : 100, "FirstName" : { "$ne" : "firstName" } }], "$nor" : [{ "$and" : [{ "Name" : "name" }, { "Name" : "1" }] }] }, { "Id" : 1 }).skip(0).limit(20)}
            var mongoQuery = mongoQueryBuilder.Query();

            Assert.Pass();
        }
Exemplo n.º 11
0
        protected virtual async Task <IEnumerable <TEntity> > GetByQuery(MongoQueryBuilder <TEntity, TKey> query)
        {
            if (query.Filter == null)
            {
                query.Where(x => true);
            }

            var fluent = _collection.Find(query.Filter);

            if (query.Sort != null)
            {
                fluent = fluent.Sort(query.Sort).Skip(query.PropertySkip).Limit(query.PropertyLimit);
            }

            if (query.Projection != null)
            {
                fluent = fluent.Project <TEntity>(query.Projection);
            }

            return(await fluent.ToListAsync());
        }
Exemplo n.º 12
0
        /// <summary>
        /// Updates an application with a new originator.
        /// </summary>
        /// <param name="applicationId">The application identifier.</param>
        /// <param name="originator">The originator.</param>
        /// <returns>
        /// The updated application.
        /// </returns>
        protected override iApply.DataContract.Application DoUpdateOriginator(string applicationId, AuthenticatedApplicationUser originator)
        {
            MongoQueryBuilder queryBuilder = new MongoQueryBuilder();
            queryBuilder.AddIfNotNull(iApplyDb.Application._ID, applicationId, a => new BsonObjectId(new ObjectId(a)));

            MongoCollection<BsonDocument> applicationCollection = this.database.GetCollection(iApplyDb.Application._COLLECTION_NAME);
            BsonDocument document = applicationCollection.FindOne(queryBuilder.ToAndEqQuery());

            if (document == null)
            {
                return null;
            }

            var application = BsonConverter.ConvertToObjectViaJson<iApply.DataContract.Application>(document);
            application.CreatedBy = originator;
            application.AssignedTo = originator.Id;
            application.AssignedToDisplayName = originator.DisplayName;
            application.ModifiedBy = originator.Id;

            BsonDocument applicationDocument = BsonConverter.ConvertToBsonViaJson(application);
            applicationCollection.Save(applicationDocument);

            return application;
        }
Exemplo n.º 13
0
 public virtual async Task <long> Count(MongoQueryBuilder <TEntity, TKey> query)
 => await _collection.CountDocumentsAsync(query.Filter);
Exemplo n.º 14
0
        public void Query_IsValidSimpleFilterQuery_ReturnsMongoQuery()
        {
            // TODO: Remove, did for fun, need to remove and put mock
            var userCollection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <dynamic>("users");

            var users = new MongoQueryBuilder <dynamic>(new Request
            {
                Filter = new Filter
                {
                    Operator = FilterOperator.IsContainedIn,
                    Property = nameof(User.Id),
                    Value    = new List <string> {
                        "605c7a184462dbd73abf526b", "606e03712631274332ff562c"
                    }
                }
            }, userCollection).Query().ToList();

            users = new MongoQueryBuilder <dynamic>(new Request
            {
                Select = new List <string>
                {
                    "Id", "contact1", "name"
                }
            }, userCollection).Query().ToList();

            // TODO: Remove, did for fun, need to remove and put mock
            var collection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <SampleModel>("sample");

            var result = new MongoQueryBuilder <SampleModel>(SampleRequest.NoRequest, collection).Query().ToList();

            Assert.AreEqual(result.Count, 1);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.NoFilter, collection).Query().ToList();

            Assert.AreEqual(result.Count, 1);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleEq, collection).Query().ToList();

            Assert.AreEqual(result.Count, 1);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleAnd, collection).Query().ToList();

            Assert.AreEqual(result.Count, 0);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleOr, collection).Query().ToList();

            Assert.AreEqual(result.Count, 2);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleCompositeAndOr, collection).Query().ToList();

            Assert.AreEqual(result.Count, 1);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleIn, collection).Query().ToList();

            Assert.AreEqual(result.Count, 2);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleContainsStartsWith, collection).Query().ToList();

            Assert.AreEqual(result.Count, 2);

            result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleSort, collection).Query().ToList();

            Assert.AreEqual(result.Count, 3);

            var count = new MongoQueryBuilder <SampleModel>(SampleRequest.PageSizeNull, collection).QueryCount().ToList();

            Assert.AreEqual(count, 3);

            Assert.Pass();
        }
Exemplo n.º 15
0
 public virtual async Task <bool> Any(MongoQueryBuilder <TEntity, TKey> query)
 => (await Count(query)) > 0;
Exemplo n.º 16
0
 public virtual async Task <bool> ExistsOne(MongoQueryBuilder <TEntity, TKey> query)
 => (await Count(query)) == 1;
 public void Init()
 {
     _qb = new MongoQueryBuilder();
 }
Exemplo n.º 18
0
        /// <summary>
        /// Retrieves a file called <paramref name="filename" /> uploaded as part of application with
        /// ID <paramref name="applicationId" />.
        /// If more than one file with this name exists within the application, a file upload control
        /// name must be provided to resolve the conflict.
        /// </summary>
        /// <param name="applicationId">The ID of the application to get uploaded files from.</param>
        /// <param name="filename">The filename of the uploaded file.</param>
        /// <param name="controlName">Optional name of the file upload control, used to resolve filename conflicts.</param>
        /// <returns>
        /// A serialisable file with name <paramref name="filename" />.
        /// </returns>
        protected override FileSerializable DoGetUploadedFile(string applicationId, string filename, string controlName = null)
        {
            MongoQueryBuilder queryBuilder = new MongoQueryBuilder();
            queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.APPLICATION_ID, applicationId, aid => new BsonString(aid));
            queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.CONTROL_NAME, controlName, cn => new BsonString(cn));
            queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER_ABSOLUTE_PATH, filename, fn => new BsonString(fn));

            MongoCollection<BsonDocument> fileCollection = this.database.GetCollection(iApplyDb.ApplicationAttachments._COLLECTION_NAME);
            MongoCursor<BsonDocument> documents = fileCollection.Find(queryBuilder.ToAndEqQuery());

            if (!documents.Any())
            {
                throw new FileNotFoundException(string.Format(ExceptionMessages.NoFileFound, filename) + (controlName == null ? string.Empty : string.Format(ExceptionMessages.WithinControl, controlName)));
            }

            if (documents.Count() > 1)
            {
                throw new Exception(string.Format(ExceptionMessages.MultipleFilesFound, filename));
            }

            BsonDocument fileDoc = documents.First();
            BsonArray files = fileDoc[iApplyDb.ApplicationAttachments.FILES].AsBsonArray;

            BsonValue file = files.First(f => f[iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER] == filename);
            return new FileSerializable(file[iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER].AsString, file[iApplyDb.ApplicationAttachments.Files.FILE].AsByteArray);
        }
Exemplo n.º 19
0
        /// <summary>
        /// Gets the user with ID <paramref name="userId" />.
        /// </summary>
        /// <param name="userId">The user identifier.</param>
        /// <returns>
        /// A user with matching ID <paramref name="userId" />, otherwise <see langword="null" />
        /// </returns>
        protected override User DoGetUser(string userId)
        {
            MongoQueryBuilder queryBuilder = new MongoQueryBuilder();
            queryBuilder.AddIfNotNull(iApplyDb.UserAccess._ID, userId, uid => new BsonObjectId(new ObjectId(uid)));

            MongoCollection<BsonDocument> userCollection = this.database.GetCollection(iApplyDb.UserAccess._COLLECTION_NAME);
            BsonDocument document = userCollection.FindOne(queryBuilder.ToAndEqQuery());

            if (document == null)
            {
                return null;
            }

            return BsonConverter.ConvertToObjectViaJson<User>(document);
        }