/// <summary>
        /// Fixed:
        /// </summary>
        private static Dictionary <string, ControlData> SelectableMembers()
        {
            var data       = new Dictionary <string, ControlData>();
            var searchText = Forms.Data("SearchMemberText");

            if (!searchText.IsNullOrEmpty())
            {
                var currentMembers = Forms.List("CurrentMembersAll");
                Rds.ExecuteTable(statements: new SqlStatement[]
                {
                    Rds.SelectDepts(
                        column: Rds.DeptsColumn()
                        .DeptId()
                        .DeptCode()
                        .Add("0 as [UserId]")
                        .Add("'' as [UserCode]")
                        .Add("0 as [IsUser]"),
                        where : Rds.DeptsWhere()
                        .TenantId(Sessions.TenantId())
                        .DeptId_In(
                            currentMembers?
                            .Where(o => o.StartsWith("Dept,"))
                            .Select(o => o.Split_2nd().ToInt()),
                            negative: true)
                        .SqlWhereLike(
                            name: "SearchText",
                            searchText: searchText,
                            clauseCollection: new List <string>()
                    {
                        Rds.Depts_DeptCode_WhereLike(),
                        Rds.Depts_DeptName_WhereLike()
                    })),
                    Rds.SelectUsers(
                        unionType: Sqls.UnionTypes.Union,
                        column: Rds.UsersColumn()
                        .Add("0 as [DeptId]")
                        .Add("'' as [DeptCode]")
                        .UserId()
                        .UserCode()
                        .Add("1 as [IsUser]"),
                        join: Rds.UsersJoin()
                        .Add(new SqlJoin(
                                 tableBracket: "[Depts]",
                                 joinType: SqlJoin.JoinTypes.LeftOuter,
                                 joinExpression: "[Users].[DeptId]=[Depts].[DeptId]")),
                        where : Rds.UsersWhere()
                        .TenantId(Sessions.TenantId())
                        .UserId_In(
                            currentMembers?
                            .Where(o => o.StartsWith("User,"))
                            .Select(o => o.Split_2nd().ToInt()),
                            negative: true)
                        .SqlWhereLike(
                            name: "SearchText",
                            searchText: searchText,
                            clauseCollection: new List <string>()
                    {
                        Rds.Users_LoginId_WhereLike(),
                        Rds.Users_Name_WhereLike(),
                        Rds.Users_UserCode_WhereLike(),
                        Rds.Users_Body_WhereLike(),
                        Rds.Depts_DeptCode_WhereLike(),
                        Rds.Depts_DeptName_WhereLike(),
                        Rds.Depts_Body_WhereLike()
                    })
                        .Users_Disabled(0))
                })
                .AsEnumerable()
                .OrderBy(o => o["IsUser"])
                .ThenBy(o => o["DeptCode"])
                .ThenBy(o => o["DeptId"])
                .ThenBy(o => o["UserCode"])
                .ForEach(dataRow =>
                         data.AddMember(dataRow));
            }
            return(data);
        }
