protected dataComparer()

in src/Explorer/Tables/DataTable/TableEntityListViewModel.ts [314:374]


  protected dataComparer(
    item1: Entities.ITableEntity,
    item2: Entities.ITableEntity,
    sortOrder: any[],
    oSettings: any,
  ): number {
    var sort: any;
    var itemA: any;
    var itemB: any;
    var length: number = $.isArray(sortOrder) ? sortOrder.length : 0; // sortOrder can be null
    var rowA: Entities.ITableEntity = item1;
    var rowB: Entities.ITableEntity = item2;

    for (var k = 0; k < length; k++) {
      sort = sortOrder[k];
      var col = oSettings.aoColumns[sort.column].mData;

      // If the value is null or undefined, show them at last
      var isItem1NullOrUndefined = _.isNull(rowA[col]) || _.isUndefined(rowA[col]);
      var isItem2NullOrUndefined = _.isNull(rowB[col]) || _.isUndefined(rowB[col]);

      if (isItem1NullOrUndefined || isItem2NullOrUndefined) {
        if (isItem1NullOrUndefined && isItem2NullOrUndefined) {
          return 0;
        }
        return isItem1NullOrUndefined ? 1 : -1;
      }

      switch ((<any>rowA[col]).$) {
        case Constants.TableType.Int32:
        case Constants.TableType.Int64:
        case Constants.CassandraType.Int:
        case Constants.CassandraType.Bigint:
        case Constants.CassandraType.Smallint:
        case Constants.CassandraType.Varint:
        case Constants.CassandraType.Tinyint:
          itemA = parseInt(<string>(<any>rowA[col])._, 0);
          itemB = parseInt(<string>(<any>rowB[col])._, 0);
          break;
        case Constants.TableType.Double:
        case Constants.CassandraType.Double:
        case Constants.CassandraType.Float:
        case Constants.CassandraType.Decimal:
          itemA = parseFloat(<string>(<any>rowA[col])._);
          itemB = parseFloat(<string>(<any>rowB[col])._);
          break;
        case Constants.TableType.DateTime:
          itemA = new Date(<string>(<any>rowA[col])._);
          itemB = new Date(<string>(<any>rowB[col])._);
          break;
        default:
          itemA = <string>(<any>rowA[col])._?.toLowerCase();
          itemB = <string>(<any>rowB[col])._?.toLowerCase();
      }
      var compareResult: number = itemA < itemB ? -1 : itemA > itemB ? 1 : 0;
      if (compareResult !== 0) {
        return sort.dir === "asc" ? compareResult : -compareResult;
      }
    }
    return 0;
  }