private static string GetIncludedProductFilter(string adKey, PromotionEntryCodeProvider promotionEntryCodeProvider)
        {
            if (promotionEntryCodeProvider == null)
            {
                return("");
            }

            var includedFilterText = string.Format("ad_key_included:'{0}'", adKey);
            var excludedFilterText = string.Format("NOT ad_key_excluded:'{0}'", adKey);
            var hasIncluded        = promotionEntryCodeProvider.AdKeyHasIncluded(adKey);
            var hasExcluded        = promotionEntryCodeProvider.AdKeyHasExcluded(adKey);

            if (hasIncluded && hasExcluded)
            {
                return(string.Format("{0} AND {1}", includedFilterText, excludedFilterText));
            }
            if (hasIncluded)
            {
                return(includedFilterText);
            }
            if (hasExcluded)
            {
                return(excludedFilterText);
            }
            return("");
        }
 public AdsIndexBuilder(
     IAppConfig appConfig, IFileSystem fileSystem, FileHelper fileHelper, PromotionDataTableMapper dataTableMapper,
     PromotionEntryCodeProvider promotionEntryCodeProvider, IIndexSystemMapper indexSystem,
     IEnumerable <IAdsAppender> appenderPlugins, IAdConverter converterPlugin = null)
 {
     _appConfig                  = appConfig;
     _fileSystem                 = fileSystem;
     _fileHelper                 = fileHelper;
     _dataTableMapper            = dataTableMapper;
     _promotionEntryCodeProvider = promotionEntryCodeProvider;
     _indexSystem                = indexSystem;
     _converterPlugin            = converterPlugin;
     _appenderPlugins            = appenderPlugins.ToArray();
 }
        internal IEnumerable <IEntity> ConvertToAds(PromotionDataTableMapper promotionDataTableMapper, PromotionEntryCodeProvider promotionEntryCodeProvider)
        {
            var promotionLanguageMappedColumns = ToMappedColumnInfos(promotionDataTableMapper.PromotionLanguageDataTable, promotionEntryCodeProvider).ToArray();
            var promotionMappedColumns         = ToMappedColumnInfos(promotionDataTableMapper.PromotionDataTable).ToArray();
            var campaignMappedColumns          = ToMappedColumnInfos(promotionDataTableMapper.CampaignDataTable).ToArray();

            foreach (var plpc in promotionDataTableMapper.Promotions)
            {
                var plpc1        = plpc;
                var plAttributes = promotionLanguageMappedColumns
                                   .Select(plmc => new Attribute(plmc.SpecificESalesName, plmc.GetValue(plpc1.PromotionLanguageRow)))
                                   .Where(a => !string.IsNullOrWhiteSpace(a.Values.FirstOrDefault()));
                var pAttributes = promotionMappedColumns
                                  .Select(pmc => new Attribute(pmc.SpecificESalesName, pmc.GetValue(plpc1.PromotionRow)))
                                  .Where(a => !string.IsNullOrWhiteSpace(a.Values.FirstOrDefault()));
                var cAttributes = campaignMappedColumns
                                  .Select(cmc => new Attribute(cmc.SpecificESalesName, cmc.GetValue(plpc1.CampaignRow)))
                                  .Where(a => !string.IsNullOrWhiteSpace(a.Values.FirstOrDefault()));

                //Unique attribute names. PromotionLanguage is most important, then Promotion and last Campaign.
                yield return(new Ad(
                                 cAttributes.Where(ca => !pAttributes.Select(pa => pa.Name).Contains(ca.Name)).Where(ca => !plAttributes.Select(pla => pla.Name).Contains(ca.Name))
                                 .Concat(pAttributes.Where(pa => !plAttributes.Select(pla => pla.Name).Contains(pa.Name)))
                                 .Concat(plAttributes)
                                 .Concat(StaticAttributes)));
            }
        }
        private static IEnumerable <MappedColumnInfo> ToMappedColumnInfos(PromotionDto.PromotionLanguageDataTable table, PromotionEntryCodeProvider promotionEntryCodeProvider = null)
        {
            var mappedColumns = new[]
            {
                new MappedColumnInfo("PromotionId", "ad_key", type.@string, r => AttributeHelper.CreateKey(r["PromotionId"].ToString(), r["LanguageCode"].ToString())),
                new MappedColumnInfo("PromotionId", "included", type.@string,
                                     r =>
                {
                    var language = r["LanguageCode"].ToString();
                    var includedProductFilter =
                        GetIncludedProductFilter(AttributeHelper.CreateKey(r["PromotionId"].ToString(), language),
                                                 promotionEntryCodeProvider);
                    var includedLocaleFilter = string.Format("locale_filter:'{0}'", language.ToESalesLocale());
                    return(!string.IsNullOrWhiteSpace(includedProductFilter)
                                                             ? string.Format("{0} AND {1}", includedLocaleFilter, includedProductFilter)
                                                             : includedLocaleFilter);
                },
                                     false),
                new MappedColumnInfo("DisplayName", "name", type.@string, new FilterOptions(Format.PipeSeparated, Tokenization.Words)),
                new MappedColumnInfo("LanguageCode", "locale", type.@string, r => r["LanguageCode"].ToString().ToESalesLocale(), false),
                new MappedColumnInfo("LanguageCode", "locale_filter", type.@string, r => r["LanguageCode"].ToString().ToESalesLocale())
            }.ToLookup(mc => mc.ColumnName, mc => mc);
            var ignoredColumnNames = new HashSet <string> {
                "PromotionLanguageId"
            };

            return(ToMappedColumnInfosInternal(table.Columns.Cast <DataColumn>(), mappedColumns, ignoredColumnNames));
        }