Пример #1
0
        public void Write(RelationalEvent evt)
        {
            lock (_syncRoot) {
                if (_schema == null)
                {
                    _schema = new SortedList <string, RelationalField>();
                    foreach (var s in evt.Schema)
                    {
                        _schema.Add(s.ColumnName, s);
                    }
                }
                else
                {
                    // Check to see if anything has changed...
                    foreach (var s in evt.Schema)
                    {
                        if (_schema.ContainsKey(s.ColumnName))
                        {
                            if (_schema[s.ColumnName].Type != s.Type)
                            {
                                // There is a change in type, always expand to
                                _schema[s.ColumnName].Type = DbType.Varchar;
                            }
                        }
                        else
                        {
                            // There is a new field
                            _schema.Add(s.ColumnName, s);
                        }
                    }
                }

                // Its a new time block, so dispose of all the active files
                if (_lastTimeString == null || _lastTimeString != GetCurrentTimeString())
                {
                    var keys = _schemaFiles.Keys.ToList();

                    foreach (var k in keys)
                    {
                        _schemaFiles[k].Dispose();
                        _schemaFiles.Remove(k);
                    }

                    _lastTimeString = GetCurrentTimeString();
                }

                var schemaHash = RelationalEventFile.GetSchemaHash(_schema);

                if (!_schemaFiles.ContainsKey(schemaHash))
                {
                    _schemaFiles[schemaHash] = new RelationalEventFile(_basePath, GetCurrentTimeString(), _eventName, _schema);
                }

                _schemaFiles[schemaHash].WriteRow(evt);
            }
        }
Пример #2
0
        public static void WriteRow(StreamWriter writer, SortedList <string, RelationalField> schema, RelationalEvent evt)
        {
            var values = new string[] {
                RelationalEvent.Serialize(evt._Id_),
                RelationalEvent.Serialize(evt._ParentId_),
                RelationalEvent.Serialize(evt._At_)
            }.Concat(
                schema.Select(x => evt[x.Key])
                );

            writer.WriteLine(string.Join("\t", values.Select(x => x)));
            writer.Flush();
        }
Пример #3
0
        public static IEnumerable<RelationalEvent> ProcessJsonArray(JToken t, string eventName, RelationalEvent parent)
        {
            if (t.Type == JTokenType.Array) {
                foreach (var child in t.Children()) {
                    if (child.Type == JTokenType.Object) {
                        foreach (var r in ProcessJsonObject(child, eventName, parent)) {
                            yield return r;
                        }

                    }

                }
            }
        }
Пример #4
0
        public static IEnumerable<RelationalEvent> Process(JToken t, string eventName, RelationalEvent parent)
        {
            if (t.Type == JTokenType.Object) {
                foreach (var r in ProcessJsonObject(t, eventName, null)) {
                    yield return r;

                }
            }
            if (t.Type == JTokenType.Array) {
                foreach (var r in ProcessJsonArray(t, eventName, null)) {
                    yield return r;

                }
            }
        }
Пример #5
0
        public static IEnumerable<RelationalEvent> ProcessJsonObject(JToken t, string eventName, RelationalEvent parent)
        {
            var relation = new RelationalEvent();

            relation._Id_ = RelationalEvent.GetKey();
            relation._At_ = DateTime.UtcNow;
            relation.Name = eventName.ToLowerInvariant();

            if (parent != null) {
                relation._ParentId_ = parent._Id_;
                relation.ParentType = parent.Name;

                relation.Name = relation.ParentType + "_" + relation.Name;
            } else {
                relation._ParentId_ = null;
                relation.ParentType = null;
            }

            if (t.Type == JTokenType.Object) {
                // If we have an object, we want to create fields for all the
                // "simple" types, and child items for all the complex ones

                foreach (var child in t.Children()) {
                    if (child.Type == JTokenType.Property) {
                        var property = child as JProperty;
                        var dbType = DbTypes.FromJsonType(property.Value.Type);
                        if (dbType != DbType.Unknown) {
                            relation.AddField(property.Name, dbType, GetValue(property, dbType));
                        } else {
                            if (property.Value.Type == JTokenType.Array) {
                                foreach (var r in ProcessJsonArray(property.Value, property.Name, relation)) {
                                    yield return r;
                                }
                            }

                            if (property.Value.Type == JTokenType.Object) {
                                foreach (var r in ProcessJsonObject(property.Value, property.Name, relation)) {
                                    yield return r;
                                }

                            }

                        }
                    }
                }
            }
            yield return relation;
        }
