Exemple #1
0
        private object ConvertResult(IReadOnlyResult result, Expression expression, AmlQuery query)
        {
            if (query.ResultAggregator != null)
            {
                return(query.ResultAggregator(result));
            }

            var elementType = TypeHelper.GetElementType(expression.Type);
            var source      = default(IEnumerable);

            if (query.Projection != null)
            {
                var func = query.Projection.Compile();
                source = (IEnumerable)Activator.CreateInstance(typeof(Projector <>).MakeGenericType(elementType), result, func);
            }
            else if (elementType == typeof(IReadOnlyItem))
            {
                source = new Projector <IReadOnlyItem>(result, null);
            }
            else if (elementType == typeof(IItem))
            {
                source = new Projector <IItem>(result, null);
            }
            else
            {
                source = (IEnumerable)Activator.CreateInstance(typeof(Projector <>).MakeGenericType(elementType), result, null);
            }

            if (query.SetAggregator != null)
            {
                return(query.SetAggregator(source, elementType));
            }

            return(source);
        }
Exemple #2
0
 internal static IReadOnlyElement GetElement(IReadOnlyResult result)
 {
     if (result.Exception != null)
     {
         return(GetElement(result.Exception));
     }
     else
     {
         var aml = ElementFactory.Local;
         IReadOnlyElement res;
         if (result.Items().Any())
         {
             res = new LooseLinkElement(aml, "Result", result.Items().ToArray());
         }
         else
         {
             res = aml.Element("Result", result.Value);
         }
         var body = aml.Element("SOAP-ENV:Body", res);
         if (result.Message.Exists)
         {
             body.Add(result.Message);
         }
         var elem = aml.Element("SOAP-ENV:Envelope", aml.Attribute("xmlns:SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"), body);
         return(elem);
     }
 }
Exemple #3
0
 internal AmlReader(IReadOnlyResult result) : this(GetElement(result))
 {
 }
