Esempio n. 1
0
        public IDictionary <int, M2mRelations> GetManyToManyData(IEnumerable <int> ids, bool isStage, IDbTransaction transaction = null)
        {
            var m2MTableName = QpTableNameHelper.GetM2MTableName(isStage);
            var idListTable  = SqlQuerySyntaxHelper.IdList(UnitOfWork.DatabaseType, "@ids", "ids");
            var withNoLock   = SqlQuerySyntaxHelper.WithNoLock(UnitOfWork.DatabaseType);

            var query = $@"
                SELECT link_id, item_id, linked_item_id
                FROM {m2MTableName} link {withNoLock}
                INNER JOIN {idListTable} on Id = link.item_id";

            using (var command = UnitOfWork.Connection.CreateCommand())
            {
                command.CommandText = query;
                command.Parameters.Add(SqlQuerySyntaxHelper.GetIdsDatatableParam("@Ids", ids, UnitOfWork.DatabaseType));
                command.Transaction = transaction;
                var result = new Dictionary <int, M2mRelations>();

                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var itemId = Convert.ToInt32(reader.GetDecimal(reader.GetOrdinal("item_id")));
                        if (!result.ContainsKey(itemId))
                        {
                            result[itemId] = new M2mRelations();
                        }

                        result[itemId]
                        .AddRelation(Convert.ToInt32(reader.GetDecimal(reader.GetOrdinal("link_id"))),
                                     Convert.ToInt32(reader.GetDecimal(reader.GetOrdinal("linked_item_id"))));
                    }

                    return(result);
                }
            }
        }
Esempio n. 2
0
 public AbstractItem()
 {
     Children      = new HashSet <IAbstractItem>();
     M2mRelations  = new M2mRelations();
     M2mFieldNames = new List <string>();
 }