Example #2
0
        public System.Text.StringBuilder Csv(
            Context context,
            SiteSettings ss,
            System.Text.StringBuilder csv,
            IEnumerable <ExportColumn> exportColumns)
        {
            var idColumn = Rds.IdColumn(ss.ReferenceType);

            DataRows.ForEach(dataRow =>
            {
                var dataId        = dataRow.Long(idColumn).ToString();
                var data          = new List <string>();
                var tenants       = new Dictionary <string, TenantModel>();
                var depts         = new Dictionary <string, DeptModel>();
                var groups        = new Dictionary <string, GroupModel>();
                var registrations = new Dictionary <string, RegistrationModel>();
                var users         = new Dictionary <string, UserModel>();
                var sites         = new Dictionary <string, SiteModel>();
                var issues        = new Dictionary <string, IssueModel>();
                var results       = new Dictionary <string, ResultModel>();
                var wikis         = new Dictionary <string, WikiModel>();
                exportColumns.ForEach(exportColumn =>
                {
                    var column = exportColumn.Column;
                    var key    = column.TableName();
                    switch (column.SiteSettings?.ReferenceType)
                    {
                    case "Users":
                        if (!users.ContainsKey(key))
                        {
                            users.Add(key, new UserModel(
                                          context: context,
                                          ss: column.SiteSettings,
                                          dataRow: dataRow,
                                          tableAlias: column.TableAlias));
                        }
                        data.Add(users.Get(key).CsvData(
                                     context: context,
                                     ss: column.SiteSettings,
                                     column: column,
                                     exportColumn: exportColumn,
                                     mine: users.Get(key).Mine(context: context)));
                        break;

                    case "Issues":
                        if (!issues.ContainsKey(key))
                        {
                            issues.Add(key, new IssueModel(
                                           context: context,
                                           ss: column.SiteSettings,
                                           dataRow: dataRow,
                                           tableAlias: column.TableAlias));
                        }
                        data.Add(issues.Get(key).CsvData(
                                     context: context,
                                     ss: column.SiteSettings,
                                     column: column,
                                     exportColumn: exportColumn,
                                     mine: issues.Get(key).Mine(context: context)));
                        break;

                    case "Results":
                        if (!results.ContainsKey(key))
                        {
                            results.Add(key, new ResultModel(
                                            context: context,
                                            ss: column.SiteSettings,
                                            dataRow: dataRow,
                                            tableAlias: column.TableAlias));
                        }
                        data.Add(results.Get(key).CsvData(
                                     context: context,
                                     ss: column.SiteSettings,
                                     column: column,
                                     exportColumn: exportColumn,
                                     mine: results.Get(key).Mine(context: context)));
                        break;
                    }
                });
                csv.Append(data.Join(","), "\n");
            });
            return(csv);
        }
