Пример #1
0
        /// <summary>
        /// Generates a query that matches against a specific segment
        /// </summary>
        /// <param name="segment">Segment to match</param>
        /// <returns>Query</returns>
        static string GenerateSegmentMatchQuery(NcbtSegment segment)
        {
            // Build query
            var queryBuilder = new StringBuilder();

            queryBuilder.Append("{ '$and':[ ");

            segment.CriterionGroups.ForEach(cg =>
            {
                queryBuilder.Append("{ '$or':[ ");

                cg.Criterions.ForEach(c =>
                {
                    queryBuilder.Append("{ '" + c.PropertyAlias + ".Value':");

                    queryBuilder.Append(GenerateCriterionMatchQuery(c));

                    queryBuilder.Append(" },"); // End criterion object. Mongo doesn't care about the extra comma on the last object in the array
                });

                queryBuilder.Append("] },"); // End '$or' array
            });

            queryBuilder.Append("] }"); // End '$and' array

            // Return query
            return(queryBuilder.ToString());
        }
Пример #2
0
        /// <summary>
        /// Generates a query that matches a user against a specific segment taking specific properties into account
        /// </summary>
        /// <param name="segment">Segment to match</param>
        /// <param name="properties">Dictionary of properties to include or not</param>
        /// <returns>Query</returns>
        static string GenerateSegmentWithPropertiesMatchQuery(NcbtSegment segment, IReadOnlyDictionary <string, bool> properties)
        {
            // Build query
            var queryBuilder = new StringBuilder();

            queryBuilder.Append("{ '$and':[ ");

            properties.ForEach(p =>
            {
                if (p.Value)
                {
                    queryBuilder.Append("{ '" + p.Key + "': { $exists: true, $nin: [null] }},");
                }
                else
                {
                    queryBuilder.Append("{ '" + p.Key + "': { $exists: false }},");
                }
            });
            queryBuilder.Append(GenerateSegmentMatchQuery(segment));

            queryBuilder.Append("] }"); // End '$and' array

            // Return query
            return(queryBuilder.ToString());
        }
Пример #3
0
        /// <summary>
        /// Generates a query that matches a user against a specific segment and checks if that segment needs to be inserted or updated on the user
        /// </summary>
        /// <param name="visitorId">Id of the visitor</param>
        /// <param name="segment">Segment to match</param>
        /// <returns>Query</returns>
        static string GenerateNeedsPersistenceQuery(string visitorId, NcbtSegment segment)
        {
            var queryBuilder = new StringBuilder();

            queryBuilder.Append("{ '$and':[ ");

            queryBuilder.Append("{ '_id': ObjectId('" + visitorId + "') }");
            if (segment.Persistence != 0)
            {
                queryBuilder.Append(",");
                queryBuilder.Append("{ '$or':[ ");
                queryBuilder.Append(
                    "{ 'ncbt.persistedSegments.{SEGMENT}': { '$lt': {DATE} } }"
                    .Replace("{SEGMENT}", segment.Alias)
                    .Replace("{DATE}", $"ISODate(\"{DateTime.UtcNow.AddDays(-(segment.Persistence >= 0 ? segment.Persistence : 0)).ToString("O")}\")"));
                queryBuilder.Append(",");
                queryBuilder.Append("{ 'ncbt.persistedSegments.{SEGMENT}': { $exists: false } }".Replace("{SEGMENT}", segment.Alias));
                queryBuilder.Append("] },"); // End '$or' array
            }
            else
            {
                queryBuilder.Append(GenerateSegmentMatchQuery(segment));
            }
            queryBuilder.Append("] }"); // End '$and' array

            // Return query
            return(queryBuilder.ToString());
        }
Пример #4
0
        public long CountVisitorsInSegment(NcbtSegment segment)
        {
            if (segment == null || !segment.HasCriterions)
            {
                return(0);
            }

            return(collection.CountAsync(BsonDocument.Parse(GenerateSegmentMatchQuery(segment))).Result);
        }
Пример #5
0
        public IReadOnlyCollection <dynamic> GetVisitorsInSegmentWithProperties(NcbtSegment segment, IReadOnlyDictionary <string, bool> properties)
        {
            if (segment == null || !segment.HasCriterions)
            {
                return(new List <dynamic>());
            }

            return(collection.Find(BsonDocument.Parse(GenerateSegmentWithPropertiesMatchQuery(segment, properties)))
                   .ToListAsync()
                   .Result);
        }
