public ParameterResolverValue Or(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            object resultLeft  = args[0].Value;
            object resultRight = args[1].Value;

            return(TrueLike(resultLeft) || TrueLike(resultRight) ? new ParameterResolverValue(1) : new ParameterResolverValue(0));
        }
        /// <summary>
        /// Digs for a parameter named the same as the name of the expression in a "standart" order
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="inargs"></param>
        /// <returns></returns>
        public ParameterResolverValue StandardParameter(IParameterResolverContext ctx, IList <ParameterResolverValue> inargs)
        {
            var    args       = inargs as ResolverArguments <ParameterResolverValue>;
            var    inputModel = ctx.ProcessingContext.InputModel;
            object paramValue = null;
            string paramName  = args?.Name.Value as string;

            void GetParameterValue(IDictionary <string, object> row)
            {
                if (paramValue == null && row != null && row.ContainsKey(paramName))
                {
                    paramValue = row[paramName];
                }
            }

            if (paramValue == null)
            {
                GetParameterValue(ctx.Row);
            }
            if (paramValue == null)
            {
                GetParameterValue(inputModel.Server);
            }
            if (paramValue == null)
            {
                GetParameterValue(inputModel.Client);
            }
            if (paramValue == null)
            {
                GetParameterValue(inputModel.Data);
            }

            return(new ParameterResolverValue(paramValue, EValueDataType.any));
        }
        public ParameterResolverValue IntegerContent(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            if (args.Count != 1)
            {
                throw new Exception("IntegerCountent declared with wrong number of arguments (must be 1)");
            }
            ParameterResolverValue input = args[0];

            if (input.Value != null)
            {
                if (long.TryParse(input.Value.ToString(), out long v))
                {
                    return(new ParameterResolverValue(v.ToString(), EResolverValueType.ContentType, (uint)EValueDataType.Text));
                }
                else
                {
                    throw new InvalidCastException("Cannot cast the input to integer!");
                }
            }
            else
            {
                // This result will cause excepton if not handled in some special manner.
                return(new ParameterResolverValue(null, EResolverValueType.ContentType, (uint)EValueDataType.Text));
            }
        }
Example #4
0
        public ParameterResolverValue GetHrmEmployeesInProject(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string inputParams = args[0].Value.ToString();
            string result      = GetHrmEmployeesInProject(inputParams);

            return(new ParameterResolverValue(result, EResolverValueType.ContentType));
        }
Example #5
0
        /// <summary>
        /// Generates sql syntax that can be used to check permission levels.
        /// Arguments:
        /// 1 - input params := "permission level, fromId, toId, IsDeleted = 0, tablename = Edges"
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public ParameterResolverValue GetPermission(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string inputParams = args[0].Value.ToString();
            string result      = GetPermissionSql(inputParams);

            return(new ParameterResolverValue(result, EResolverValueType.ContentType));
        }
        /// <summary>
        /// This one deals with any number of arguments and how many it accepts depends on the declaration!
        /// Produces an ORDER BY clause containing all the entries. If none of the entries resolves to something - empty string is returned
        /// </summary>
        /// <example>
        ///     OrderBy(OrderByEntry(GetFrom('client','field1'),GetFrom('client','field1dir'),'FirstName|LastName|Title'))
        ///     // A way to have shorter expressions
        ///     parameters: [
        ///         { name: "field1", Expression: "GetFrom('client',name)" },
        ///         { name: "field1dir", Expression: "GetFrom('client',name)" },
        ///         { name: "orderclause", Expression: "OrderBy(OrderByEntry(field1,field1dir,'FirstName|LastName|Title'))" }
        ///     ]
        /// </example>
        /// <param name="ctx"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public ParameterResolverValue OrderBy(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            StringBuilder sb       = new StringBuilder("ORDER BY ");
            string        coma     = "";
            bool          bSuccess = false;

            for (var i = 0; i < args.Count; i++)
            {
                var arg = args[i];
                if (arg.ValueType == EResolverValueType.ValueType || arg.ValueType == EResolverValueType.ContentType)
                {
                    if (arg.Value is string)
                    {
                        sb.AppendFormat("{0} {1}", coma, arg.Value);
                        coma     = ",";
                        bSuccess = true;
                    }
                }
            }
            if (bSuccess)
            {
                return(new ParameterResolverValue(sb.ToString(), EResolverValueType.ContentType));
            }
            else
            {
                return(new ParameterResolverValue("", EResolverValueType.ContentType));
            }
        }
        public ParameterResolverValue Concat(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string resultLeft  = (args[0].Value != null)?args[0].Value.ToString():"";
            string resultRight = (args[1].Value != null) ? args[1].Value.ToString() : "";

            return(new ParameterResolverValue(resultLeft + resultRight));
        }
        /// <summary>
        /// Configuration entry (c# inline)
        ///  {
        ///     new Resolver() {
        ///       Alias = "GetFrom",
        ///       Arguments = 2,
        ///       Name = "SayHello"
        ///     }
        /// }
        /// Arguments:
        /// 1 - source := "current,parent,parents,filter,data,client,server,sequrity,input"
        /// 2 - name := string - the name of the parameter to look for or the literal name to use the name under which the parameter is specified in the SQL.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="inargs"></param>
        /// <returns></returns>
        public ParameterResolverValue GetFrom(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            ResolverArguments <ParameterResolverValue> argsCasted = args as ResolverArguments <ParameterResolverValue>;
            string paramName = argsCasted[1].Value as string;
            string source    = argsCasted[0].Value as string;

            return(new ParameterResolverValue(StdGetParameterValue(source, paramName, ctx)));
        }