Пример #6
0
        public void Write(RelationalEvent evt)
        {
            lock (_syncRoot) {
                if (_schema == null) {
                    _schema = new SortedList<string, RelationalField>();
                    foreach (var s in evt.Schema) {
                        _schema.Add(s.ColumnName, s);
                    }

                } else {
                    // Check to see if anything has changed...
                    foreach (var s in evt.Schema) {
                        if (_schema.ContainsKey(s.ColumnName)) {
                            if (_schema[s.ColumnName].Type != s.Type) {
                                // There is a change in type, always expand to
                                _schema[s.ColumnName].Type = DbType.Varchar;
                            }
                        } else {
                            // There is a new field
                            _schema.Add(s.ColumnName, s);
                        }
                    }
                }

                // Its a new time block, so dispose of all the active files
                if (_lastTimeString == null || _lastTimeString != GetCurrentTimeString()) {
                    var keys = _schemaFiles.Keys.ToList();

                    foreach (var k in keys) {
                        _schemaFiles[k].Dispose();
                        _schemaFiles.Remove(k);
                    }

                    _lastTimeString = GetCurrentTimeString();
                }

                var schemaHash = RelationalEventFile.GetSchemaHash(_schema);

                if (!_schemaFiles.ContainsKey(schemaHash)) {
                    _schemaFiles[schemaHash] = new RelationalEventFile(_basePath, GetCurrentTimeString(), _eventName, _schema);
                }

                _schemaFiles[schemaHash].WriteRow(evt);
            }
        }
Пример #7
0
        public static void WriteRow(StreamWriter writer, SortedList<string, RelationalField> schema, RelationalEvent evt)
        {
            var values = new string[] {
                RelationalEvent.Serialize(evt._Id_),
                RelationalEvent.Serialize(evt._ParentId_),
                RelationalEvent.Serialize(evt._At_)
            }.Concat(
                schema.Select(x => evt[x.Key])
            );

            writer.WriteLine(string.Join("\t", values.Select(x => x)));
            writer.Flush();
        }
Пример #8
0
 public void WriteRow(RelationalEvent evt)
 {
     WriteRow(_currentStream, _schema, evt);
 }
Пример #9
0
        public static IEnumerable <RelationalEvent> ProcessJsonObject(JToken t, string eventName, RelationalEvent parent)
        {
            var relation = new RelationalEvent();

            relation._Id_ = RelationalEvent.GetKey();
            relation._At_ = DateTime.UtcNow;
            relation.Name = eventName.ToLowerInvariant();


            if (parent != null)
            {
                relation._ParentId_ = parent._Id_;
                relation.ParentType = parent.Name;

                relation.Name = relation.ParentType + "_" + relation.Name;
            }
            else
            {
                relation._ParentId_ = null;
                relation.ParentType = null;
            }


            if (t.Type == JTokenType.Object)
            {
                // If we have an object, we want to create fields for all the
                // "simple" types, and child items for all the complex ones

                foreach (var child in t.Children())
                {
                    if (child.Type == JTokenType.Property)
                    {
                        var property = child as JProperty;
                        var dbType   = DbTypes.FromJsonType(property.Value.Type);
                        if (dbType != DbType.Unknown)
                        {
                            relation.AddField(property.Name, dbType, GetValue(property, dbType));
                        }
                        else
                        {
                            if (property.Value.Type == JTokenType.Array)
                            {
                                foreach (var r in ProcessJsonArray(property.Value, property.Name, relation))
                                {
                                    yield return(r);
                                }
                            }

                            if (property.Value.Type == JTokenType.Object)
                            {
                                foreach (var r in ProcessJsonObject(property.Value, property.Name, relation))
                                {
                                    yield return(r);
                                }
                            }
                        }
                    }
                }
            }
            yield return(relation);
        }
Пример #10
0
 public static IEnumerable <RelationalEvent> ProcessJsonArray(JToken t, string eventName, RelationalEvent parent)
 {
     if (t.Type == JTokenType.Array)
     {
         foreach (var child in t.Children())
         {
             if (child.Type == JTokenType.Object)
             {
                 foreach (var r in ProcessJsonObject(child, eventName, parent))
                 {
                     yield return(r);
                 }
             }
         }
     }
 }
Пример #11
0
 public static IEnumerable <RelationalEvent> Process(JToken t, string eventName, RelationalEvent parent)
 {
     if (t.Type == JTokenType.Object)
     {
         foreach (var r in ProcessJsonObject(t, eventName, null))
         {
             yield return(r);
         }
     }
     if (t.Type == JTokenType.Array)
     {
         foreach (var r in ProcessJsonArray(t, eventName, null))
         {
             yield return(r);
         }
     }
 }
Пример #12
0
 public void WriteRow(RelationalEvent evt)
 {
     WriteRow(_currentStream, _schema, evt);
 }