Пример #1
0
        private SimpleQuery ParseJoin(InvokeMemberBinder binder, object[] args)
        {
            var tableToJoin = args[0] as ObjectReference;

            if (tableToJoin == null)
            {
                throw new InvalidOperationException();
            }

            SimpleExpression joinExpression = null;

            if (binder.CallInfo.ArgumentNames.Any(s => !string.IsNullOrWhiteSpace(s)))
            {
                joinExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableToJoin,
                                                                                 binder.NamedArgumentsToDictionary(args));
            }
            else if (args.Length == 2)
            {
                joinExpression = args[1] as SimpleExpression;
            }

            if (joinExpression == null)
            {
                throw new InvalidOperationException();
            }

            var newJoin = new JoinClause(tableToJoin, joinExpression);

            return(AddNewJoin(newJoin));
        }
Пример #2
0
        private static IEnumerable <KeyValuePair <string, object> > CreateCriteriaDictionary(InvokeMemberBinder binder, IList <object> args)
        {
            IDictionary <string, object> criteriaDictionary = null;

            if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by"))
            {
                if (args.Count == 0)
                {
                    throw new ArgumentException("FindBy requires arguments.");
                }
                if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
                {
                    criteriaDictionary = binder.NamedArgumentsToDictionary(args);
                }
                else if (args.Count == 1)
                {
                    if (ReferenceEquals(args[0], null))
                    {
                        throw new ArgumentException("FindBy does not accept unnamed null argument.");
                    }
                    criteriaDictionary = args[0].ObjectToDictionary();
                }
            }
            else
            {
                criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
            }
            return(criteriaDictionary);
        }
Пример #3
0
        internal static IEnumerable <KeyValuePair <string, object> > CreateCriteriaDictionary(InvokeMemberBinder binder, IList <object> args, params string[] exactNames)
        {
            IDictionary <string, object> criteriaDictionary = null;

            if (exactNames.Contains(binder.Name))
            {
                if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
                {
                    criteriaDictionary = binder.NamedArgumentsToDictionary(args);
                }
                else if (args.Count == 1)
                {
                    if (ReferenceEquals(args[0], null))
                    {
                        throw new ArgumentException("FindBy does not accept unnamed null argument.");
                    }
                    criteriaDictionary = args[0].ObjectToDictionary();
                }
            }
            else
            {
                criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
            }

            if (criteriaDictionary == null || criteriaDictionary.Count == 0)
            {
                throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by.");
            }
            return(criteriaDictionary);
        }
Пример #4
0
        private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table)
        {
            var criteria = binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase) ?
                           binder.NamedArgumentsToDictionary(args)
                               :
                           MethodNameParser.ParseFromBinder(binder, args);

            return(ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria));
        }
Пример #5
0
        private SimpleQuery ParseOn(InvokeMemberBinder binder, IEnumerable <object> args)
        {
            if (_tempJoinWaitingForOn == null)
            {
                throw new InvalidOperationException("Call to On must be preceded by call to Join.");
            }
            var joinExpression = ExpressionHelper.CriteriaDictionaryToExpression(_tempJoinWaitingForOn.Table,
                                                                                 binder.NamedArgumentsToDictionary(args));

            return(new SimpleQuery(this, _clauses.Append(new JoinClause(_tempJoinWaitingForOn.Table, joinExpression))));
        }
Пример #6
0
 internal static IDictionary <string, object> ParseFromBinder(InvokeMemberBinder binder, IList <object> args)
 {
     if (binder == null)
     {
         throw new ArgumentNullException("binder");
     }
     if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
     {
         return(ParseFromMethodName(binder.Name, binder.NamedArgumentsToDictionary(args)));
     }
     return(ParseFromMethodName(binder.Name, args));
 }
Пример #7
0
        public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            if (binder.HasSingleUnnamedArgument())
            {
                return(UpdateByKeyFields(table.GetQualifiedName(), dataStrategy, args[0],
                                         MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name)));
            }

            var criteria           = MethodNameParser.ParseFromBinder(binder, args);
            var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria);
            var data = binder.NamedArgumentsToDictionary(args)
                       .Where(kvp => !criteria.ContainsKey(kvp.Key))
                       .ToDictionary();

            return(dataStrategy.Update(table.GetQualifiedName(), data, criteriaExpression));
        }
Пример #8
0
        private SimpleQuery ParseOn(InvokeMemberBinder binder, IEnumerable <object> args)
        {
            if (_tempJoinWaitingForOn == null)
            {
                throw new InvalidOperationException("Call to On must be preceded by call to JoinInfo.");
            }
            var namedArguments = binder.NamedArgumentsToDictionary(args);

            if (namedArguments == null || namedArguments.Count == 0)
            {
                throw new BadExpressionException("On expects an expression or named parameters.");
            }
            var joinExpression = ExpressionHelper.CriteriaDictionaryToExpression(_tempJoinWaitingForOn.Table,
                                                                                 namedArguments);

            return(AddNewJoin(new JoinClause(_tempJoinWaitingForOn.Table, _tempJoinWaitingForOn.JoinType, joinExpression)));
        }
Пример #9
0
        private static IDictionary <string, object> CreateCriteriaDictionary(InvokeMemberBinder binder, IList <object> args)
        {
            IDictionary <string, object> criteriaDictionary = null;

            if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by"))
            {
                if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
                {
                    criteriaDictionary = binder.NamedArgumentsToDictionary(args);
                }
            }
            else
            {
                criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args);
            }
            return(criteriaDictionary);
        }