Exemple #4
0
        //public static int ColumnWidth(this DataColumn column)
        //{
        //  if (column.ExtendedProperties.ContainsKey("column_width"))
        //    return (int)column.ExtendedProperties["column_width"];
        //  return 100;
        //}
        //private static void ColumnWidth(this DataColumn column, int value)
        //{
        //  column.ExtendedProperties["column_width"] = value;
        //}
        //public static int SortOrder(this DataColumn column)
        //{
        //  if (column.ExtendedProperties.ContainsKey("sort_order"))
        //    return (int)column.ExtendedProperties["sort_order"];
        //  return 999999;
        //}
        //public static void SortOrder(this DataColumn column, int value)
        //{
        //  column.ExtendedProperties["sort_order"] = value;
        //}

        public static DataSet GetItemTable(IReadOnlyResult res, ArasMetadataProvider metadata, string select)
        {
            var    ds           = new DataSet();
            string mainType     = null;
            string mainId       = null;
            var    selectedCols = SelectNode.FromString(select);

            List <IReadOnlyItem> items;

            try
            {
                items = res.Items().ToList();
                if (items.Count == 1)
                {
                    mainType = items[0].Type().Value;
                    mainId   = items[0].Id();
                    items.AddRange(items[0].Relationships());
                }

                if (items.Count < 1)
                {
                    return(ds);
                }
            }
            catch (ServerException)
            {
                return(ds);
            }

            var    types = new TypeProperties();
            string type;
            bool   idAdded;
            bool   keyedNameAdded;

            foreach (var i in items)
            {
                type = (i.Type().Exists || i.Property("id").Type().Exists)
          ? i.Type().AsString(i.Property("id").Type().AsString(""))
          : string.Empty;

                if (!string.IsNullOrEmpty(type))
                {
                    types.Add(type, AmlTable_TypeName);
                }
                if (i.TypeId().Exists || i.Property("itemtype").Exists)
                {
                    types.Add(type, AmlTable_TypeId);
                }

                idAdded        = false;
                keyedNameAdded = false;
                foreach (var elem in i.Elements().OfType <IReadOnlyProperty>())
                {
                    if (elem.Name != "config_id")
                    {
                        if (elem.Type().Exists)
                        {
                            types.Add(type, elem.Name + "/type");
                        }
                        if (elem.KeyedName().Exists)
                        {
                            types.Add(type, elem.Name + "/keyed_name");
                        }
                    }
                    types.Add(type, elem.Name);
                    idAdded        = idAdded || elem.Name == "id";
                    keyedNameAdded = keyedNameAdded || elem.Name == "keyed_name";
                }
                if (!string.IsNullOrEmpty(i.Id()) && !idAdded)
                {
                    types.Add(type, "id");
                }
                if (i.Property("id").KeyedName().Exists&& !keyedNameAdded)
                {
                    types.Add(type, "keyed_name");
                }
            }


            ItemType   itemType;
            Property   pMeta;
            DataRow    row;
            string     propName;
            string     propAddendum;
            int        split;
            DataColumn newColumn;

            var typesEnum = types.Count > 1 && types.AllTypesTheSame()
        ? Enumerable.Repeat(new KeyValuePair <string, HashSet <string> >(string.Empty, types.First().Value), 1)
        : types;

            foreach (var kvp in typesEnum)
            {
                var result = new DataTable(kvp.Key);
                try
                {
                    result.BeginLoadData();

                    if (string.IsNullOrEmpty(kvp.Key) ||
                        metadata == null ||
                        !metadata.ItemTypeByName(kvp.Key, out itemType))
                    {
                        itemType = null;
                    }
                    else
                    {
                        result.RowChanging += (s, e) =>
                        {
                            if (e.Action == DataRowAction.Add)
                            {
                                var newId = Guid.NewGuid().ToString("N").ToUpperInvariant();
                                e.Row.Table.Columns["id"].DefaultValue = newId;
                            }
                        };
                    }

                    var allProps = new HashSet <string>(kvp.Value);
                    if (itemType != null)
                    {
                        allProps.UnionWith(metadata.GetProperties(itemType).Wait().Select(p => p.Name));
                    }

                    foreach (var prop in allProps)
                    {
                        if (prop != AmlTable_TypeName &&
                            prop != AmlTable_TypeId &&
                            itemType != null)
                        {
                            result.TableName = itemType.TabLabel ?? (itemType.Label ?? itemType.Name);

                            split        = prop.IndexOf('/');
                            propAddendum = string.Empty;
                            propName     = prop;
                            if (split > 0)
                            {
                                propName     = prop.Substring(0, split);
                                propAddendum = prop.Substring(split);
                            }

                            try
                            {
                                pMeta = metadata.GetProperty(itemType, propName).Wait();

                                if (string.IsNullOrEmpty(propAddendum))
                                {
                                    switch (pMeta.Type)
                                    {
                                    case PropertyType.boolean:
                                        newColumn = new DataColumn(prop, typeof(bool));
                                        if (pMeta.IsRequired && pMeta.DefaultValue == null)
                                        {
                                            newColumn.DefaultValue = false;
                                        }
                                        break;

                                    case PropertyType.date:
                                        newColumn = new DataColumn(prop, typeof(DateTime));
                                        break;

                                    case PropertyType.number:
                                        if (string.Equals(pMeta.TypeName, "integer", StringComparison.OrdinalIgnoreCase))
                                        {
                                            newColumn = new DataColumn(prop, typeof(int));
                                        }
                                        else
                                        {
                                            newColumn = new DataColumn(prop, typeof(double));
                                        }
                                        break;

                                    default:
                                        newColumn = new DataColumn(prop, typeof(string));
                                        if (pMeta.StoredLength > 0)
                                        {
                                            newColumn.MaxLength = pMeta.StoredLength;
                                        }
                                        break;
                                    }
                                }
                                else
                                {
                                    newColumn = new DataColumn(prop, typeof(string));
                                }
                                newColumn.Caption = (pMeta.Label ?? pMeta.Name) + propAddendum;
                                if (pMeta.DefaultValue != null)
                                {
                                    newColumn.DefaultValue = pMeta.DefaultValue;
                                }
                                if (kvp.Key != mainType && !string.IsNullOrEmpty(mainId) && pMeta.Name == "source_id")
                                {
                                    newColumn.DefaultValue = mainId;
                                }
                                newColumn.ReadOnly    = pMeta.ReadOnly && pMeta.Name != "related_id" && pMeta.Name != "source_id";
                                newColumn.AllowDBNull = selectedCols.Any() || !pMeta.IsRequired || !string.IsNullOrEmpty(propAddendum);
                                // Ignore constraints on the following columns
                                switch (pMeta.Name)
                                {
                                case "config_id":
                                case "created_by_id":
                                case "created_on":
                                case "permission_id":
                                    newColumn.AllowDBNull = true;
                                    break;
                                }
                                if (selectedCols.Any())
                                {
                                    newColumn.IsUiVisible(selectedCols.Any(c => string.Equals(c.Name, propName)));
                                }
                                else
                                {
                                    newColumn.IsUiVisible(!string.IsNullOrEmpty(mainType) && itemType.Name != mainType
                    ? (pMeta.Visibility & PropertyVisibility.RelationshipGrid) > 0
                    : (pMeta.Visibility & PropertyVisibility.MainGrid) > 0);
                                }
                                newColumn.PropMetadata(pMeta);
                            }
                            catch (KeyNotFoundException)
                            {
                                newColumn = new DataColumn(prop, typeof(string));
                                newColumn.IsUiVisible(string.IsNullOrEmpty(kvp.Key) || metadata == null);
                            }
                        }
                        else
                        {
                            newColumn = new DataColumn(prop, typeof(string));
                            newColumn.IsUiVisible(string.IsNullOrEmpty(kvp.Key) || metadata == null);
                            if (prop == AmlTable_TypeName && !string.IsNullOrEmpty(kvp.Key))
                            {
                                newColumn.DefaultValue = kvp.Key;
                            }
                        }
                        result.Columns.Add(newColumn);
                    }

                    foreach (var item in items
                             .Where(i => string.IsNullOrEmpty(kvp.Key) ||
                                    i.Type().AsString(i.Property("id").Type().Value) == kvp.Key))
                    {
                        row = result.NewRow();
                        row.BeginEdit();
                        foreach (var prop in kvp.Value)
                        {
                            switch (prop)
                            {
                            case "id":
                                row[prop] = item.Id();
                                break;

                            case "keyed_name":
                                row[prop] = item.KeyedName().AsString(item.Property("id").KeyedName().Value);
                                break;

                            case AmlTable_TypeName:
                                row[prop] = item.Type().AsString(item.Property("id").Type().Value);
                                break;

                            case AmlTable_TypeId:
                                row[prop] = item.TypeId().AsString(item.Property("itemtype").Value);
                                break;

                            default:
                                split = prop.IndexOf('/');
                                if (split > 0)
                                {
                                    row[prop] = item.Property(prop.Substring(0, split)).Attribute(prop.Substring(split + 1)).Value;
                                }
                                else if (item.Property(prop).HasValue())
                                {
                                    newColumn = result.Columns[prop];
                                    if (newColumn.DataType == typeof(bool))
                                    {
                                        row[prop] = item.Property(prop).AsBoolean(false);
                                    }
                                    else if (newColumn.DataType == typeof(DateTime))
                                    {
                                        row[prop] = item.Property(prop).AsDateTime(DateTime.MinValue);
                                    }
                                    else if (newColumn.DataType == typeof(int))
                                    {
                                        row[prop] = item.Property(prop).AsInt(int.MinValue);
                                    }
                                    else if (newColumn.DataType == typeof(double))
                                    {
                                        row[prop] = item.Property(prop).AsDouble(double.MinValue);
                                    }
                                    else
                                    {
                                        row[prop] = item.Property(prop).Value;
                                    }
                                }
                                else
                                {
                                    row[prop] = DBNull.Value;
                                }
                                break;
                            }
                        }
                        row.EndEdit();
                        row.AcceptChanges();
                        result.Rows.Add(row);
                    }


                    if (result.Rows.Count > 0 &&
                        result.Columns.OfType <DataColumn>().Where(c => c.ColumnName == "source_id" || c.ColumnName == "related_id").Count() == 2)
                    {
                        var firstRelated = result.Rows[0]["related_id"];
                        var firstSource  = result.Rows[0]["source_id"];
                        if (result.Rows.Count > 1 &&
                            result.AsEnumerable().All(r => r["related_id"] == firstRelated) &&
                            !result.AsEnumerable().All(r => r["source_id"] == firstSource))
                        {
                            result.Columns["source_id/keyed_name"].IsUiVisible(true);
                        }
                        else
                        {
                            result.Columns["related_id/keyed_name"].IsUiVisible(true);
                        }
                    }
                }
                finally
                {
                    try
                    {
                        result.EndLoadData();
                    }
                    catch (ConstraintException) { }
                    result.AcceptChanges();
                }

                ds.Tables.Add(result);
            }

            return(ds);
        }
Exemple #5
0
 /// <summary>
 /// Returns a navigator for executing XPath against the element
 /// </summary>
 public IAmlXPath XPath(IReadOnlyResult elem)
 {
     return(new AmlNavigator(elem));
 }
Exemple #6
0
 internal Item(IConnection conn, IReadOnlyResult result)
 {
     _conn = conn;
     loadAML(result);
 }
Exemple #7
0
 public Projector(IReadOnlyResult result, Delegate projection)
 {
     _result     = result;
     _projection = projection;
 }
Exemple #8
0
 public Projector(IReadOnlyResult result, Func <IReadOnlyItem, T> projection)
 {
     _result     = result;
     _projection = projection;
 }
Exemple #9
0
 private void loadAML(IReadOnlyResult result)
 {
     _content = (object)result.Exception ?? (object)result.Value ?? result.Items().ToList();
 }
Exemple #10
0
 public PluginResult(IReadOnlyResult result)
 {
     Count         = result.Items().Count();
     _createReader = result.CreateReader;
 }
Exemple #11
0
 internal AmlNavigator(IReadOnlyResult result) : this(AmlReader.GetElement(result))
 {
 }