public static CreateObjectCommand Evaluate(IEngine engine, Command command)
        {
            if (command.Parameters.Count < 2)
                return null;

            if (command.Parameters[0].Name.ToLower() != "create")
                return null;
            if (command.Parameters[0].Value != null)
                return null;

            string name = command.Parameters[1].Name;
            if (string.IsNullOrEmpty(name))
                return null;

            ISchemaService schemaService = engine.GetService<ISchemaService>();
            if (!schemaService.HasClass(name))
                return null;

            CreateObjectCommand createObjectCommand = new CreateObjectCommand(name);

            IList<Parameter> parameters = command.Parameters[1].Value as IList<Parameter>;
            if (parameters != null)
            {
                foreach (Parameter parameter in parameters)
                {
                    if (schemaService.HasProperty(name, parameter.Name))
                    {
                        createObjectCommand.Values[parameter.Name] = parameter.Value;
                    }
                }
            }

            return createObjectCommand;
        }
        public static UpdateObjectsCommand Evaluate(IEngine engine, Command command)
        {
            if (command.Parameters.Count < 3)
                return null;

            if (command.Parameters[0].Name.ToLower() != "update")
                return null;
            if (command.Parameters[0].Value != null)
                return null;

            string name = command.Parameters[1].Name;
            if (string.IsNullOrEmpty(name))
                return null;

            ISchemaService schemaService = engine.GetService<ISchemaService>();
            if (!schemaService.HasClass(name))
                return null;

            if (command.Parameters[2].Name.ToLower() != "match")
                return null;
            IList<Parameter> match = command.Parameters[2].Value as IList<Parameter>;

            UpdateObjectsCommand updateObjectsCommand = new UpdateObjectsCommand(name);

            IList<Parameter> parameters = command.Parameters[1].Value as IList<Parameter>;
            if (parameters != null)
            {
                foreach (Parameter parameter in parameters)
                {
                    if (schemaService.HasProperty(name, parameter.Name))
                    {
                        updateObjectsCommand.Values[parameter.Name] = parameter.Value;
                    }
                }
            }

            if (match != null)
            {
                foreach (Parameter parameter in match)
                {
                    if (schemaService.HasProperty(name, parameter.Name))
                    {
                        updateObjectsCommand.Match[parameter.Name] = parameter.Value;
                    }
                }
            }

            return updateObjectsCommand;
        }
        public static DisplayObjectsCommand Evaluate(IEngine engine, Command command)
        {
            if (command.Parameters.Count < 2)
                return null;

            bool list = false;

            switch (command.Parameters[0].Name.ToLower())
            {
                case "display":
                case "show":
                    break;
                case "list":
                    list = true;
                    break;
                default:
                    return null;
            }
            if (command.Parameters[0].Value != null)
                return null;

            string name = command.Parameters[1].Name;
            if (string.IsNullOrEmpty(name))
                return null;

            ISchemaService schemaService = engine.GetService<ISchemaService>();
            if (!schemaService.HasClass(name))
                return null;

            DisplayObjectsCommand displayObjectsCommand = new DisplayObjectsCommand(name, list);

            EvaluateMatch(command.Parameters[1].Value, name, schemaService, displayObjectsCommand);

            if (command.Parameters.Count > 2)
            {
                switch (command.Parameters[2].Name.ToLower())
                {
                    case "match":
                    case "where":
                        EvaluateMatch(command.Parameters[2].Value, name, schemaService, displayObjectsCommand);
                        break;
                    case "query":
                        if (command.Parameters[2].Value != null)
                            displayObjectsCommand.Where = command.Parameters[2].Value.ToString();
                        break;
                }
            }
            return displayObjectsCommand;
        }
        public static CreateClassCommand Evaluate(Command command)
        {
            if (command.Parameters.Count < 3)
                return null;

            if (command.Parameters[0].Name.ToLower() != "create")
                return null;
            if (command.Parameters[0].Value != null)
                return null;

            if (command.Parameters[1].Name.ToLower() != "class")
                return null;
            if (command.Parameters[1].Value != null)
                return null;

            string name = command.Parameters[2].Name;
                if (string.IsNullOrEmpty(name))
                    return null;  // register exception...

            CreateClassCommand createClassCommand = new CreateClassCommand(name);

            IList<Parameter> parameters = command.Parameters[2].Value as IList<Parameter>;
            if (parameters != null)
            {
                foreach (Parameter parameter in parameters)
                {
                    switch (parameter.Name.ToLower())
                    {
                        case "base":
                            createClassCommand.BaseClass = parameter.Value.ToString();
                            break;
                        case "table":
                        case "tablename":
                            createClassCommand.TableName = parameter.Value.ToString();
                            break;
                    }
                }
            }

            return createClassCommand;
        }
        public static DeleteObjectsCommand Evaluate(IEngine engine, Command command)
        {
            if (command.Parameters.Count < 2)
                return null;

            if (command.Parameters[0].Name.ToLower() != "delete")
                return null;
            if (command.Parameters[0].Value != null)
                return null;

            string name = command.Parameters[1].Name;
            if (string.IsNullOrEmpty(name))
                return null;

            ISchemaService schemaService = engine.GetService<ISchemaService>();
            if (!schemaService.HasClass(name))
                return null;

            DeleteObjectsCommand deleteObjectsCommand = new DeleteObjectsCommand(name);

            EvaluateMatch(command.Parameters[1].Value, name, schemaService, deleteObjectsCommand);

            if (command.Parameters.Count > 2)
            {
                switch (command.Parameters[2].Name.ToLower())
                {
                    case "match":
                    case "where":
                        EvaluateMatch(command.Parameters[2].Value, name, schemaService, deleteObjectsCommand);
                        break;
                    case "query":
                        if (command.Parameters[2].Value != null)
                            deleteObjectsCommand.Where = command.Parameters[2].Value.ToString();
                        break;
                }
            }
            return deleteObjectsCommand;
        }
 public ExecutionEventArgs(Command command)
 {
     this.Command = command;
 }
        public static CreatePropertyCommand Evaluate(IEngine engine, Command command)
        {
            if (command.Parameters.Count < 3)
                return null;

            if (command.Parameters[0].Name.ToLower() != "create")
                return null;
            if (command.Parameters[0].Value != null)
                return null;

            Multiplicity multiplicity = Multiplicity.None;

            switch (command.Parameters[1].Name.ToLower())
            {
                case "property":
                case "relationship":
                    break;
                case "one-one":
                case "oneone":
                case "one-to-one":
                case "onetoone":
                    multiplicity = Multiplicity.OneToOne;
                    break;
                case "one-many":
                case "onemany":
                case "one-to-many":
                case "onetomany":
                case "reference":
                    multiplicity = Multiplicity.OneToMany;
                    break;
                case "many-one":
                case "manyone":
                case "many-to-one":
                case "manytoone":
                case "list":
                    multiplicity = Multiplicity.ManyToOne;
                    break;
                case "many-many":
                case "manymany":
                case "many-to-many":
                case "manytomany":
                    multiplicity = Multiplicity.ManyToMany;
                    break;
                default:
                    return null;
            }
            if (command.Parameters[1].Value != null)
                return null;

            string name = command.Parameters[2].Name;
            if (string.IsNullOrEmpty(name))
                return null;  // register exception...

            string[] parts = name.Split(".".ToCharArray());
            if (parts.Length != 2)
                return null;  // register exception...

            string className = parts[0];
            string propertyName = parts[1];

            if (string.IsNullOrEmpty(className))
                return null;  // register exception...

            if (string.IsNullOrEmpty(propertyName))
                return null;  // register exception...

            ISchemaService schemaService = engine.GetService<ISchemaService>();
            IObjectService objectService = engine.GetService<IObjectService>();

            CreatePropertyCommand createPropertyCommand = new CreatePropertyCommand(className, propertyName);
            createPropertyCommand.Multiplicity = multiplicity;
            createPropertyCommand.Type = typeof(string);
            createPropertyCommand.StringLength = 255;

            bool list = false;

            IList<Parameter> parameters = command.Parameters[2].Value as IList<Parameter>;
            if (parameters != null)
            {
                foreach (Parameter parameter in parameters)
                {
                    if (parameter.Value != null)
                    {
                        switch (parameter.Name.ToLower())
                        {
                            case "type":
                                if (schemaService.HasClass(parameter.Value.ToString()))
                                    createPropertyCommand.Type = objectService.GetTypeByName(parameter.Value.ToString());
                                else
                                    createPropertyCommand.Type = Type.GetType(parameter.Value.ToString());
                                break;
                            case "list":
                                list = true;
                                break;
                            case "multiplicity":
                            case "ref":
                            case "reference":
                            case "referencetype":
                                if (createPropertyCommand.Multiplicity == Multiplicity.None)
                                {
                                    string refType = parameter.Value.ToString();
                                    switch (refType.ToLower())
                                    {
                                        case "one-one":
                                        case "oneone":
                                        case "one-to-one":
                                        case "onetoone":
                                            createPropertyCommand.Multiplicity = Multiplicity.OneToOne;
                                            break;
                                        case "one-many":
                                        case "onemany":
                                        case "one-to-many":
                                        case "onetomany":
                                            createPropertyCommand.Multiplicity = Multiplicity.OneToMany;
                                            break;
                                        case "many-one":
                                        case "manyone":
                                        case "many-to-one":
                                        case "manytoone":
                                            createPropertyCommand.Multiplicity = Multiplicity.ManyToOne;
                                            break;
                                        case "many-many":
                                        case "manymany":
                                        case "many-to-many":
                                        case "manytomany":
                                            createPropertyCommand.Multiplicity = Multiplicity.ManyToMany;
                                            break;
                                        default:
                                            createPropertyCommand.Multiplicity = Multiplicity.None;
                                            break;
                                    }
                                }
                                list = true;
                                break;
                            case "length":
                                createPropertyCommand.StringLength = Convert.ToInt32(parameter.Value.ToString());
                                break;
                            case "column":
                            case "columnname":
                                createPropertyCommand.ColumnName = parameter.Value.ToString();
                                break;
                            case "null":
                            case "nullable":
                                createPropertyCommand.Nullable = Convert.ToBoolean(parameter.Value.ToString());
                                break;
                            case "inverse":
                                createPropertyCommand.Inverse = parameter.Value.ToString();
                                break;
                        }
                    }
                }
            }

            if (createPropertyCommand.Multiplicity == Multiplicity.None)
            {
                if (schemaService.HasClass(objectService.GetTypeName(createPropertyCommand.Type)))
                {
                    if (list)
                        createPropertyCommand.Multiplicity = Multiplicity.ManyToOne;
                    else
                        createPropertyCommand.Multiplicity = Multiplicity.OneToMany;
                }
            }

            if (createPropertyCommand.Multiplicity != Multiplicity.None)
            {
                if (string.IsNullOrEmpty(createPropertyCommand.Inverse))
                    createPropertyCommand.Inverse = "InverseOf" + name;
            }

            return createPropertyCommand;
        }