Esempio n. 3
0
        public void ManyToManyFieldsIsCorrect()
        {
            var extensionId         = 777;
            var widgetRelationField = new ContentAttributePersistentData
            {
                ContentId  = extensionId,
                ColumnName = "SomeRelations",
                M2mLinkId  = 7645,
                TypeName   = "Relation"
            };

            var baseContentRelationField = new ContentAttributePersistentData
            {
                ContentId  = abstractItemContentId,
                ColumnName = "BaseContentRelations",
                M2mLinkId  = 435,
                TypeName   = "Relation"
            };

            var metaInfoMoq = new Mock <IMetaInfoRepository>();

            metaInfoMoq.Setup(x => x.GetContent(abstractItemNetName, siteId, null)).Returns(new ContentPersistentData
            {
                ContentId         = abstractItemContentId,
                ContentAttributes = new List <ContentAttributePersistentData> {
                    baseContentRelationField
                }
            });
            metaInfoMoq.Setup(x => x.GetContentsById(It.Is <int[]>(ids => ids.Contains(extensionId)), siteId, null)).Returns(new ContentPersistentData[1]
            {
                new ContentPersistentData
                {
                    ContentId         = extensionId,
                    ContentAttributes = new List <ContentAttributePersistentData> {
                        widgetRelationField
                    }
                }
            });

            var aiRepositoryMoq = new Mock <IAbstractItemRepository>();

            var widgetExtId = 987348;
            var widgetId    = 3;

            //корневая, стартовая страница и виджет с m2m (виджет просто для примера, m2m может быть и у страницы)
            var aiArray = new[] {
                new AbstractItemPersistentData {
                    Id = 1, Title = "корневая страница", Alias = "root", Discriminator = typeof(RootPage).Name, IsPage = true, ParentId = null, ExtensionId = null
                },
                new AbstractItemPersistentData {
                    Id = 2, Title = "стартовая страница", Alias = "start", Discriminator = typeof(StubStartPage).Name, IsPage = true, ParentId = 1, ExtensionId = null
                },
                new AbstractItemPersistentData {
                    Id = widgetId, Title = "виджет m2m", Alias = "m2m", Discriminator = typeof(ManyToManyWidget).Name, IsPage = false, ParentId = 2, ExtensionId = extensionId
                }
            };

            aiRepositoryMoq.Setup(x => x.GetPlainAllAbstractItems(siteId, isStage, null)).Returns(aiArray);

            //extension-поля виджета:
            //поле SomeRelations - это поле m2m(значением будет является некий relationid),
            //CONTENT_ITEM_ID - это id самого виджета
            //extension-поле из базового контента: поле BaseContentRelations - тоже m2m
            var widgetExt = new AbstractItemExtensionCollection();

            widgetExt.Add("CONTENT_ITEM_ID", widgetExtId);
            widgetExt.Add(widgetRelationField.ColumnName, widgetRelationField.M2mLinkId);
            widgetExt.Add(baseContentRelationField.ColumnName, baseContentRelationField.M2mLinkId);
            var widgetExtDictionary = new Dictionary <int, AbstractItemExtensionCollection>
            {
                { widgetId, widgetExt }
            };

            aiRepositoryMoq.Setup(x => x.GetAbstractItemExtensionData(extensionId,
                                                                      It.Is <IEnumerable <int> >(ids => ids.Count() == 1 && ids.Contains(3)),
                                                                      It.IsAny <ContentPersistentData>(),
                                                                      buildSettings.LoadAbstractItemFieldsToDetailsCollection,
                                                                      buildSettings.IsStage,
                                                                      null)).Returns(widgetExtDictionary);

            //по relationid и id виджета в qp можно получить полный список id, участвующих в связи m2m с этим виджетом
            //замокаем методы получения такой информации для 2х relation: один из контента с extension, один в базовом контенте. нужно проверить оба варианта
            var widgetRelation = new M2mRelations();
            var relationValues = new[] { 435, 46, 56 };

            foreach (var relValue in relationValues)
            {
                widgetRelation.AddRelation(widgetRelationField.M2mLinkId.Value, relValue);
            }
            aiRepositoryMoq.Setup(x => x.GetManyToManyData(It.Is <IEnumerable <int> >(ids => ids.Count() == 1 && ids.Contains(widgetExtId)), isStage, null)).Returns(new Dictionary <int, M2mRelations>
            {
                { widgetExtId, widgetRelation }
            });

            var baseContentRelation       = new M2mRelations();
            var baseContentRelationValues = new[] { 576, 7568 };

            foreach (var relValue in baseContentRelationValues)
            {
                baseContentRelation.AddRelation(baseContentRelationField.M2mLinkId.Value, relValue);
            }
            aiRepositoryMoq.Setup(x => x.GetManyToManyData(It.Is <IEnumerable <int> >(ids => ids.Contains(widgetId)), isStage, null)).Returns(new Dictionary <int, M2mRelations>
            {
                { widgetId, baseContentRelation }
            });

            //фабрика элементов структуры сайта
            var aiFactoryMoq = new Mock <IAbstractItemFactory>();

            aiFactoryMoq.Setup(x => x.Create(It.IsAny <string>())).Returns((string d) =>
            {
                if (d == typeof(RootPage).Name)
                {
                    return(new RootPage());
                }
                if (d == typeof(StubStartPage).Name)
                {
                    return(new StubStartPage());
                }
                if (d == typeof(ManyToManyWidget).Name)
                {
                    return(new ManyToManyWidget());
                }
                return(null);
            });

            var builder = new QpAbstractItemStorageBuilder(aiFactoryMoq.Object,
                                                           Mock.Of <IQpUrlResolver>(),
                                                           aiRepositoryMoq.Object,
                                                           metaInfoMoq.Object,
                                                           buildSettings,
                                                           Mock.Of <ILogger <QpAbstractItemStorageBuilder> >());

            var aiStorage = builder.Build();

            var widget = aiStorage.Get(widgetId) as ManyToManyWidget;

            Assert.NotNull(widget);

            //проверим, что в поле m2m подставились все id из relation, который был в контенте-расширения
            Assert.Equal(relationValues, widget.RelationIds);
            //проверим, что в поле m2m подставились все id из relation, который был в базовом контенте
            Assert.Equal(baseContentRelationValues, widget.BaseContentRelationIds);
        }