Example #3
0
        public void TBody(
            HtmlBuilder hb,
            Context context,
            SiteSettings ss,
            IEnumerable <Column> columns,
            bool checkAll)
        {
            var idColumn = Rds.IdColumn(ss.ReferenceType);

            DataRows.ForEach(dataRow =>
            {
                var dataId = dataRow.Long(idColumn).ToString();
                hb.Tr(
                    attributes: new HtmlAttributes()
                    .Class("grid-row")
                    .DataId(dataId),
                    action: () =>
                {
                    hb.Td(action: () => hb
                          .CheckBox(
                              controlCss: "grid-check",
                              _checked: checkAll,
                              dataId: dataId));
                    var depts   = new Dictionary <string, DeptModel>();
                    var groups  = new Dictionary <string, GroupModel>();
                    var users   = new Dictionary <string, UserModel>();
                    var sites   = new Dictionary <string, SiteModel>();
                    var issues  = new Dictionary <string, IssueModel>();
                    var results = new Dictionary <string, ResultModel>();
                    var wikis   = new Dictionary <string, WikiModel>();
                    columns.ForEach(column =>
                    {
                        var key = column.TableName();
                        switch (column.SiteSettings?.ReferenceType)
                        {
                        case "Depts":
                            if (!depts.ContainsKey(key))
                            {
                                depts.Add(key, new DeptModel(
                                              context: context,
                                              ss: column.SiteSettings,
                                              dataRow: dataRow,
                                              tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                deptModel: depts.Get(key));
                            break;

                        case "Groups":
                            if (!groups.ContainsKey(key))
                            {
                                groups.Add(key, new GroupModel(
                                               context: context,
                                               ss: column.SiteSettings,
                                               dataRow: dataRow,
                                               tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                groupModel: groups.Get(key));
                            break;

                        case "Users":
                            if (!users.ContainsKey(key))
                            {
                                users.Add(key, new UserModel(
                                              context: context,
                                              ss: column.SiteSettings,
                                              dataRow: dataRow,
                                              tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                userModel: users.Get(key));
                            break;

                        case "Sites":
                            if (!sites.ContainsKey(key))
                            {
                                sites.Add(key, new SiteModel(
                                              context: context,
                                              dataRow: dataRow,
                                              tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                siteModel: sites.Get(key));
                            break;

                        case "Issues":
                            if (!issues.ContainsKey(key))
                            {
                                issues.Add(key, new IssueModel(
                                               context: context,
                                               ss: column.SiteSettings,
                                               dataRow: dataRow,
                                               tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                issueModel: issues.Get(key));
                            break;

                        case "Results":
                            if (!results.ContainsKey(key))
                            {
                                results.Add(key, new ResultModel(
                                                context: context,
                                                ss: column.SiteSettings,
                                                dataRow: dataRow,
                                                tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                resultModel: results.Get(key));
                            break;

                        case "Wikis":
                            if (!wikis.ContainsKey(key))
                            {
                                wikis.Add(key, new WikiModel(
                                              context: context,
                                              ss: column.SiteSettings,
                                              dataRow: dataRow,
                                              tableAlias: column.TableAlias));
                            }
                            hb.TdValue(
                                context: context,
                                ss: column.SiteSettings,
                                column: column,
                                wikiModel: wikis.Get(key));
                            break;
                        }
                    });
                });
            });
        }
        private static DataSet ResultContents(EnumerableRowCollection <DataRow> dataRows)
        {
            var statements = new List <SqlStatement>();

            if (dataRows.Any(o => o["ReferenceType"].ToString() == "Sites"))
            {
                statements.Add(Rds.SelectSites(
                                   dataTableName: "Sites",
                                   column: Rds.SitesColumn()
                                   .ParentId(_as: "SiteId")
                                   .SiteId(_as: "Id")
                                   .Title()
                                   .Body(),
                                   where : Rds.SitesWhere()
                                   .TenantId(Sessions.TenantId())
                                   .SiteId_In(dataRows
                                              .Where(o => o["ReferenceType"].ToString() == "Sites")
                                              .Select(o => o["ReferenceId"].ToLong()))));
            }
            if (dataRows.Any(o => o["ReferenceType"].ToString() == "Issues"))
            {
                statements.Add(Rds.SelectIssues(
                                   dataTableName: "Issues",
                                   column: Rds.IssuesColumn()
                                   .SiteId()
                                   .IssueId(_as: "Id")
                                   .Title()
                                   .Body(),
                                   where : Rds.IssuesWhere()
                                   .IssueId_In(dataRows
                                               .Where(o => o["ReferenceType"].ToString() == "Issues")
                                               .Select(o => o["ReferenceId"].ToLong()))));
            }
            if (dataRows.Any(o => o["ReferenceType"].ToString() == "Results"))
            {
                statements.Add(Rds.SelectResults(
                                   dataTableName: "Results",
                                   column: Rds.ResultsColumn()
                                   .SiteId()
                                   .ResultId(_as: "Id")
                                   .Title()
                                   .Body(),
                                   where : Rds.ResultsWhere()
                                   .ResultId_In(dataRows
                                                .Where(o => o["ReferenceType"].ToString() == "Results")
                                                .Select(o => o["ReferenceId"].ToLong()))));
            }
            if (dataRows.Any(o => o["ReferenceType"].ToString() == "Wikis"))
            {
                statements.Add(Rds.SelectWikis(
                                   dataTableName: "Wikis",
                                   column: Rds.WikisColumn()
                                   .SiteId()
                                   .WikiId(_as: "Id")
                                   .Title()
                                   .Body(),
                                   where : Rds.WikisWhere()
                                   .WikiId_In(dataRows
                                              .Where(o => o["ReferenceType"].ToString() == "Wikis")
                                              .Select(o => o["ReferenceId"].ToLong()))));
            }
            return(Rds.ExecuteDataSet(statements: statements.ToArray()));
        }
Example #5
0
        public ErrorData Update(
            Context context,
            SiteSettings ss,
            IEnumerable <string> permissions         = null,
            bool permissionChanged                   = false,
            SqlParamCollection param                 = null,
            List <SqlStatement> additionalStatements = null,
            bool otherInitValue = false,
            bool setBySession   = true,
            bool get            = true)
        {
            if (setBySession)
            {
                SetBySession(context: context);
            }
            var statements = new List <SqlStatement>();

            statements.AddRange(UpdateStatements(
                                    context: context,
                                    ss: ss,
                                    permissions: permissions,
                                    permissionChanged: permissionChanged,
                                    param: param,
                                    otherInitValue: otherInitValue,
                                    additionalStatements: additionalStatements));
            var response = Rds.ExecuteScalar_response(
                context: context,
                transactional: true,
                statements: statements.ToArray());

            if (response.Event == "Conflicted")
            {
                return(new ErrorData(
                           type: Error.Types.UpdateConflicts,
                           id: GroupId));
            }
            if (get)
            {
                Get(context: context, ss: ss);
            }
            statements = new List <SqlStatement>
            {
                Rds.PhysicalDeleteGroupMembers(
                    where : Rds.GroupMembersWhere()
                    .GroupId(GroupId))
            };
            context.Forms.List("CurrentMembersAll").ForEach(data =>
            {
                if (data.StartsWith("Dept,"))
                {
                    statements.Add(Rds.InsertGroupMembers(
                                       param: Rds.GroupMembersParam()
                                       .GroupId(GroupId)
                                       .DeptId(data.Split_2nd().ToInt())
                                       .Admin(data.Split_3rd().ToBool())));
                }
                if (data.StartsWith("User,"))
                {
                    statements.Add(Rds.InsertGroupMembers(
                                       param: Rds.GroupMembersParam()
                                       .GroupId(GroupId)
                                       .UserId(data.Split_2nd().ToInt())
                                       .Admin(data.Split_3rd().ToBool())));
                }
            });
            Rds.ExecuteNonQuery(
                context: context,
                transactional: true,
                statements: statements.ToArray());
            return(new ErrorData(type: Error.Types.None));
        }
Example #6
0
        private static DataSet DataSet(Context context, SiteSettings ss, long id)
        {
            var statements = new List <SqlStatement>();

            ss.Sources
            .Where(currentSs => currentSs.ReferenceType == "Issues")
            .ForEach(currentSs =>
                     statements.Add(SelectIssues(
                                        context: context,
                                        ss: currentSs,
                                        view: Views.GetBySession(
                                            context: context,
                                            ss: currentSs,
                                            dataTableName: DataTableName(
                                                ss: currentSs,
                                                direction: "Source")),
                                        id: id,
                                        direction: "Source")));
            ss.Destinations
            .Where(currentSs => currentSs.ReferenceType == "Issues")
            .ForEach(currentSs =>
                     statements.Add(SelectIssues(
                                        context: context,
                                        ss: currentSs,
                                        view: Views.GetBySession(
                                            context: context,
                                            ss: currentSs,
                                            dataTableName: DataTableName(
                                                ss: currentSs,
                                                direction: "Destination")),
                                        id: id,
                                        direction: "Destination")));
            ss.Sources
            .Where(currentSs => currentSs.ReferenceType == "Results")
            .ForEach(currentSs =>
                     statements.Add(SelectResults(
                                        context: context,
                                        ss: currentSs,
                                        view: Views.GetBySession(
                                            context: context,
                                            ss: currentSs,
                                            dataTableName: DataTableName(
                                                ss: currentSs,
                                                direction: "Source")),
                                        id: id,
                                        direction: "Source")));
            ss.Destinations
            .Where(currentSs => currentSs.ReferenceType == "Results")
            .ForEach(currentSs =>
                     statements.Add(SelectResults(
                                        context: context,
                                        ss: currentSs,
                                        view: Views.GetBySession(
                                            context: context,
                                            ss: currentSs,
                                            dataTableName: DataTableName(
                                                ss: currentSs,
                                                direction: "Destination")),
                                        id: id,
                                        direction: "Destination")));
            return(statements.Any()
                ? Rds.ExecuteDataSet(
                       context: context,
                       statements: statements.ToArray())
                : null);
        }
Example #7
0
        /// <summary>
        /// Fixed:
        /// </summary>
        public static string Editor(Context context, string reference, long id)
        {
            var ss = SiteSettingsUtilities.GetByReference(
                context: context,
                reference: reference,
                referenceId: id);

            if (context.ContractSettings.Mail == false)
            {
                return(Error.Types.Restricted.MessageJson(context: context));
            }
            if (MailAddressUtilities.Get(
                    context: context,
                    userId: context.UserId) == string.Empty)
            {
                return(new ResponseCollection()
                       .CloseDialog()
                       .Message(Messages.MailAddressHasNotSet(context: context))
                       .ToJson());
            }
            var invalid = OutgoingMailValidators.OnEditing(
                context: context,
                ss: ss);

            switch (invalid)
            {
            case Error.Types.None: break;

            default: return(invalid.MessageJson(context: context));
            }
            var outgoingMailModel = new OutgoingMailModel().Get(
                context: context,
                where : Rds.OutgoingMailsWhere().OutgoingMailId(
                    context.Forms.Long("OutgoingMails_OutgoingMailId")));
            var hb = new HtmlBuilder();

            return(new ResponseCollection()
                   .Html("#OutgoingMailDialog", hb
                         .Div(id: "MailEditorTabsContainer", action: () => hb
                              .Ul(id: "MailEditorTabs", action: () => hb
                                  .Li(action: () => hb
                                      .A(
                                          href: "#FieldSetMailEditor",
                                          text: Displays.Mail(context: context)))
                                  .Li(action: () => hb
                                      .A(
                                          href: "#FieldSetAddressBook",
                                          text: Displays.AddressBook(context: context))))
                              .FieldSet(id: "FieldSetMailEditor", action: () => hb
                                        .Form(
                                            attributes: new HtmlAttributes()
                                            .Id("OutgoingMailForm")
                                            .Action(Locations.Action(
                                                        context: context,
                                                        table: reference,
                                                        id: id,
                                                        controller: "OutgoingMails")),
                                            action: () => hb
                                            .Editor(
                                                context: context,
                                                ss: ss,
                                                outgoingMailModel: outgoingMailModel)))
                              .FieldSet(id: "FieldSetAddressBook", action: () => hb
                                        .Form(
                                            attributes: new HtmlAttributes()
                                            .Id("OutgoingMailDestinationForm")
                                            .Action(Locations.Action(
                                                        context: context,
                                                        table: reference,
                                                        id: id,
                                                        controller: "OutgoingMails")),
                                            action: () => hb
                                            .Destinations(context: context, ss: ss)))))
                   .Invoke("initOutgoingMailDialog")
                   .Focus("#OutgoingMails_Body")
                   .ToJson());
        }
Example #8
0
        /// <summary>
        /// Fixed:
        /// </summary>
        public static SqlSelect Select(
            Context context,
            SiteSettings ss,
            string searchText,
            IEnumerable <long> siteIdList)
        {
            if (ss != null && ss.TableType != Sqls.TableTypes.Normal)
            {
                return(Select(
                           ss: ss,
                           searchText: searchText,
                           siteIdList: siteIdList,
                           like: Rds.Items_FullText_WhereLike(
                               factory: context,
                               forward: false)));
            }
            switch (ss?.SearchType)
            {
            case SiteSettings.SearchTypes.FullText:
                var words = context.SqlCommandText.CreateSearchTextWords(
                    words: Words(searchText.SearchIndexes().Join(" ")),
                    searchText: searchText.SearchIndexes().Join(" "));
                if (words?.Any() != true)
                {
                    return(null);
                }
                return(SelectByFullText(
                           context: context,
                           column: Rds.ItemsColumn().ReferenceId(),
                           orderBy: null,
                           siteIdList: siteIdList,
                           words: words));

            case SiteSettings.SearchTypes.MatchInFrontOfTitle:
                return(Select(
                           ss: ss,
                           searchText: searchText,
                           siteIdList: siteIdList,
                           like: Rds.Items_Title_WhereLike(
                               factory: context,
                               forward: true)));

            case SiteSettings.SearchTypes.BroadMatchOfTitle:
                return(Select(
                           ss: ss,
                           searchText: searchText,
                           siteIdList: siteIdList,
                           like: Rds.Items_Title_WhereLike(
                               factory: context,
                               forward: false)));

            case SiteSettings.SearchTypes.PartialMatch:
            default:
                return(Select(
                           ss: ss,
                           searchText: searchText.SearchIndexes().Join(" "),
                           siteIdList: siteIdList,
                           like: Rds.Items_FullText_WhereLike(
                               factory: context,
                               forward: false)));
            }
        }
Example #9
0
        private static DataSet ResultContents(
            Context context, EnumerableRowCollection <DataRow> dataRows)
        {
            var statements = new List <SqlStatement>();

            if (dataRows.Any(o => o.String("ReferenceType") == "Sites"))
            {
                statements.Add(Rds.SelectSites(
                                   dataTableName: "Sites",
                                   column: Rds.SitesColumn()
                                   .ParentId(_as: "SiteId")
                                   .SiteId(_as: "Id")
                                   .Body()
                                   .Items_Title(),
                                   join: new SqlJoinCollection(
                                       new SqlJoin(
                                           tableBracket: "\"Items\"",
                                           joinType: SqlJoin.JoinTypes.Inner,
                                           joinExpression: "\"Items\".\"ReferenceId\"=\"Sites\".\"SiteId\"")),
                                   where : Rds.SitesWhere()
                                   .TenantId(context.TenantId)
                                   .SiteId_In(dataRows
                                              .Where(o => o.String("ReferenceType") == "Sites")
                                              .Select(o => o.Long("ReferenceId")))));
            }
            if (dataRows.Any(o => o.String("ReferenceType") == "Issues"))
            {
                statements.Add(Rds.SelectIssues(
                                   dataTableName: "Issues",
                                   column: Rds.IssuesColumn()
                                   .SiteId()
                                   .IssueId(_as: "Id")
                                   .Body()
                                   .Items_Title(),
                                   join: new SqlJoinCollection(
                                       new SqlJoin(
                                           tableBracket: "\"Items\"",
                                           joinType: SqlJoin.JoinTypes.Inner,
                                           joinExpression: "\"Items\".\"ReferenceId\"=\"Issues\".\"IssueId\"")),
                                   where : Rds.IssuesWhere()
                                   .IssueId_In(dataRows
                                               .Where(o => o.String("ReferenceType") == "Issues")
                                               .Select(o => o.Long("ReferenceId")))));
            }
            if (dataRows.Any(o => o.String("ReferenceType") == "Results"))
            {
                statements.Add(Rds.SelectResults(
                                   dataTableName: "Results",
                                   column: Rds.ResultsColumn()
                                   .SiteId()
                                   .ResultId(_as: "Id")
                                   .Body()
                                   .Items_Title(),
                                   join: new SqlJoinCollection(
                                       new SqlJoin(
                                           tableBracket: "\"Items\"",
                                           joinType: SqlJoin.JoinTypes.Inner,
                                           joinExpression: "\"Items\".\"ReferenceId\"=\"Results\".\"ResultId\"")),
                                   where : Rds.ResultsWhere()
                                   .ResultId_In(dataRows
                                                .Where(o => o.String("ReferenceType") == "Results")
                                                .Select(o => o.Long("ReferenceId")))));
            }
            if (dataRows.Any(o => o.String("ReferenceType") == "Wikis"))
            {
                statements.Add(Rds.SelectWikis(
                                   dataTableName: "Wikis",
                                   column: Rds.WikisColumn()
                                   .SiteId()
                                   .WikiId(_as: "Id")
                                   .Body()
                                   .Items_Title(),
                                   join: new SqlJoinCollection(
                                       new SqlJoin(
                                           tableBracket: "\"Items\"",
                                           joinType: SqlJoin.JoinTypes.Inner,
                                           joinExpression: "\"Items\".\"ReferenceId\"=\"Wikis\".\"WikiId\"")),
                                   where : Rds.WikisWhere()
                                   .WikiId_In(dataRows
                                              .Where(o => o.String("ReferenceType") == "Wikis")
                                              .Select(o => o.Long("ReferenceId")))));
            }
            return(Repository.ExecuteDataSet(
                       context: context,
                       statements: statements.ToArray()));
        }
Example #10
0
        /// <summary>
        /// Fixed:
        /// </summary>
        public static void RebuildSearchIndexes(Context context, long siteId = -1)
        {
            var hash = new Dictionary <long, SiteModel>();

            Repository.ExecuteTable(
                context: context,
                statements: Rds.SelectItems(
                    column: Rds.ItemsColumn()
                    .ReferenceId()
                    .SiteId()
                    .UpdatedTime()
                    .Users_TenantId()
                    .Users_DeptId()
                    .Users_UserId(),
                    join: Rds.ItemsJoinDefault().Add(new SqlJoin(
                                                         tableBracket: "\"Users\"",
                                                         joinType: SqlJoin.JoinTypes.Inner,
                                                         joinExpression: "\"Users\".\"UserId\"=\"Items\".\"Updator\"")),
                    where : siteId > 0
                        ? Rds.ItemsWhere().SiteId(siteId)
                        : Rds.ItemsWhere().Add(raw: new List <string>()
            {
                "\"Items\".\"SearchIndexCreatedTime\" is null",
                "\"Items\".\"SearchIndexCreatedTime\"<>\"Items\".\"UpdatedTime\""
            }.Join(" or ")),
                    top: siteId > 0
                        ? 0
                        : Parameters.BackgroundTask.CreateSearchIndexLot))
            .AsEnumerable()
            .Select(o => new
            {
                ReferenceId = o["ReferenceId"].ToLong(),
                SiteId      = o["SiteId"].ToLong(),
                UpdatedTime = o.Field <DateTime>("UpdatedTime")
                              .ToString("yyyy/M/d H:m:s.fff"),
                TenantId = o.Int("TenantId"),
                DeptId   = o.Int("DeptId"),
                UserId   = o.Int("UserId")
            })
            .ForEach(data =>
            {
                var currentContext = context.CreateContext(
                    tenantId: data.TenantId,
                    deptId: data.DeptId,
                    userId: data.UserId);
                var siteModel = hash.Get(data.SiteId) ??
                                new SiteModel().Get(
                    context: currentContext,
                    where : Rds.SitesWhere().SiteId(data.SiteId));
                if (!hash.ContainsKey(data.SiteId))
                {
                    siteModel.SiteSettings = SiteSettingsUtilities.Get(
                        context: currentContext,
                        siteModel: siteModel,
                        referenceId: siteModel.SiteId);
                    hash.Add(data.SiteId, siteModel);
                }
                Create(
                    context: currentContext,
                    ss: siteModel.SiteSettings,
                    id: data.ReferenceId,
                    force: true);
                Repository.ExecuteNonQuery(
                    context: currentContext,
                    statements: Rds.UpdateItems(
                        where : Rds.ItemsWhere()
                        .ReferenceId(data.ReferenceId),
                        param: Rds.ItemsParam()
                        .SearchIndexCreatedTime(raw: "\"UpdatedTime\""),
                        addUpdatorParam: false,
                        addUpdatedTimeParam: false));
            });
        }
        public static ResponseFile Csv(Context context, SiteSettings ss, Export export)
        {
            ss.SetExports(context: context);
            ss.JoinedSsHash.Values.ForEach(currentSs => currentSs
                                           .SetChoiceHash(context: context, all: true));
            var data = new Dictionary <long, Dictionary <long, Dictionary <int, string> > >();
            Dictionary <long, long> keys = null;
            var keyColumns = KeyColumns(export, ss.SiteId);
            var view       = Views.GetBySession(context: context, ss: ss);

            switch (ss.ReferenceType)
            {
            case "Issues":
                keys = IssueData(
                    context: context,
                    ss: ss,
                    data: data,
                    where : view.Where(
                        context: context,
                        ss: ss),
                    orderBy: view.OrderBy(
                        context: context,
                        ss: ss)
                    .Issues_UpdatedTime(SqlOrderBy.Types.desc),
                    export: export,
                    keys: keys,
                    keyColumns: keyColumns);
                break;

            case "Results":
                keys = ResultData(
                    context: context,
                    ss: ss,
                    data: data,
                    where : view.Where(
                        context: context,
                        ss: ss),
                    orderBy: view.OrderBy(
                        context: context,
                        ss: ss)
                    .Results_UpdatedTime(SqlOrderBy.Types.desc),
                    export: export,
                    keys: keys,
                    keyColumns: keyColumns);
                break;
            }
            export.Join?.ForEach(link =>
            {
                var currentSs = ss.JoinedSsHash.Get(link.SiteId);
                switch (currentSs.ReferenceType)
                {
                case "Issues":
                    keys = IssueData(
                        context: context,
                        ss: currentSs,
                        data: data,
                        where : Rds.IssuesWhere().IssueId_In(keys.Values),
                        orderBy: null,
                        export: export,
                        keys: keys,
                        keyColumns: keyColumns);
                    break;

                case "Results":
                    keys = ResultData(
                        context: context,
                        ss: currentSs,
                        data: data,
                        where : Rds.ResultsWhere().ResultId_In(keys.Values),
                        orderBy: null,
                        export: export,
                        keys: keys,
                        keyColumns: keyColumns);
                    break;
                }
            });
            var csv = new System.Text.StringBuilder();

            if (export.Header == true)
            {
                csv.Append(export.Columns.Select(column =>
                                                 "\"" + column.GetLabelText() + "\"").Join(","), "\n");
            }
            data
            .FirstOrDefault(o => o.Key == ss.SiteId)
            .Value?
            .ForEach(dataRow =>
                     csv.Append(export.Columns.Select(column =>
                                                      data
                                                      .Get(column.SiteId)?
                                                      .Get(dataRow.Key)?
                                                      .Get(column.Id) ?? string.Empty).Join(",") + "\n"));
            return(new ResponseFile(
                       fileContent: csv.ToString(),
                       fileDownloadName: FileName(
                           context: context,
                           ss: ss,
                           name: export.Name)));
        }