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); } } }
public AbstractItem() { Children = new HashSet <IAbstractItem>(); M2mRelations = new M2mRelations(); M2mFieldNames = new List <string>(); }
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); }