Compare commits
	
		
			8 Commits
		
	
	
		
			moment-bum
			...
			sort-incom
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					5000bcc849 | ||
| 
						 | 
					44d2c465ff | ||
| 
						 | 
					237d458b07 | ||
| 
						 | 
					7e41a4168f | ||
| 
						 | 
					3918e808d8 | ||
| 
						 | 
					fd71ce8c42 | ||
| 
						 | 
					cc32cf43af | ||
| 
						 | 
					0551fc2e7c | 
@@ -29,10 +29,6 @@ define(
 | 
			
		||||
        _,
 | 
			
		||||
        EventEmitter
 | 
			
		||||
    ) {
 | 
			
		||||
        const LESS_THAN = -1;
 | 
			
		||||
        const EQUAL = 0;
 | 
			
		||||
        const GREATER_THAN = 1;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @constructor
 | 
			
		||||
         */
 | 
			
		||||
@@ -80,10 +76,7 @@ define(
 | 
			
		||||
                    this.rows = [];
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                for (let row of rowsToAdd) {
 | 
			
		||||
                    let index = this.sortedIndex(this.rows, row);
 | 
			
		||||
                    this.rows.splice(index, 0, row);
 | 
			
		||||
                }
 | 
			
		||||
                this.sortAndMergeRows(rowsToAdd);
 | 
			
		||||
 | 
			
		||||
                // we emit filter no matter what to trigger
 | 
			
		||||
                // an update of visible rows
 | 
			
		||||
@@ -92,58 +85,85 @@ define(
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sortedLastIndex(rows, testRow) {
 | 
			
		||||
                return this.sortedIndex(rows, testRow, _.sortedLastIndex);
 | 
			
		||||
            }
 | 
			
		||||
            sortAndMergeRows(rows) {
 | 
			
		||||
                const sortedRowsToAdd = this.sortCollection(rows);
 | 
			
		||||
 | 
			
		||||
            /**
 | 
			
		||||
             * Finds the correct insertion point for the given row.
 | 
			
		||||
             * Leverages lodash's `sortedIndex` function which implements a binary search.
 | 
			
		||||
             * @private
 | 
			
		||||
             */
 | 
			
		||||
            sortedIndex(rows, testRow, lodashFunction = _.sortedIndexBy) {
 | 
			
		||||
                if (this.rows.length === 0) {
 | 
			
		||||
                    return 0;
 | 
			
		||||
                    this.rows = sortedRowsToAdd;
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const testRowValue = this.getValueForSortColumn(testRow);
 | 
			
		||||
                const firstValue = this.getValueForSortColumn(this.rows[0]);
 | 
			
		||||
                const lastValue = this.getValueForSortColumn(this.rows[this.rows.length - 1]);
 | 
			
		||||
                const firstIncomingRow = sortedRowsToAdd[0];
 | 
			
		||||
                const lastIncomingRow = sortedRowsToAdd[sortedRowsToAdd.length - 1];
 | 
			
		||||
                const firstExistingRow = this.rows[0];
 | 
			
		||||
                const lastExistingRow = this.rows[this.rows.length - 1];
 | 
			
		||||
 | 
			
		||||
                if (this.firstRowInSortOrder(lastIncomingRow, firstExistingRow)
 | 
			
		||||
                    === lastIncomingRow
 | 
			
		||||
                ) {
 | 
			
		||||
                    this.rows = [...sortedRowsToAdd, ...this.rows];
 | 
			
		||||
                } else if (this.firstRowInSortOrder(lastExistingRow, firstIncomingRow)
 | 
			
		||||
                    === lastExistingRow
 | 
			
		||||
                ) {
 | 
			
		||||
                    this.rows = [...this.rows, ...sortedRowsToAdd];
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.mergeSortedRows(sortedRowsToAdd);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sortCollection(rows) {
 | 
			
		||||
                const sortedRows = _.orderBy(
 | 
			
		||||
                    rows,
 | 
			
		||||
                    row => row.getParsedValue(this.sortOptions.key), this.sortOptions.direction
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                return sortedRows;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            mergeSortedRows(rows) {
 | 
			
		||||
                const mergedRows = [];
 | 
			
		||||
                let i = 0;
 | 
			
		||||
                let j = 0;
 | 
			
		||||
 | 
			
		||||
                while (i < this.rows.length && j < rows.length) {
 | 
			
		||||
                    const existingRow = this.rows[i];
 | 
			
		||||
                    const incomingRow = rows[j];
 | 
			
		||||
 | 
			
		||||
                    if (this.firstRowInSortOrder(existingRow, incomingRow) === existingRow) {
 | 
			
		||||
                        mergedRows.push(existingRow);
 | 
			
		||||
                        i++;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        mergedRows.push(incomingRow);
 | 
			
		||||
                        j++;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // tail of existing rows is all that is left to merge
 | 
			
		||||
                if (i < this.rows.length) {
 | 
			
		||||
                    for (i; i < this.rows.length; i++) {
 | 
			
		||||
                        mergedRows.push(this.rows[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // tail of incoming rows is all that is left to merge
 | 
			
		||||
                if (j < rows.length) {
 | 
			
		||||
                    for (j; j < rows.length; j++) {
 | 
			
		||||
                        mergedRows.push(rows[j]);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this.rows = mergedRows;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            firstRowInSortOrder(row1, row2) {
 | 
			
		||||
                const val1 = this.getValueForSortColumn(row1);
 | 
			
		||||
                const val2 = this.getValueForSortColumn(row2);
 | 
			
		||||
 | 
			
		||||
                if (this.sortOptions.direction === 'asc') {
 | 
			
		||||
                    if (testRowValue > lastValue) {
 | 
			
		||||
                        return this.rows.length;
 | 
			
		||||
                    } else if (testRowValue === lastValue) {
 | 
			
		||||
                        // Maintain stable sort
 | 
			
		||||
                        return this.rows.length;
 | 
			
		||||
                    } else if (testRowValue <= firstValue) {
 | 
			
		||||
                        return 0;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        return lodashFunction(rows, testRow, (thisRow) => {
 | 
			
		||||
                            return this.getValueForSortColumn(thisRow);
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                    return val1 <= val2 ? row1 : row2;
 | 
			
		||||
                } else {
 | 
			
		||||
                    if (testRowValue >= firstValue) {
 | 
			
		||||
                        return 0;
 | 
			
		||||
                    } else if (testRowValue < lastValue) {
 | 
			
		||||
                        return this.rows.length;
 | 
			
		||||
                    } else if (testRowValue === lastValue) {
 | 
			
		||||
                        // Maintain stable sort
 | 
			
		||||
                        return this.rows.length;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // Use a custom comparison function to support descending sort.
 | 
			
		||||
                        return lodashFunction(rows, testRow, (thisRow) => {
 | 
			
		||||
                            const thisRowValue = this.getValueForSortColumn(thisRow);
 | 
			
		||||
                            if (testRowValue === thisRowValue) {
 | 
			
		||||
                                return EQUAL;
 | 
			
		||||
                            } else if (testRowValue < thisRowValue) {
 | 
			
		||||
                                return LESS_THAN;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                return GREATER_THAN;
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                    return val1 >= val2 ? row1 : row2;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user