/*
THIS INFRAGISTICS ULTIMATE SOFTWARE LICENSE  AGREEMENT ("AGREEMENT") LOCATED HERE:
https://www.infragistics.com/legal/license/igultimate-la
https://www.infragistics.com/legal/license/igultimate-eula
GOVERNS THE LICENSING, INSTALLATION AND USE OF INFRAGISTICS SOFTWARE. BY DOWNLOADING AND/OR INSTALLING AND USING INFRAGISTICS SOFTWARE:  you are indicating that you have read and understand this Agreement, and agree to be legally bound by it on behalf of the yourself and your company.
*/
import { BaseDataSource } from "./BaseDataSource";
import { IPageCandidatesSink_$type } from "./IPageCandidatesSink";
import { PagePredictionEngine } from "./PagePredictionEngine";
import { LRUCache$2 } from "./LRUCache$2";
import { Base, runOn, Array_$type, Number_$type, typeCast, fromEnum, typeGetValue, String_$type, Boolean_$type, markType } from "./type";
import { IDataSourcePage_$type } from "./IDataSourcePage";
import { Dictionary$2 } from "./Dictionary$2";
import { SectionMap } from "./SectionMap";
import { DataSourceExecutionContext } from "./DataSourceExecutionContext";
import { SectionData } from "./SectionData";
import { List$1 } from "./List$1";
import { DataSourceSpecialRow } from "./DataSourceSpecialRow";
import { DataSourcePropertiesComparer } from "./DataSourcePropertiesComparer";
import { TransactionState } from "./TransactionState";
import { TransactionType } from "./TransactionType";
import { DataSourceBatchStartedEventArgs } from "./DataSourceBatchStartedEventArgs";
import { DataSourceBatchCompletedEventArgs } from "./DataSourceBatchCompletedEventArgs";
import { truncate, intDivide } from "./number";
/**
 * @hidden
 */
