private static BaseQuery BuildUpdateQuery(ITrackedModel <BaseModel> trackedModel)
        {
            var rootSchemaName = trackedModel.Model.GetSchemaName();
            var values         = trackedModel.GetChanges();

            if (!values.Any())
            {
                return(null);
            }

            var updateQuery = new UpdateQuery()
            {
                RootSchemaName = rootSchemaName,
                ColumnValues   = new ColumnValues()
                {
                    Items = ConvertValuesToColumnExpressions(trackedModel.Type, values)
                },
                Filters = new Filters()
                {
                    FilterType = FilterType.FilterGroup,
                    Items      = new Dictionary <string, Filter>()
                    {
                        { "PrimaryFilter", GeneratePrimaryFilter(trackedModel) }
                    },
                }
            };

            return(updateQuery);
        }
        private static BaseQuery BuildInsertQuery(ITrackedModel <BaseModel> trackedModel)
        {
            var rootSchemaName = trackedModel.Model.GetSchemaName();
            var values         = trackedModel.Model.GetModelPropertyValues();
            var insertQuery    = new InsertQuery()
            {
                RootSchemaName = rootSchemaName,
                ColumnValues   = new ColumnValues()
                {
                    Items = ConvertValuesToColumnExpressions(trackedModel.Type, values)
                }
            };

            return(insertQuery);
        }
        public static BaseQuery BuildModifyQuery(ITrackedModel <BaseModel> trackedModel)
        {
            switch (trackedModel.GetStatus())
            {
            case ModelState.New:
                return(BuildInsertQuery(trackedModel));

            case ModelState.Changed:
                return(BuildUpdateQuery(trackedModel));

            case ModelState.Deleted:
                return(BuildDeleteQuery(trackedModel));

            default:
                throw new NotSupportedException();
            }
        }
        private static BaseQuery BuildDeleteQuery(ITrackedModel <BaseModel> trackedModel)
        {
            var rootSchemaName = trackedModel.Model.GetSchemaName();
            var deleteQuery    = new DeleteQuery()
            {
                RootSchemaName = rootSchemaName,
                Filters        = new Filters()
                {
                    FilterType = FilterType.FilterGroup,
                    Items      = new Dictionary <string, Filter>()
                    {
                        { "PrimaryFilter", GeneratePrimaryFilter(trackedModel) }
                    },
                }
            };

            return(deleteQuery);
        }
 private static Filter GeneratePrimaryFilter(ITrackedModel <BaseModel> trackedModel)
 {
     return(new Filter()
     {
         FilterType = FilterType.CompareFilter,
         LeftExpression = new ColumnExpression()
         {
             ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
             ColumnPath = "Id"
         },
         ComparisonType = FilterComparisonType.Equal,
         RightExpression = new BaseExpression()
         {
             ExpressionType = EntitySchemaQueryExpressionType.Parameter,
             Parameter = new Parameter()
             {
                 Value = trackedModel.Model.Id,
                 DataValueType = DataValueType.Guid
             }
         }
     });
 }