Example #9
0
        public ParameterResolverValue GetHrmEmployeesInProject(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string inputParams = args[0].Value.ToString();
            // string usermail = ctx.ProcessingContext.InputModel.SecurityModel.UserName;
            string result = GetHrmEmployeesInProject(inputParams);

            return(new ParameterResolverValue(result, EResolverValueType.ContentType));
        }
        /// <summary>
        /// Generates an order by entry FIELDNAME ASC|DESC
        /// Arguments:
        ///     0 - Fieldname
        ///     1 - ASC|DESC|1|-1
        ///     2 - Regexp tester for the Fieldname (applied with ignore case)
        ///
        ///  If fieldname is null or empty returns null(hm?)
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public ParameterResolverValue OrderByEntry(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            if (args[0].Value == null)
            {
                return(new ParameterResolverValue(null, EResolverValueType.Invalid));
            }
            var    fieldname = args[0].Value.ToString();
            var    _dir      = args[1].Value;
            string dir       = "ASC";

            if (_dir != null)
            {
                if (_dir is string sdir)
                {
                    // string
                    if (__reAscDesc.IsMatch(sdir))
                    {
                        dir = sdir.ToUpper();
                    }
                    else
                    {
                        if (double.TryParse(sdir, out var ddir))
                        {
                            if (ddir < 0)
                            {
                                dir = "DESC";
                            }
                        }
                    }
                }
                else
                {
                    if (double.TryParse(_dir.ToString(), out var xdir))
                    {
                        if (xdir < 0)
                        {
                            dir = "DESC";
                        }
                    }
                }
            }
            string refield = args[2].Value?.ToString() ?? null;

            if (refield == null)
            {
                throw new ArgumentException("3-d argument of OrderByEntry is required and has to specify a regular expression for the field name validation.");
            }
            Regex reField = new Regex(refield, RegexOptions.IgnoreCase);

            if (reField.IsMatch(fieldname))
            {
                // Returned as content type to help use it directly (not recommended though - use it as argument to OrderBy)
                return(new ParameterResolverValue(String.Format("{0} {1}", fieldname, dir), EResolverValueType.ContentType));
            }
            return(new ParameterResolverValue(null, EResolverValueType.Invalid));
        }
 /// <summary>
 /// If not null return the first value and the second otherwise
 /// Coalesce(v1,v2)
 /// </summary>
 /// <param name="ctx"></param>
 /// <param name="args"></param>
 /// <returns></returns>
 public ParameterResolverValue Coalesce(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
 {
     if (args[0].Value == null)
     {
         return(new ParameterResolverValue(args[1].Value));
     }
     else
     {
         return(new ParameterResolverValue(args[0].Value));
     }
 }
        public ParameterResolverValue HasRoleName(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string roleName = args[0].Value as string;

            if (string.IsNullOrEmpty(roleName))
            {
                throw new Exception("HasRoleName expects a non-empty string parameter for rolename");
            }
            ISecurityModel securityModel = ctx.ProcessingContext.InputModel.SecurityModel;

            return(new ParameterResolverValue(securityModel.IsInRole(args[0].Value as string), EValueDataType.Boolean));
        }
        public ParameterResolverValue Replace(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string baseString  = args[0].Value as string;
            string replaceKey  = args[1].Value as string;
            string replaceWith = (args[2].Value != null) ? args[2].Value.ToString() : "";

            if (string.IsNullOrEmpty(baseString) || string.IsNullOrEmpty(baseString))
            {
                return(new ParameterResolverValue(baseString));
            }
            var result = baseString.Replace(replaceKey, replaceWith);

            return(new ParameterResolverValue(result));
        }
        /// <summary>
        /// Argument count: 1
        /// Returns the passed value as a string marked as CONTENT_TYPE - for insertion/replacement in the query of the corresponding plugin
        /// consuming the expression in which the final value is returned through this routine
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="args">Single argument is expected. The resolver will convert some types to string,
        /// but will do it in general manner. It is recommended to pass strings.</param>
        /// <returns>Returns the argument as string marked for insertion. If it is null the "null" string marked for insertion is returned.</returns>
        public ParameterResolverValue AsContent(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            var    x = args[0].Value;
            string resultval;

            if (x == null)
            {
                return(new ParameterResolverValue("null", EResolverValueType.ContentType));
            }
            else if (x.GetType() != typeof(string))
            {
                resultval = x.ToString();
            }
            else
            {
                resultval = x as string;
            }
            return(new ParameterResolverValue(resultval, EResolverValueType.ContentType));
        }
        /// <summary>
        /// Resolver summing TWO numbers, returns number as Value (not Content)
        /// The value is converted to the most preferable type in this order (low to high):
        /// unit int double
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="args">2 - numbers/strings</param>
        /// <returns>numeric</returns>
        public ParameterResolverValue Add(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string totype = DetectBestNumericType(args.ToArray());

            if (totype == T_NULL)
            {
                return(new ParameterResolverValue(null));
            }
            ParameterResolverValue[] values      = args.ToArray(); //new ParameterResolverValue[args.Count];
            ParameterResolverValue[] _valsCasted = values.Select(v => CastAs(ctx, new List <ParameterResolverValue>()
            {
                new ParameterResolverValue(totype), new ParameterResolverValue(v.Value)
            })).ToArray();
            return(totype switch
            {
                T_INT => new ParameterResolverValue(_valsCasted.Sum(x => (int)x.Value), EValueDataType.Int),
                T_UINT => new ParameterResolverValue(_valsCasted.Sum(x => (uint)x.Value), EValueDataType.UInt),
                T_DBL => new ParameterResolverValue(_valsCasted.Sum(x => (double)x.Value), EValueDataType.Real),
                _ => new ParameterResolverValue(null),
            });
        public ParameterResolverValue IntegerContent(IParameterResolverContext ctx, ParameterResolverValue input)
        {
            long v = 0;

            if (input.Value != null)
            {
                if (long.TryParse(input.ToString(), out v))
                {
                    return(new ParameterResolverValue(v.ToString(), EResolverValueType.ContentType, (uint)EValueDataType.Text));
                }
                else
                {
                    throw new InvalidCastException("Cannot cast the input to integer!");
                }
            }
            else
            {
                // This result will cause excepton if not handled in some special manner.
                return(new ParameterResolverValue(null, EResolverValueType.ContentType, (uint)EValueDataType.Text));
            }
        }
        public ParameterResolverValue GetUserDetails(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            ResolverArguments <ParameterResolverValue> argsCasted = args as ResolverArguments <ParameterResolverValue>;
            string paramName  = argsCasted[0].Value as string;
            var    inputModel = ctx.ProcessingContext.InputModel;

            switch (paramName)
            {
            case "firstname":
            {
                return(new ParameterResolverValue(inputModel.SecurityModel.FirstName));
            }

            case "lastname":
            {
                return(new ParameterResolverValue(inputModel.SecurityModel.LastName));
            }

            default:
                break;
            }
            throw new Exception($"The requested parameter with {paramName} is not supported.");
        }
        /// <summary>
        /// Argument count: 2 (number|null, string)
        /// Return the value as textual representation suitable for insertion in SQL and other queries processed by
        /// plugins consuming the expression where this resolver is used.
        /// NumAsText(v)
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="args"></param>
        /// <returns>String representation of the number - the default generated by C# ToString.
        /// If the value is not one of a supported numeric type the resolver will use its second argument and if it is string that
        /// string marked for insertion will be returned. In all other cases the string "null" marked for insertion is returned.</returns>
        public ParameterResolverValue NumAsText(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            var x = args[0].Value;

            if (x == null)
            {
                return(new ParameterResolverValue("null", EResolverValueType.ContentType));
            }
            else if (x.GetType() == typeof(int) || x.GetType() == typeof(long) || x.GetType() == typeof(uint) || x.GetType() == typeof(Int16) ||
                     x.GetType() == typeof(Int32) || x.GetType() == typeof(Int64) || x.GetType() == typeof(UInt16) || x.GetType() == typeof(UInt32) || x.GetType() == typeof(UInt64) ||
                     x.GetType() == typeof(float) || x.GetType() == typeof(double))
            {
                return(new ParameterResolverValue(x.ToString(), EResolverValueType.ContentType));
            }
            else
            {
                if (!(args[1].Value is string y))
                {
                    y = "null";
                }
                return(new ParameterResolverValue(y, EResolverValueType.ContentType));
            }
        }
        public ParameterResolverValue CastAs(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string stype = args[0].Value as string;
            object v     = args[1].Value;

            if (v == null)
            {
                return(new ParameterResolverValue(null));
            }

            string sv = v.ToString();

            // If conversion is to string - just do it.
            if (stype == T_STR)
            {
                return(new ParameterResolverValue(sv, EValueDataType.Text));
            }
            if (string.IsNullOrWhiteSpace(sv))
            {
                return(new ParameterResolverValue(null));
            }
            // This has to be here to support legacy behavior
            Number_Formats fmt = DetectNumberFormat(sv, out string clean_string_value);

            if (fmt == Number_Formats.Unknown)
            {
                throw new Exception("Cannot detect the number format of the second argument");
            }
            if (stype != null)
            {
                switch (stype)
                {
                case T_INT:
                    int i_val;
                    if (fmt == Number_Formats.Decimal)
                    {
                        if (int.TryParse(clean_string_value, out i_val))
                        {
                            return(new ParameterResolverValue(i_val, EValueDataType.Int));
                        }
                        else
                        {
                            throw new ArgumentException("CastAs cannot convert the value to long integer");
                        }
                    }
                    else
                    {
                        return(new ParameterResolverValue(Convert.ToInt32(clean_string_value, (int)fmt), EValueDataType.Int));
                    }

                case T_UINT:
                    uint u_val;
                    if (fmt == Number_Formats.Decimal)
                    {
                        if (uint.TryParse(clean_string_value, out u_val))
                        {
                            return(new ParameterResolverValue(u_val, EValueDataType.UInt));
                        }
                        else
                        {
                            throw new ArgumentException("CastAs cannot convert the value to uint");
                        }
                    }
                    else
                    {
                        return(new ParameterResolverValue(Convert.ToUInt32(clean_string_value, (int)fmt), EValueDataType.UInt));
                    }

                case T_DBL:
                    double d_val;
                    if (double.TryParse(clean_string_value, out d_val))
                    {
                        return(new ParameterResolverValue(d_val, EValueDataType.Real));
                    }
                    else
                    {
                        throw new ArgumentException("CastAs cannot convert the value to double");
                    }

                default:
                    throw new ArgumentException("CastAs cannot understand the type specified: " + stype);
                }
            }
            else
            {
                throw new ArgumentException("The first argument to CastAs must be a string that specify the type to cast the second value to. Supported are: int, uint, double, string");
            }
        }
 public ParameterResolverValue NumParams(IParameterResolverContext ctx)
 {
     return(new ParameterResolverValue(0));
 }
        /// <summary>
        /// Converts a list/array to SQL content applicable in syntax like IN ( @here goes the list )
        /// Supports numeric list and string list
        /// Arguments:
        ///     - thelist -
        ///     - null or regexp
        ///         null - convert to numeric list
        ///         regex - convert to string list, test each item against the regexp.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="inargs"></param>
        /// <returns></returns>
        public ParameterResolverValue idlist(IParameterResolverContext ctx, IList <ParameterResolverValue> inargs)
        {
            ParameterResolverValue input          = inargs[0];
            ParameterResolverValue type_and_check = inargs[1];
            StringBuilder          sbresult       = new StringBuilder();

            if (!string.IsNullOrWhiteSpace(type_and_check.Value as string))   // RegExp
            {
                var         re     = type_and_check.Value as string;
                Regex       rex    = new Regex(re, RegexOptions.CultureInvariant | RegexOptions.Singleline);
                IEnumerable indata = null;
                if (input.Value is IDictionary)
                {
                    indata = (input.Value as IDictionary).Values;
                }
                else
                {
                    indata = input.Value as IEnumerable;
                }
                foreach (var v in indata)
                {
                    if (v != null)
                    {
                        if (rex.IsMatch(v.ToString()))
                        {
                            if (sbresult.Length > 0)
                            {
                                sbresult.Append(',');
                            }
                            sbresult.AppendFormat("'{0}'", v.ToString());
                        }
                        else
                        {
                            //don't stop execution when an item doesn't match?
                            //throw new Exception("an item does not match YOUR regular expression");
                        }
                    }
                    else
                    {
                        throw new Exception("null item in a collection while converting to replacable idlist");
                    }
                }
                return(new ParameterResolverValue(sbresult.ToString(), EResolverValueType.ContentType));
            }
            else if (type_and_check.Value == null && input.Value is IEnumerable)     // Numbers
            {
                IEnumerable indata = null;
                if (input.Value is IDictionary)
                {
                    indata = (input.Value as IDictionary).Values;
                }
                else
                {
                    indata = input.Value as IEnumerable;
                }
                foreach (var v in indata)
                {
                    if (sbresult.Length > 0)
                    {
                        sbresult.Append(',');
                    }
                    if (v is int || v is Int16 || v is Int32 || v is Int64)
                    {
                        sbresult.Append(Convert.ToInt64(v).ToString(CultureInfo.InvariantCulture));
                    }
                    else if (v is uint || v is UInt16 || v is UInt32 || v is UInt64)
                    {
                        sbresult.Append(Convert.ToUInt64(v).ToString(CultureInfo.InvariantCulture));
                    }
                    else if (v is float || v is double)
                    {
                        sbresult.Append(Convert.ToDouble(v).ToString(CultureInfo.InvariantCulture));
                    }
                    else
                    {
                        throw new Exception("Non-numeric and non-null item found in the input");
                    }
                }
                return(new ParameterResolverValue(sbresult.ToString(), EResolverValueType.ContentType));
            }
            else
            {
                throw new Exception("Unacceptable type parameter or the value is not enumerable");
            }
        }
Example #22
0
        public ParameterResolverValue GenerateHash(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            string hash = Guid.NewGuid().ToString();

            return(new ParameterResolverValue(hash));
        }
 public ParameterResolverValue Skip(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
 {
     return(new ParameterResolverValue(null, EResolverValueType.Skip));
 }
        public ParameterResolverValue GetUserEmail(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            InputModel inputModel = ctx.ProcessingContext.InputModel;

            return(new ParameterResolverValue(inputModel.SecurityModel?.UserEmail));
        }
        protected object StdGetParameterValue(string fromwhere, string paramName, IParameterResolverContext ctx)
        {
            object GetParameterValue(IDictionary <string, object> row)
            {
                if (row != null && row.ContainsKey(paramName))
                {
                    return(row[paramName]);
                }
                return(null);
            }

            if (!string.IsNullOrWhiteSpace(fromwhere))
            {
                var tokens = fromwhere.Split(new char[] { ',' }, 10, StringSplitOptions.None)
                             .Where(s => !string.IsNullOrWhiteSpace(s))
                             .Select(s => s.Trim());
                object val        = null;
                var    inputModel = ctx.ProcessingContext.InputModel;
                foreach (var token in tokens)
                {
                    if (val != null)
                    {
                        return(val);
                    }
                    switch (token)
                    {
                    case INPUT:
                    case CURRENT:
                        if (ctx.Action == ACTION_WRITE)
                        {
                            val = GetParameterValue(ctx.Row);
                        }
                        else
                        {
                            throw new InvalidOperationException("'current' (or 'input') source is available only for write (store) operation.");
                        }
                        break;

                    case FILTER:
                        if (ctx.Action != ACTION_READ)
                        {
                            throw new InvalidOperationException("'filter' source is available only for read (select) operation.");
                        }
                        val = GetParameterValue(inputModel.Data);
                        break;

                    case DATA:
                        val = GetParameterValue(inputModel.Data);
                        break;

                    case PARENT:
                        if (ctx.Datastack is ListStack <Dictionary <string, object> > && ctx.Datastack != null && ctx.Datastack.Count > 0)
                        {
                            val = GetParameterValue((ctx.Datastack as ListStack <Dictionary <string, object> >).Top());
                        }
                        break;

                    case PARENTS:
                        if (ctx.Datastack != null && ctx.Datastack.Count > 0)
                        {
                            for (int i = ctx.Datastack.Count - 1; i >= 0; i--)
                            {
                                val = GetParameterValue(ctx.Datastack[i]);
                                if (val != null)
                                {
                                    break;
                                }
                            }
                        }
                        break;

                    case CLIENT:
                        val = GetParameterValue(inputModel.Client);
                        break;

                    case SERVER:
                        val = GetParameterValue(inputModel.Server);
                        break;
                    }
                }
                return(val);
            }
            else
            {
                throw new ArgumentException("fromwhere argument is mandatory.");
            }
        }
        public ParameterResolverValue GetUserRoles(IParameterResolverContext ctx, IList <ParameterResolverValue> args)
        {
            InputModel inputModel = ctx.ProcessingContext.InputModel;

            return(new ParameterResolverValue(inputModel.SecurityModel.Roles, EValueDataType.Text));
        }