export let VirtualDataSource = /*@__PURE__*/ (() => {
    class VirtualDataSource extends BaseDataSource {
        constructor() {
            super();
            this.ct = null;
            this.dc = false;
            this.dz = 0;
            this.c6 = null;
            this.cx = null;
            this.cw = null;
            this.dy = 50;
            this.dx = 200;
            this.actualPageSizePopulated = false;
            this.di = 50;
            this.da = false;
            this.c1 = null;
            this.cr = null;
            this.cs = null;
            this.c9 = new LRUCache$2(Base.$, IDataSourcePage_$type, 0, 200);
            this.dg = new Dictionary$2(Base.$, Array_$type, 0);
            this.dh = new Dictionary$2(Number_$type, Number_$type, 0);
            this.db = false;
            this.cp = null;
            this.cu = null;
            this.c8 = new SectionMap();
            this.cq = null;
            this.dr = -1;
            this.dj = -1;
            this.dt = -1;
            this.dl = -1;
            this.du = -1;
            this.dm = -1;
            this.ds = -1;
            this.dk = -1;
            this.dw = -1;
            this.dv = -1;
            this.dp = -1;
            this.dn = -1;
            this.dq = -1;
            this.df = new Dictionary$2(String_$type, Boolean_$type, 0);
            this._concurrencyTag = null;
            this.batchStarted = null;
            this.batchCompleted = null;
            this.c6 = new PagePredictionEngine();
            this.c6.e = this;
            this.c6.ag = this.actualPageSize;
            this.c6.f = this.c8;
            this.executionContext = new DataSourceExecutionContext();
            this.c6.b = this.executionContext;
            this.isReadOnly = true;
        }
        get_isSectionCollapsable() {
            if (!this.isSectionContentVisible) {
                return true;
            }
            return super.get_isSectionCollapsable();
        }
        set_isSectionCollapsable(a) {
            super.set_isSectionCollapsable(a);
        }
        get_isSectionExpandedDefault() {
            if (!this.isSectionContentVisible) {
                return false;
            }
            if (this.isSectionCollapsable) {
                return super.get_isSectionExpandedDefault();
            }
            return true;
        }
        set_isSectionExpandedDefault(a) {
            super.set_isSectionExpandedDefault(a);
        }
        get_actualBaseDataProvider() {
            return this.actualDataProvider;
        }
        get actualBaseDataProvider() {
            return this.get_actualBaseDataProvider();
        }
        get dataProvider() {
            return this.cx;
        }
        set dataProvider(a) {
            let b = this.cx;
            this.cx = a;
            if (b != this.cx) {
                this.onPropertyUpdated("DataProvider", b, this.cx);
            }
        }
        get actualDataProvider() {
            if (this.cw == null) {
                this.actualDataProvider = this.resolveDataProvider();
            }
            return this.cw;
        }
        set actualDataProvider(a) {
            let b = this.cw;
            this.cw = a;
            if (b != this.cw) {
                this.onPropertyUpdated("ActualDataProvider", b, this.cw);
            }
        }
        get pageSizeRequested() {
            return this.dy;
        }
        set pageSizeRequested(a) {
            let b = this.dy;
            this.dy = a;
            if (b != this.dy) {
                this.onPropertyUpdated("PageSizeRequested", b, this.dy);
            }
        }
        resetCache() {
            if (this.c2 != null) {
                this.c2.resetCache();
            }
            this.resetCacheOverride();
        }
        resetCacheOverride() {
            this.c9.i();
        }
        get maxCachedPages() {
            return this.dx;
        }
        set maxCachedPages(a) {
            let b = this.dx;
            this.dx = a;
            if (b != this.dx) {
                this.onPropertyUpdated("MaxCachedPages", b, this.dx);
            }
        }
        get actualPageSize() {
            return this.di;
        }
        set actualPageSize(a) {
            let b = this.di;
            this.di = a;
            if (b != this.di) {
                this.onPropertyUpdated("ActualPageSize", b, this.di);
            }
        }
        get_isSortingSupported() {
            if (this.externalDataSource != null && !this.da) {
                this.da = true;
                let a = this.externalDataSource.isSortingSupportedOverride;
                this.da = false;
                return a;
            }
            return false;
        }
        get_isFilteringSupported() {
            if (this.externalDataSource != null && !this.da) {
                this.da = true;
                let a = this.externalDataSource.isFilteringSupportedOverride;
                this.da = false;
                return a;
            }
            return false;
        }
        get_isGroupingSupported() {
            if (this.externalDataSource != null && !this.da) {
                this.da = true;
                let a = this.externalDataSource.isGroupingSupportedOverride;
                this.da = false;
                return a;
            }
            return false;
        }
        get c2() {
            return this.c1;
        }
        set c2(a) {
            this.c1 = a;
            this.actualDataProvider = this.resolveDataProvider();
        }
        resolveDataProvider() {
            if (this.c2 == null) {
                return null;
            }
            return this.c2.resolveDataProvider();
        }
        propertyUpdatedOverride(a, b, c) {
            super.propertyUpdatedOverride(a, b, c);
            switch (a) {
                case "DataProvider":
                    this.actualDataProvider = this.dataProvider;
                    this.queueAutoRefresh();
                    break;
                case "ExecutionContext":
                    this.c6.b = this.executionContext;
                    break;
                case "ActualDataProvider":
                    this.actualDataProvider.pageSizeRequested = this.pageSizeRequested;
                    this.actualDataProvider.pageLoaded = runOn(this, this.ej);
                    this.actualDataProvider.batchCompleted = runOn(this, this.ei);
                    this.queueAutoRefresh();
                    break;
                case "PageSizeRequested":
                    this.actualPageSize = this.pageSizeRequested;
                    if (this.actualDataProvider != null) {
                        this.actualDataProvider.pageSizeRequested = this.pageSizeRequested;
                    }
                    this.queueAutoRefresh();
                    break;
                case "ActualPageSize":
                    this.c6.ag = this.actualPageSize;
                    this.queueAutoRefresh();
                    break;
                case "FirstVisibleIndexRequested":
                    this.c6.aa = this.firstVisibleIndexRequested;
                    break;
                case "LastVisibleIndexRequested":
                    this.c6.ae = this.lastVisibleIndexRequested;
                    break;
                case "ActualCount":
                    if (this.actualDataProvider != null && !this.c8.q) {
                        this.c6.ab = this.actualDataProvider.actualCount;
                    }
                    else {
                        this.c6.ab = this.actualCount;
                    }
                    this.queueAutoRefresh();
                    break;
                case "MaxCachedPages":
                    this.c9.h = this.maxCachedPages;
                    break;
            }
        }
        d2(a) {
            if (this.an && this.c8.q) {
                let b = this.c7(a);
                if (b == null) {
                    b = this.c8.d();
                }
                return a - b.t;
            }
            return a;
        }
        ej(a, b, c) {
            let d = this.executionContext;
            if (d != null) {
                d.execute(() => this.ep(a, b, c));
            }
            else {
                this.ep(a, b, c);
            }
        }
        ep(a, b, c) {
            if (a == null) {
                b = this.resolveFullCount(b);
                if (this.actualCount != b) {
                    this.actualCount = b;
                }
                return;
            }
            if (c != this.actualPageSize && !this.actualPageSizePopulated) {
                this.actualPageSize = c;
            }
            this.actualPageSizePopulated = true;
            let d = a.pageIndex();
            this.ek(d);
            this.c9.item(d, a);
            let e = a.schema();
            if (e != null) {
                this.actualSchema = e;
            }
            let f = a.getSummaryInformation();
            if (this.summaryDescriptions.k.count > 0 && this.cu == null && f != null) {
                this.cu = f;
                for (let g = 0; g < this.summaryDescriptions.k.count; g++) {
                    this.cu[g].summaryIndex = g;
                }
                let h = SectionData.r(this.cu);
                this.dz = h.count;
            }
            let i = a.getGroupInformation();
            if (this.groupDescriptions.k.count > 0 && this.cp == null && i != null) {
                this.cp = i;
                this.eo();
                this.dc = false;
            }
            b = this.resolveFullCount(b);
            if (this.actualCount != b) {
                this.actualCount = b;
            }
            this.en(a);
        }
        resolveFullCount(a) {
            if (this.cp != null) {
                return this.c8.u + this.dz;
            }
            return a + this.dz;
        }
        eo() {
            let a = 0;
            let b = 0;
            let c = this.shouldEmitSectionHeaders;
            let d = this.shouldEmitSectionFooters;
            for (let e = 0; e < this.cp.length; e++) {
                let f = new SectionData();
                let g = b;
                let h = this.cp[e].endIndex - this.cp[e].startIndex;
                f.af = a;
                f.ae = e;
                f.d = new Array(this.groupDescriptions.k.count);
                for (let i = 0; i < this.groupDescriptions.k.count; i++) {
                    f.d[i] = 0;
                }
                f.ad = a + h;
                f.t = 0;
                f.e = this.cp[e].groupKeyProperties;
                f.f = this.cp[e].groupKeyValues;
                f.h = new Array(0);
                f.ai(this.sectionHeaderDisplayMode, this.isSectionExpandedDefault);
                this.eh(f, e == 0);
                if (d) {
                    f.u = f.c.length;
                }
                let j = 0;
                f.i = new Array(this.groupDescriptions.k.count);
                if (this.summaryScope == 0 || this.summaryScope == 2) {
                    if (this.cp[e].summaryResults != null) {
                        f.i[this.groupDescriptions.k.count - 1] = this.cp[e].summaryResults;
                        if (f.i != null) {
                            for (let k = 0; k < f.i[this.groupDescriptions.k.count - 1].length; k++) {
                                f.i[this.groupDescriptions.k.count - 1][k].summaryIndex = k;
                            }
                            j = SectionData.r(f.i[this.groupDescriptions.k.count - 1]).count;
                        }
                    }
                }
                if (this.includeSummaryRowsInSection) {
                    if (this.isSectionSummaryRowsAtBottom) {
                        f.ag = j;
                    }
                    else {
                        f.ah = j;
                        g += j;
                    }
                    b += j;
                    f.ad += j;
                }
                if (d) {
                    b++;
                }
                let l = 0;
                f.b = new Array(f.c.length);
                if (f.z > -1) {
                    let m = this.c8.t._inner[f.z];
                    for (let n = 0; n < m.f.length; n++) {
                        l = n;
                        if (!Base.equalsStatic(m.f[n], f.f[n])) {
                            break;
                        }
                    }
                }
                for (let o = l; o < f.c.length; o++) {
                    b++;
                    g++;
                    f.ad++;
                    let p = this.eb(f, o);
                    f.a[o] = p;
                    f.b[o] = o - l;
                    if (this.df.containsKey(p)) {
                        f.c[o] = this.df.item(p);
                    }
                    else {
                        f.c[o] = this.isSectionExpandedDefault;
                    }
                    if (!f.c[o]) {
                        let q = 0;
                        let r = f.c.length - 1 - o;
                        f.ad -= q;
                        b -= q;
                        if (d) {
                            b--;
                            f.u--;
                        }
                        o += r;
                    }
                }
                f.y = f.v();
                f.t = g;
                this.c8.z(f, h + 1);
                if (!f.p) {
                    let s = f.w();
                    f.ad -= f.d[s] + j;
                    b -= f.d[s] + j;
                }
                a = f.ad + 1;
                this.c8.t.add(f);
                f.q = this.c8.r(f);
            }
            let t = 0;
            for (let u = 0; u < this.c8.t.count; u++) {
                let v = this.c8.t._inner[u];
                if (this.shouldEmitSectionHeaders) {
                    if (!v.q) {
                        let w = v.ad - v.af + 1;
                        this.c8.ae(v.ae);
                        this.c8.ab(v, -w, -w);
                        u--;
                        t++;
                        continue;
                    }
                }
                if (v.z > -1) {
                    v.z -= t;
                }
            }
        }
        eh(a, b) {
            if (b) {
                this.cr = new Array(this.groupDescriptions.k.count);
                for (let c = 0; c < this.cr.length; c++) {
                    this.cr[c] = a;
                }
            }
            if (this.sectionHeaderDisplayMode == 1) {
                let d = false;
                let e = a.e.length;
                for (let f = 0; f < e; f++) {
                    if (d) {
                        this.cr[f] = a;
                        continue;
                    }
                    let g = false;
                    if (this.cr[f].f[f] == null) {
                        g = a.f[f] != null;
                    }
                    else {
                        g = !Base.equalsStatic(this.cr[f].f[f], a.f[f]);
                    }
                    if (g) {
                        this.cr[f] = a;
                        if (f - 1 > -1) {
                            let h = f - 1;
                            while (h >= 0 && this.cr[h].o) {
                                h = h - 1;
                            }
                            a.z = this.cr[h].ae;
                        }
                        d = true;
                    }
                }
            }
            else {
                let i = false;
                for (let j = 0; j < a.e.length; j++) {
                    if (this.cr[0].f[j] == null) {
                        if (this.cr[0].f[j] != a.f[j]) {
                            i = true;
                            break;
                        }
                        continue;
                    }
                    if (!Base.equalsStatic(this.cr[0].f[j], a.f[j])) {
                        i = true;
                        break;
                    }
                }
                if (i) {
                    this.cr[0] = a;
                }
            }
        }
        eg(a) {
        }
        en(a) {
            if (this.updateNotifier != null) {
                let b = a.pageIndex() * this.actualPageSize;
                if (this.actualDataProvider != null) {
                    if (b > this.actualDataProvider.actualCount) {
                        return;
                    }
                }
                let c = this.d1(b);
                let d = this.d1(b + a.count() - 1);
                if (c > 0 && this.getRowType(c - 1) == 1) {
                    c--;
                }
                if (this.actualCount == 0 && a.count() == 0) {
                    this.onClearItems();
                }
                else {
                    this.updateNotifier.rangeActualized(c, d);
                }
            }
        }
        d1(a) {
            if (this.an && this.c8.q) {
                let b = this.c8.g(a);
                if (b == null) {
                    b = this.c8.d();
                }
                if (!b.p) {
                    return b.af;
                }
                return a + b.t;
            }
            return a;
        }
        el(a) {
            a();
        }
        get_isVirtual() {
            return true;
        }
        isPlaceholderItem(a) {
            let b = this.cv(a);
            let c = b[0];
            if (!this.c9.d(c)) {
                if (b[1] == -1) {
                    return false;
                }
                return true;
            }
            return false;
        }
        getItemAtIndex(a) {
            if (a >= this.actualCount - this.dz) {
                return this.d6(a);
            }
            let b = this.cv(a);
            let c = b[0];
            if (!this.c9.d(c)) {
                if (b[1] == -1) {
                    return this.d6(a);
                }
                return null;
            }
            let d = this.c9.item(c);
            let e = b[1];
            if (e == -1) {
                return this.d6(a);
            }
            return d.getItemAtIndex(e);
        }
        d6(a) {
            if (a >= this.actualCount - this.dz) {
                let b = new DataSourceSpecialRow();
                b.rowType = 4;
                b.level = 0;
                let c = a - (this.actualCount - this.dz);
                let d = SectionData.r(this.cu);
                let e = new Array(d._inner[c].count);
                d._inner[c].values.copyTo(e, 0);
                b.summaryResults = e;
                return b;
            }
            let f = this.c7(a);
            if (f != null) {
                let g = f.j(a);
                if (g == 1 || g == 2) {
                    let h = new DataSourceSpecialRow();
                    h.rowType = g;
                    h.summaryResults = f.i[f.i.length - 1];
                    h.level = g == 1 ? f.w() + (a - f.af) : (f.u - 1) - (f.w() + (a - (f.ad - f.u + 1)));
                    if (this.sectionHeaderDisplayMode == 0) {
                        for (let i = 0; i < this.groupDescriptions.k.count; i++) {
                            h.r(this.groupDescriptions.k.item(i).propertyName, f.f[i]);
                            h.s(this.groupDescriptions.k.item(i).propertyName, f.f[i]);
                        }
                    }
                    else {
                        if (h.level >= 0 && h.level < this.groupDescriptions.k.count) {
                            h.r(this.groupDescriptions.k.item(h.level).propertyName, f.f[h.level]);
                            h.s(this.groupDescriptions.k.item(h.level).propertyName, f.f[h.level]);
                        }
                    }
                    return h;
                }
                else if (g == 5) {
                    let j = new DataSourceSpecialRow();
                    j.rowType = 5;
                    j.level = f.c.length;
                    let k = f.x(a);
                    let l = SectionData.r(f.i[f.i.length - 1]);
                    let m = new Array(l._inner[k].count);
                    l._inner[k].values.copyTo(m, 0);
                    j.summaryResults = m;
                    return j;
                }
            }
            return null;
        }
        cv(a) {
            if (this.an && this.c8.q) {
                let b = false;
                let c = this.c7(a);
                if (c == null) {
                    c = this.c8.d();
                    if (this.cu.length > 0 && a > c.ad) {
                        b = true;
                    }
                }
                let d = c.af;
                if (this.shouldEmitSectionHeaders && a >= d && a < d + c.v()) {
                    b = true;
                }
                if (a - (d + c.v() - 1) <= c.aa + c.ah) {
                    b = true;
                }
                if (this.shouldEmitSectionFooters) {
                    if (a <= c.ad && a >= c.ad - c.c.length - c.ag) {
                        b = true;
                    }
                }
                else if (c.ag > 0) {
                    if (a > c.ad - c.ag && a <= c.ad) {
                        b = true;
                    }
                }
                let e = a - c.t;
                let f = truncate(Math.floor(e / this.actualPageSize));
                let g = e % this.actualPageSize;
                if (b) {
                    g = -1;
                }
                let h = new Array(2);
                h[0] = f;
                h[1] = g;
                return h;
            }
            else {
                let i = truncate(Math.floor(a / this.actualPageSize));
                let j = a % this.actualPageSize;
                let k = new Array(2);
                k[0] = i;
                k[1] = j;
                return k;
            }
        }
        c7(a) {
            return this.c8.e(a);
        }
        getItemPropertyAtIndex(a, b) {
            if (a > (this.actualCount - 1) - this.dz) {
                return this.d7(a, b);
            }
            let c = this.cv(a);
            let d = c[0];
            if (!this.c9.d(d)) {
                if (c[1] == -1) {
                    return this.d7(a, b);
                }
                return null;
            }
            let e = this.c9.item(d);
            let f = c[1];
            if (f == -1) {
                return this.d7(a, b);
            }
            if (this.ao()) {
                let g = e.getItemAtIndex(f);
                let h = this.al(g, b);
                if (h) {
                    let i = this.ax(g, b);
                    return i;
                }
            }
            return e.getItemValueAtIndex(f, b);
        }
        d7(a, b) {
            let c = this.d6(a);
            if (typeCast(DataSourceSpecialRow.$, c) !== null) {
                return c.p(b);
            }
            return null;
        }
        em(a) {
            if (!this.dh.containsKey(a)) {
                this.dh.addItem(a, 1);
            }
            else {
                this.dh.item(a, this.dh.item(a) + 1);
            }
        }
        ek(a) {
            if (this.dh.containsKey(a)) {
                this.dh.item(a, this.dh.item(a) - 1);
                if (this.dh.item(a) <= 0) {
                    this.dh.removeItem(a);
                    if (this.actualDataProvider != null) {
                        this.actualDataProvider.removePageRequest(a);
                    }
                }
            }
        }
        addCandidate(a, b) {
            let c = false;
            if (!this.dg.containsKey(a)) {
                let d = new List$1(Number_$type, 0);
                let e = this.transformPage(a);
                for (let f = 0; f < e.length; f++) {
                    let g = e[f];
                    if (!this.c9.d(g)) {
                        d.add(g);
                        this.em(g);
                        let h = this.dh.item(g);
                        if (h == 1 && this.actualDataProvider != null) {
                            this.actualDataProvider.addPageRequest(g, b);
                        }
                        c = true;
                    }
                }
                if (d.count > 0) {
                    this.dg.addItem(a, d.toArray());
                }
            }
            return c;
        }
        removeCandidate(a) {
            if (this.dg.containsKey(a)) {
                for (let b = 0; b < this.dg.item(a).length; b++) {
                    let c = this.dg.item(a)[b];
                    this.ek(c);
                }
                this.dg.removeItem(a);
            }
        }
        transformPage(a) {
            let b = [a];
            if (this.an && this.c8.q) {
                let c = a * this.actualPageSize;
                let d = c + this.actualPageSize - 1;
                let e = this.c7(c);
                let f = new List$1(Number_$type, 0);
                for (let g = c; g <= d; g++) {
                    if (e == null) {
                        break;
                    }
                    if (g > e.ad) {
                        if (e.ae < this.c8.t.count - 1) {
                            e = this.c8.t._inner[e.ae + 1];
                        }
                        else {
                            break;
                        }
                    }
                    if (!e.p || (g >= e.af && g <= e.af + (e.v() - 1) + e.aa)) {
                        continue;
                    }
                    let h = g - e.t;
                    let i = intDivide(h, this.actualPageSize);
                    if (!f.contains(i)) {
                        f.add(i);
                    }
                }
                b = f.toArray();
            }
            return b;
        }
        getUnrealizedCount() {
            let a = this.c9.g * this.actualPageSize;
            let b = this.actualCount - a;
            return b;
        }
        onSetItemOverride(a, b, c) {
            super.onSetItemOverride(a, b, c);
            let d = this.cv(a);
            let e = d[0];
            if (this.c9.d(e)) {
                this.c9.j(e);
            }
        }
        refreshInternalOverride() {
            super.refreshInternalOverride();
            this.actualPageSizePopulated = false;
            let a = this.actualCount != 0;
            this.db = true;
            if (!this.dc) {
                this.resetCache();
                if (a) {
                    this.onClearItems();
                }
                this.cp = null;
                this.cu = null;
                this.dz = 0;
                this.c8.v();
            }
            else {
                this.dc = false;
                if (a) {
                    this.onClearItems();
                }
            }
            this.eq();
            this.c6.au();
            this.db = false;
        }
        eq() {
            if (this.actualDataProvider != null) {
                for (let a of fromEnum(this.dg.values)) {
                    for (let c = 0; c < a.length; c++) {
                        let b = a[c];
                        this.actualDataProvider.addPageRequest(b, 1);
                    }
                }
            }
        }
        onClearItemsOverride() {
            super.onClearItemsOverride();
            if (!this.db) {
                this.queueAutoRefresh();
            }
        }
        onInsertItemOverride(a, b) {
            super.onInsertItemOverride(a, b);
            this.queueAutoRefresh();
        }
        onRemoveItemOverride(a, b) {
            super.onRemoveItemOverride(a, b);
            this.queueAutoRefresh();
        }
        get_isItemIndexLookupSupported() {
            return true;
        }
        get_isKeyIndexLookupSupported() {
            return true;
        }
        indexOfItem(a) {
            let b = this.c9.b;
            let c = b.o;
            let d = b.q;
            let e = d.count;
            let f = b.p;
            for (let g = 0; g < e; g++) {
                if (f._inner[g]) {
                    continue;
                }
                let h = d._inner[g].b;
                let i = h.count();
                for (let j = 0; j < i; j++) {
                    if (this.de(h.getItemAtIndex(j), a)) {
                        let k = typeGetValue(c._inner[g]);
                        let l = k * this.actualPageSize;
                        return l + j;
                    }
                }
            }
            if (this.actualDataProvider != null && this.actualDataProvider.isItemIndexLookupSupported) {
                return this.actualDataProvider.indexOfItem(a);
            }
            return -1;
        }
        de(a, b) {
            if (a == null && b == null) {
                return true;
            }
            if (a == null || b == null) {
                return false;
            }
            return Base.equalsStatic(a, b);
        }
        indexOfKey(a) {
            let b = this.actualPrimaryKey;
            if (b == null || b.length < 1 || this.actualBaseDataProvider == null) {
                return -1;
            }
            this.ensureComparables(this.actualSchema);
            let c = this.c5();
            if (this.an && this.shouldEmitSectionHeaders && !this.isSectionContentVisible && this.isSectionHeaderNormalRow) {
                if (this.c8.t.count > 0) {
                    for (let d = 0; d < this.c8.t.count; d++) {
                        let e = this.c8.t._inner[d];
                        let f = new DataSourceSpecialRow();
                        for (let g = 0; g < e.e.length; g++) {
                            let h = e.e[g];
                            let i = e.f[g];
                            f.r(h, i);
                        }
                        if (c.i(f, a) == 0) {
                            return d;
                        }
                    }
                }
            }
            let j = this.c9.b;
            let k = j.o;
            let l = j.q;
            let m = l.count;
            let n = j.p;
            for (let o = 0; o < m; o++) {
                if (n._inner[o]) {
                    continue;
                }
                let p = l._inner[o].b;
                let q = p.count();
                for (let r = 0; r < q; r++) {
                    if (c.i(p.getItemAtIndex(r), a) == 0) {
                        let s = typeGetValue(k._inner[o]);
                        let t = s * this.actualPageSize;
                        return t + r;
                    }
                }
            }
            if (this.actualDataProvider != null && this.actualDataProvider.isKeyIndexLookupSupported) {
                return this.actualDataProvider.indexOfKey(a);
            }
            return -1;
        }
        c5() {
            let a = new Array(this.actualPrimaryKey.length);
            for (let b = 0; b < a.length; b++) {
                a[b] = 0;
            }
            return new DataSourcePropertiesComparer(this.actualPrimaryKey, a, this.ct, this);
        }
        getStickyRowPriority(a) {
            let b = this.getRowType(a);
            switch (b) {
                case 1: return 100 - this.getRowLevel(a);
                case 2: return 99 - this.getRowLevel(a);
                case 3:
                case 5: return 2;
                case 4: return 3;
            }
            return 1;
        }
        unpinRow(a) {
            super.unpinRow(a);
        }
        pinRow(a) {
            super.pinRow(a);
        }
        isRowPinned(a) {
            return super.isRowPinned(a);
        }
        getStickyRowsInRange(a, b) {
            if ((this.groupDescriptions == null || this.groupDescriptions.k.count == 0) && (this.summaryDescriptions == null || this.summaryDescriptions.k.count == 0)) {
                return null;
            }
            let c = this.c7(a);
            let d = this.c7(b);
            if (this.c8.t.count > 0) {
                if (this.c8.t.count == 1) {
                    c = this.c8.t._inner[0];
                    d = this.c8.t._inner[0];
                }
                else {
                    c = this.c8.e(a);
                    if (c != null) {
                        while (c.z != -1) {
                            c = this.c8.t._inner[c.z];
                        }
                    }
                    d = this.c8.e(b);
                    if (b >= this.actualCount - this.dz) {
                        d = this.c8.d();
                    }
                }
            }
            else if (this.dz > 0) {
                let e = new List$1(Number_$type, 0);
                for (let f = this.actualCount - this.dz; f < this.actualCount; f++) {
                    e.add(f);
                }
                return e.toArray();
            }
            if (c == null || d == null) {
                return null;
            }
            if (c.ae == this.dr && c.aa == this.dt && c.af == this.du && c.ad == this.ds && c.ah == this.dw && c.ag == this.dv && d.ae == this.dj && d.aa == this.dl && d.af == this.dm && d.ad == this.dk && d.ah == this.dp && d.ag == this.dn && this.dz == this.dq) {
                return this.cq;
            }
            this.dr = c.ae;
            this.dj = d.ae;
            this.dt = c.aa;
            this.dl = d.aa;
            this.du = c.af;
            this.dm = d.af;
            this.ds = c.ad;
            this.dk = d.ad;
            this.dp = d.ah;
            this.dn = d.ag;
            this.dw = c.ah;
            this.dv = c.ag;
            this.dq = this.dz;
            let g = new List$1(Number_$type, 0);
            for (let h = c.ae; h <= d.ae; h++) {
                let i = this.c8.t._inner[h];
                let j = i.c.length;
                let k = i.v();
                if (this.shouldEmitSectionHeaders && this.an) {
                    for (let l = 0; l < i.c.length; l++) {
                        if (i.a[l] != null) {
                            let m = i.af + i.b[l];
                            g.add(m);
                        }
                        if (!i.c[l]) {
                            break;
                        }
                    }
                }
                if (i.p) {
                    for (let n = 0; n < i.ah; n++) {
                        g.add(i.af + n + k);
                    }
                    if (this.shouldEmitShiftedRows) {
                        for (let o = 0; o < i.aa; o++) {
                            g.add(i.af + o + j);
                        }
                    }
                    if (this.summaryScope == 0 || this.summaryScope == 2) {
                        if (this.includeSummaryRowsInSection && this.isSectionSummaryRowsAtBottom) {
                            for (let p = i.ag - 1; p >= 0; p--) {
                                if (this.shouldEmitSectionFooters) {
                                    g.add(i.ad - k - p);
                                }
                                else {
                                    g.add(i.ad - p);
                                }
                            }
                        }
                    }
                }
                if (this.shouldEmitSectionFooters && this.an) {
                    for (let q = i.c.length - 1; q >= 0; q--) {
                        if (!i.c[q]) {
                            break;
                        }
                        g.add(i.ad - q);
                    }
                }
            }
            for (let r = this.actualCount - this.dz; r < this.actualCount; r++) {
                g.add(r);
            }
            this.cq = g.toArray();
            return this.cq;
        }
        isExclusivelySticky(a) {
            let b = this.getRowType(a);
            return b == 1 || b == 2 || b == 4 || (this.isSectionSummaryRowsAtBottom && b == 5);
        }
        getRowType(a) {
            if (a < 0) {
                return 0;
            }
            let b = this.getItemAtIndex(a);
            let item_ = b;
            if ((item_ != null && item_.$$isSpecialRow !== undefined)) {
                let c = b.rowType;
                if (this.isSectionHeaderNormalRow && c == 1) {
                    return 0;
                }
                return c;
            }
            return 0;
        }
        getIsRowExpandedAtIndex(a) {
            let b = this.c8.e(a);
            if (b == null) {
                b = this.c8.d();
            }
            for (let c = 0; c < b.a.length; c++) {
                if (b.a[c] != null) {
                    if (a == b.af + b.b[c]) {
                        return b.c[c];
                    }
                }
            }
            return super.getIsRowExpandedAtIndex(a);
        }
        setIsRowExpandedAtIndex(a, b) {
            let c = this.c8.e(a);
            if (c == null) {
                c = this.c8.d();
            }
            for (let d = 0; d < c.a.length; d++) {
                if (c.a[d] != null) {
                    if (a == c.af + c.b[d]) {
                        let e = false;
                        let f = c.a[d];
                        if (this.df.containsKey(f) && this.df.item(f) != b) {
                            let g = this.df.item(f);
                            if (b == this.isSectionExpandedDefault) {
                                this.df.removeItem(f);
                            }
                            else {
                                this.df.item(f, b);
                            }
                            e = true;
                            this.onRowExpansionChanged(a, g, b);
                        }
                        else if (b != this.isSectionExpandedDefault) {
                            this.df.addItem(f, b);
                            e = true;
                            this.onRowExpansionChanged(a, this.isSectionExpandedDefault, b);
                        }
                        if (e) {
                            this.c8.v();
                            this.eo();
                            this.dc = true;
                            if (this.actualCount != this.c8.u) {
                                this.actualCount = this.c8.u + this.dz;
                            }
                            else {
                                this.queueAutoRefresh();
                            }
                        }
                        break;
                    }
                }
            }
        }
        getRowLevel(a) {
            if (a < 0) {
                return 0;
            }
            let b = this.getItemAtIndex(a);
            let item_ = b;
            if ((item_ != null && item_.$$isSpecialRow !== undefined)) {
                return b.level;
            }
            if (this.isGroupingSupported) {
                if (this.sectionHeaderDisplayMode == 1) {
                    return this.groupDescriptions.k.count;
                }
                else if (this.groupDescriptions.k.count > 0) {
                    return 1;
                }
            }
            return 0;
        }
        getRootSummaryRowCount() {
            return this.dz;
        }
        ea(a) {
            let b = "";
            for (let c = 0; c < a.e.length; c++) {
                b += a.e[c] + ":" + a.f[c];
            }
            return b;
        }
        eb(a, b) {
            if (this.sectionHeaderDisplayMode == 0) {
                return this.ea(a);
            }
            let c = "";
            for (let d = 0; d < a.e.length; d++) {
                c += a.e[d] + ":" + a.f[d] + ":";
            }
            c += b;
            return c;
        }
        getRootSummaryResults() {
            return this.cu;
        }
        getSectionSummaryResults(a) {
            if (this.c8.t.count > 0 && a >= 0 && a < this.c8.t.count) {
                return this.c8.t._inner[a].i;
            }
            return null;
        }
        clone() {
            return null;
        }
        cloneProperties(a) {
            super.cloneProperties(a);
            let b = typeCast(VirtualDataSource.$, a);
            if (b != null) {
                b.pageSizeRequested = this.pageSizeRequested;
                b.maxCachedPages = this.maxCachedPages;
            }
        }
        get concurrencyTag() {
            return this._concurrencyTag;
        }
        set concurrencyTag(a) {
            this._concurrencyTag = a;
        }
        get_isBatchingEnabled() {
            return true;
        }
        set_isBatchingEnabled(a) {
            super.set_isBatchingEnabled(a);
        }
        updatePropertyAtKey(a, b, c, d = false) {
            let e = super.updatePropertyAtKey(a, b, c);
            if (this.concurrencyTag != null && this.ao()) {
                let f = this.indexOfKey(a);
                if (f > -1) {
                    let g = this.getItemAtIndex(f);
                    let h = this.actualDataProvider.getItemValue(g, this.concurrencyTag);
                    if (h != null) {
                        let i = this.t.g(a);
                        i.version = h;
                    }
                }
            }
            return e;
        }
        removeItemByKey(a) {
            super.removeItemByKey(a);
            if (this.concurrencyTag != null && this.ao()) {
                let b = this.indexOfKey(a);
                if (b > -1) {
                    let c = this.getItemAtIndex(b);
                    let d = this.actualDataProvider.getItemValue(c, this.concurrencyTag);
                    if (d != null) {
                        let e = this.t.g(a);
                        e.version = d;
                    }
                }
            }
        }
        ci(a, b) {
            if (a == 5) {
                let c = b;
                let d = c.a;
                let e = new List$1(TransactionState.$, 0);
                for (let f = 0; f < d.length; f++) {
                    let g = d[f].transactionType;
                    let h = null;
                    let i = null;
                    if (g == TransactionType.Delete || g == 1) {
                        let j = new Dictionary$2(String_$type, Base.$, 0);
                        let k = d[f].id;
                        for (let l = 0; l < this.actualPrimaryKey.length; l++) {
                            j.addItem(this.actualPrimaryKey[l], k[l]);
                        }
                        h = j;
                    }
                    if (g == 0) {
                        let m = new Dictionary$2(String_$type, Base.$, 0);
                        let n = d[f].id[0];
                        for (let o = 0; o < this.actualSchema.propertyNames.length; o++) {
                            let p = this.actualSchema.propertyNames[o];
                            m.addItem(p, this.actualDataProvider.getItemValue(n, p));
                        }
                        i = m;
                    }
                    else if (g == 1) {
                        i = d[f].value;
                    }
                    if (h != null) {
                        let q = {};
                        let r = h;
                        for (let s of fromEnum(r)) {
                            q[s.key] = s.value;
                        }
                        h = q;
                    }
                    if (i != null) {
                        let t = {};
                        let u = i;
                        for (let v of fromEnum(u)) {
                            t[v.key] = v.value;
                        }
                        i = t;
                    }
                    e.add(((() => {
                        let $ret = new TransactionState(h, g, i);
                        $ret.version = d[f].version;
                        return $ret;
                    })()));
                }
                let w = e.toArray();
                if (this.batchStarted != null) {
                    this.batchStarted(this, new DataSourceBatchStartedEventArgs(w));
                }
                this.actualDataProvider.createBatchRequest(w);
            }
        }
        ei(a, b, c) {
            if (b) {
                this.queueAutoRefresh();
            }
            if (this.batchCompleted != null) {
                this.batchCompleted(this, new DataSourceBatchCompletedEventArgs(a, c));
            }
        }
    }
    VirtualDataSource.$t = /*@__PURE__*/ markType(VirtualDataSource, 'VirtualDataSource', BaseDataSource.$, [IPageCandidatesSink_$type]);
    return VirtualDataSource;
})();
//# sourceMappingURL=VirtualDataSource.js.map