Пример #6
0
        public IReadOnlyCollection <dynamic> GetVisitorsInSegment(NcbtSegment segment)
        {
            if (segment == null || !segment.HasCriterions)
            {
                return(new List <dynamic>());
            }

            return(collection.Find(BsonDocument.Parse(GenerateSegmentMatchQuery(segment)))
                   .ToListAsync()
                   .Result);
        }
Пример #7
0
        public virtual bool IsVisitorInSegment(string visitorId, NcbtSegment segment)
        {
            if (visitorId.IsNullOrWhiteSpace())
            {
                return(false);
            }

            if (segment == null || !segment.HasCriterions)
            {
                return(false);
            }

            return(collection.CountAsync(BsonDocument.Parse(GenerateIsVisitorInSegmentQuery(visitorId, segment)))
                   .Result > 0);
        }
Пример #8
0
        public bool IsVisitorInSegment(string visitorId, NcbtSegment segment)
        {
            var row = GetVisitorSegments(visitorId, segment);

            if (row == null)
            {
                return(false);
            }

            if (segment.Persistence > 0)
            {
                return(DateTime.UtcNow.AddDays(segment.Persistence) > row.CreatedUtc);
            }

            return(segment.Persistence < 0);
        }
Пример #9
0
        public void AddToSegment(string visitorId, NcbtSegment segment)
        {
            var row = GetVisitorSegments(visitorId, segment);

            if (row == null)
            {
                using (var connection = connectionFactory())
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = "INSERT INTO dbo.ncBtVisitorSegment (VisitorId, SegmentAlias, CreatedUtc) VALUES (@visitorId, @segmentAlias, @createdUtc);";
                        command.Parameters.AddWithValue("@visitorId", visitorId);
                        command.Parameters.AddWithValue("@segmentAlias", segment.Alias);
                        command.Parameters.AddWithValue("@createdUtc", DateTime.UtcNow);
                        command.ExecuteNonQuery();
                    }
            }
        }
Пример #10
0
        public dynamic Save(dynamic node)
        {
            try
            {
                // Try casting to a segment
                var segment = JsonConvert.DeserializeObject <NcbtSegment>(((JObject)node).ToString());

                // Save segment
                var success = segment.Save();

                // Return updated segment
                return(NcbtSegment.GetById(segment.Id));
            }
            catch (Exception e)
            {
                return(e);
            }
        }
Пример #11
0
        public long CountVisitorsInSegment(NcbtSegment segment)
        {
            var persistence = segment.Persistence;

            // If nothing is "persisted" (though it is) we don't include them
            // in the stats.
            if (persistence == 0)
            {
                return(0);
            }

            using (var connection = connectionFactory())
                using (var command = connection.CreateCommand())
                {
                    command.Parameters.AddWithValue("@segmentAlias", segment.Alias);

                    if (persistence < 0)
                    {
                        command.CommandText = $"SELECT COUNT(*) FROM {VisitorSegment.TableName} WHERE {nameof(VisitorSegment.SegmentAlias)} = @segmentAlias;";
                        return((int)command.ExecuteScalar());
                    }

                    command.CommandText = $"SELECT {nameof(VisitorSegment.CreatedUtc)} FROM {VisitorSegment.TableName} WHERE {nameof(VisitorSegment.SegmentAlias)} = @segmentAlias;";

                    using (var reader = command.ExecuteReader())
                    {
                        var rows = 0;
                        var now  = DateTime.Now;

                        while (reader.Read())
                        {
                            var persistedAt = reader.GetDateTime(0);

                            if ((now - persistedAt).TotalDays <= persistence)
                            {
                                rows++;
                            }
                        }

                        return(rows);
                    }
                }
        }
Пример #12
0
        public void AddToSegment(string visitorId, NcbtSegment segment)
        {
            if (visitorId == null)
            {
                throw new ArgumentNullException(nameof(visitorId));
            }

            if (segment == null)
            {
                throw new ArgumentNullException(nameof(segment));
            }

            var options = new UpdateOptions {
                IsUpsert = true
            };
            var update = new BsonDocument("$set", new BsonDocument(new Dictionary <string, object> {
                { "ncbt.persistedSegments." + segment.Alias, DateTime.UtcNow }
            }));
            var filter = BsonDocument.Parse(GenerateNeedsPersistenceQuery(visitorId, segment));

            collection.UpdateOneAsync(filter, update, options);
        }
Пример #13
0
 public void Delete(int id)
 {
     NcbtSegment.DeleteById(id);
 }
Пример #14
0
 public dynamic GetAllLight()
 {
     return(NcbtSegment.GetAllLight());
 }
Пример #15
0
 public dynamic GetLightById(int id)
 {
     return(NcbtSegment.GetLightById(id));
 }