Пример #10
0
        private SimpleQuery ParseJoin(InvokeMemberBinder binder, object[] args)
        {
            var tableToJoin = args[0] as ObjectReference;

            if (ReferenceEquals(tableToJoin, null))
            {
                var dynamicTable = args[0] as DynamicTable;
                if (!ReferenceEquals(dynamicTable, null))
                {
                    tableToJoin = dynamicTable.ToObjectReference();
                }
            }
            if (tableToJoin == null)
            {
                throw new BadJoinExpressionException("Incorrect join table specified");
            }
            if (HomogenizedEqualityComparer.DefaultInstance.Equals(tableToJoin.GetAliasOrName(), _tableName))
            {
                throw new BadJoinExpressionException("Cannot join unaliased table to itself.");
            }

            SimpleExpression joinExpression = null;

            if (binder.CallInfo.ArgumentNames.Any(s => !string.IsNullOrWhiteSpace(s)))
            {
                joinExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableToJoin,
                                                                                 binder.NamedArgumentsToDictionary(args));
            }
            else if (args.Length == 2)
            {
                joinExpression = args[1] as SimpleExpression;
            }

            if (joinExpression == null)
            {
                throw new BadJoinExpressionException("Could not create join expression");
            }

            var type    = binder.Name.Equals("join", StringComparison.OrdinalIgnoreCase) ? JoinType.Inner : JoinType.Outer;
            var newJoin = new JoinClause(tableToJoin, type, joinExpression);

            return(AddNewJoin(newJoin));
        }
Пример #11
0
 internal static IDictionary <string, object> ParseFromBinder(InvokeMemberBinder binder, IList <object> args)
 {
     if (binder == null)
     {
         throw new ArgumentNullException("binder");
     }
     if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0)
     {
         return(ParseFromMethodName(binder.Name, binder.NamedArgumentsToDictionary(args)));
     }
     if (binder.Name.Equals("findby", StringComparison.OrdinalIgnoreCase) || binder.Name.Equals("find_by", StringComparison.OrdinalIgnoreCase))
     {
         if (args.Count == 1)
         {
             return(args[0].ObjectToDictionary());
         }
         throw new InvalidOperationException("Invalid criteria specification.");
     }
     return(ParseFromMethodName(binder.Name, args));
 }
Пример #12
0
        public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            var criteria = args.OfType <SimpleExpression>().SingleOrDefault() ?? new SimpleEmptyExpression();

            var data = binder.NamedArgumentsToDictionary(args).Where(kv => !(kv.Value is SimpleExpression)).ToDictionary();

            if (data.Count == 0)
            {
                data = args.OfType <IDictionary <string, object> >().SingleOrDefault();
            }

            if (data == null)
            {
                throw new SimpleDataException("Could not resolve data.");
            }

            var updatedCount = dataStrategy.Run.Update(table.GetQualifiedName(), data, criteria);

            return(updatedCount.ResultSetFromModifiedRowCount());
        }
Пример #13
0
        public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            object[] objects;
            if (binder.CallInfo.ArgumentNames.Count > 0 && binder.CallInfo.ArgumentNames.All(s => !string.IsNullOrWhiteSpace(s)))
            {
                objects = new object[] { binder.NamedArgumentsToDictionary(args) };
            }
            else if (args.Length == 0 || args.Length > 2)
            {
                throw new ArgumentException("Incorrect number of arguments to Upsert method.");
            }
            else
            {
                objects = args;
            }

            var result = UpsertUsingKeys(dataStrategy, table, objects, !binder.IsResultDiscarded());

            return(ResultHelper.TypeResult(result, table, dataStrategy));
        }
Пример #14
0
        public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            object result;

            if (binder.HasSingleUnnamedArgument() || args.Length == 2 && args[1] is ErrorCallback)
            {
                result = UpsertByKeyFields(table.GetQualifiedName(), dataStrategy, args[0],
                                           MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name),
                                           !binder.IsResultDiscarded(),
                                           args.Length == 2 ? (ErrorCallback)args[1] : ((item, exception) => false));
            }
            else
            {
                var criteria           = MethodNameParser.ParseFromBinder(binder, args);
                var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(),
                                                                                         criteria);
                var data = binder.NamedArgumentsToDictionary(args);
                result = dataStrategy.Run.Upsert(table.GetQualifiedName(), data, criteriaExpression, !binder.IsResultDiscarded());
            }

            return(ResultHelper.TypeResult(result, table, dataStrategy));
        }
Пример #15
0
        private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table)
        {
            IDictionary <string, object> criteria;

            if (binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase))
            {
                criteria = binder.NamedArgumentsToDictionary(args);
                if (criteria.Count == 0 && args.Length == 1)
                {
                    criteria = args[0] as IDictionary <string, object> ?? args[0].ObjectToDictionary();
                }
            }
            else
            {
                criteria = MethodNameParser.ParseFromBinder(binder, args);
            }

            if (criteria.Count == 0)
            {
                throw new InvalidOperationException("No criteria specified for Delete. To delete all data, use DeleteAll().");
            }

            return(ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria));
        }
Пример #16
0
 private static IDictionary <string, object> InsertDictionary(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName)
 {
     return(dataStrategy.Insert(tableName, binder.NamedArgumentsToDictionary(args)));
 }
Пример #17
0
 private static object InsertDictionary(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName)
 {
     return(dataStrategy.Insert(tableName, binder.NamedArgumentsToDictionary(args), !binder.IsResultDiscarded()));
 }
Пример #18
0
        public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args)
        {
            SimpleExpression criteriaExpression;

            if (binder.Name.Equals("FindAllBy") || binder.Name.Equals("find_all_by"))
            {
                criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), binder.NamedArgumentsToDictionary(args));
            }
            else
            {
                criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), MethodNameParser.ParseFromBinder(binder, args));
            }
            return(new SimpleQuery(dataStrategy.GetAdapter(), table.GetQualifiedName()).Where(criteriaExpression));
        }