private static IMongoQuery QuantityQuery(String parameterName, Operator optor, String modifier, ValueExpression operand) { var quantity = operand.ToModelQuantity(); Fhir.Metrics.Quantity q = quantity.ToUnitsOfMeasureQuantity().Canonical(); string decimals = UnitsOfMeasureHelper.SearchableString(q); BsonValue value = q.GetValueAsBson(); List <IMongoQuery> queries = new List <IMongoQuery>(); switch (optor) { case Operator.EQ: queries.Add(M.Query.Matches("decimals", new BsonRegularExpression("^" + decimals))); break; default: queries.Add(ExpressionQuery("value", optor, value)); break; } if (quantity.System != null) { queries.Add(M.Query.EQ("system", quantity.System.ToString())); } queries.Add(M.Query.EQ("unit", q.Metric.ToString())); IMongoQuery query = M.Query.ElemMatch(parameterName, M.Query.And(queries)); return(query); }
private static FilterDefinition <BsonDocument> QuantityQuery(String parameterName, Operator optor, String modifier, ValueExpression operand) { //$elemMatch only works on array values. But the MongoIndexMapper only creates an array if there are multiple values for a given parameter. //So we also construct a query for when there is only one set of values in the searchIndex, hence there is no array. var quantity = operand.ToModelQuantity(); Fhir.Metrics.Quantity q = quantity.ToUnitsOfMeasureQuantity().Canonical(); string decimals = q.SearchableString(); BsonValue value = q.GetValueAsBson(); List <FilterDefinition <BsonDocument> > arrayQueries = new List <FilterDefinition <BsonDocument> >(); List <FilterDefinition <BsonDocument> > noArrayQueries = new List <FilterDefinition <BsonDocument> >() { Builders <BsonDocument> .Filter.Not(Builders <BsonDocument> .Filter.Type(parameterName, BsonType.Array)) }; switch (optor) { case Operator.EQ: arrayQueries.Add(Builders <BsonDocument> .Filter.Regex("decimals", new BsonRegularExpression("^" + decimals))); noArrayQueries.Add(Builders <BsonDocument> .Filter.Regex(parameterName + ".decimals", new BsonRegularExpression("^" + decimals))); break; default: arrayQueries.Add(ExpressionQuery("value", optor, value)); noArrayQueries.Add(ExpressionQuery(parameterName + ".value", optor, value)); break; } if (quantity.System != null) { arrayQueries.Add(Builders <BsonDocument> .Filter.Eq("system", quantity.System.ToString())); noArrayQueries.Add(Builders <BsonDocument> .Filter.Eq(parameterName + ".system", quantity.System.ToString())); } arrayQueries.Add(Builders <BsonDocument> .Filter.Eq("unit", q.Metric.ToString())); noArrayQueries.Add(Builders <BsonDocument> .Filter.Eq(parameterName + ".unit", q.Metric.ToString())); var arrayQuery = Builders <BsonDocument> .Filter.ElemMatch(parameterName, Builders <BsonDocument> .Filter.And(arrayQueries)); var noArrayQuery = Builders <BsonDocument> .Filter.And(noArrayQueries); FilterDefinition <BsonDocument> query = Builders <BsonDocument> .Filter.Or(arrayQuery, noArrayQuery); return(query); }