# SuiteTable

SuiteTable provides utility methods for managing and manipulating tables and columns using [Tablesaw Framework](https://github.com/jtablesaw/tablesaw).

Steps of Creating a Table:

1. **Create Table:** use SuiteTable's create method: `SuiteTable.create("tablename")`
2. **Define Columns:** use SuiteTable's addStringColumn(), addIntColumn(), addDateColumn()...  to add columns to Table

`table.`addStringColumn`("columnName")`

3. **Define Rows** as maps: `var row = { "column1": "field1", "column2": "field2" }`
4. **Add Rows to Table**: use SuiteTable's addRow method: `table.addRow(row);`

```typescript
// create a new table
var table = SuiteTable.create("MyTable");

// add columns to table
table.addStringColumn("Name");
table.addIntColumn("age");
table.addInstantColumn("joined");
table.addDateTimeColumn("birthday");
table.addBooleanColumn("customer");

// define two rows
var row1 = {
  "Name": "tony",
  "age": 20,
  "joined": Instant.now(),
  "birthday": LocalDateTime.now(),
  "customer": true
};

var row2 = {
  "Name" : "Mark",
  "age": 20,
  "joined": Instant.parse("2023-10-20T12:00:00Z"),
  "birthday": LocalDateTime.of(2023, 10, 24, 15, 30),
  "customer": false
};

// add rows to table
table.addRow(row1);
table.addRow(row2);

return table;
```

***

### Adding Columns

Adding a column to a table is done with a single methods: add\<type>Column.

*Note: The columns appear in the table in the order they were added.*

ColumnTypes supported: **String, Intger, Double, Boolean, Instant, DateTime, Date, Time, and Instant.**

#### `addStringColumn(columnName: String): void`

Add a StringColumn with the specified name to a Table instance.

**Parameters:**

* `columnName` (Type: String) - The name of the StringColumn.

**Example:**

```javascript
table.addStringColumn("Name");
```

***

#### `addIntColumn(columnName: String): void`

Add an IntColumn with the specified name to a Table instance.

**Parameters:**

* `columnName` (Type: String) - The name of the IntColumn.

**Example:**

```javascript
table.addIntColumn("Age");
```

***

#### `addDoubleColumn(columnName: String): void`

Add a DoubleColumn with the specified name to a Table instance.

**Parameters:**

* `columnName` (Type: String) - The name of the DoubleColumn.

**Example:**

```javascript
table.addDoubleColumn("GPA");
```

Similarly for the rest of the ColumnTypes.

***

### Adding Rows

*Note: The rows appear in the table in the order they were added.*

To add row, you first need to have already created an instance of Class Table and at least one column. Then you can define a row a time as follows: A hashmap with column title and row value

```typescript
var row = { "column1": value1, 
            "column2": value2, 
            "column3": value3, 
            ...
          };
```

Then, you can add the row to your table using the addRow method:

#### `addRow(HashMap<String, Object> row): Row`

Add a row of data to the table instance and return the row.

**Parameters:**

* `row` (Type: HashMap\<String, Object>) - A map representing the data to be added to the row.

**Example:**

```javascript
var row1 = { // HashMap
  "Name" : "Mark",
  "age": 20,
  "joined": instant,
  "birthday": datetime,
  "customer": true
};

table.addRow(row1);
```

***

### Table Information

Methods for retreiving table information such as table name, column names, list of rows.

#### `name(): String`

Get the name of the table.

**Returns:**

* A String representing the name of the table.

**Example:**

```javascript
var tableName = table.name();
```

***

#### `getColumnNames(): List<String>`

Get the list of column names in the table.

**Returns:**

* A List\<String> representing the column names.

**Example:**

```javascript
var columnNames = table.getColumnNames();
```

***

#### `columnCount(): Integer`

Get the number of columns in the table.

**Returns:**

* An Integer representing the total number of columns in the table.

**Example:**

```javascript
var numofcolumns = table.columnCount();
```

**Note**: Replace placeholder content with actual information related to your `SuiteTable`class. Feel free to add more details or examples based on your specific use cases.

***

#### `rowCount(): Integer`

Get the number of rows in the table.

**Returns:**

* An Integer representing the total number of rows in the table.

**Example:**

```javascript
var numofrows= table.rowCount();
```

**Note**: Replace placeholder content with actual information related to your `SuiteTable` class. Feel free to add more details or examples based on your specific use cases.

***

`columnIndex(columnName: String): Integer` - Returns the index of a column by name.

```typescript
var table = SuiteTable.create("MyTable");

table.addStringColumn("key"); // column index 0
table.addDoubleColumn("rate"); // column index 1
table.addStringColumn("lastUpdate"); // column iondex 2

// Specify the column name you want to find the index for
var columnIndex = table.columnIndex("rate");

// Get the index of the column by name
var columnIndex = originalTable.columnIndex(columnNameToFind);

// columnIndex is 1
```

***

`row(rowIndex: Integer): Row` - Returns the `Row` object at the specified index.

```typescript
var rowIndex = 3; // Example index
var row = table.row(rowIndex);
```

***

`where(selection: Selection): Table` - Returns a new table containing rows that match the selection criteria.

```typescript
var selection = table.stringColumn("Name").isEqualTo("Alice");
var filteredTable = table.where(selection);

return filteredTable;
// filteredTable now has one row: Alice: 25
```

***

`stringColumn(columnIndex: Integer): StringColumn` - Returns a `StringColumn` for the specified column.

```typescript
// Specify the index of the column for which you want to get a StringColumn
var columnIndex = 3; // Replace with the actual index

// Get the StringColumn for the specified column index
var stringColumn = originalTable.stringColumn(columnIndex);
```

***

`first(nRows: Integer): Table` - Returns a new table containing the first `nRows` of data.

```typescript
var first10Rows = table.first(10);
```

***

`last(nRows: Integer): Table` - Returns a new table containing the last `nRows` of data.

```typescript
// Specify the number of rows you want to retrieve from the end
var nRows = 5; // Replace with the actual number of rows you need

// Get a new table containing the last nRows of data
var lastTable = originalTable.last(nRows);
```

***

`inRange(rowStart: Integer, rowEnd: Integer): Table` - Returns a new table containing rows within the specified range.

```typescript
// Specify the range of rows you want to extract
var rowStart = 2; // Replace with the actual starting row index
var rowEnd = 6;   // Replace with the actual ending row index

// Get a new table containing rows within the specified range
var rangeTable = originalTable.inRange(rowStart, rowEnd);
```

***

`sortOn(columnIndex: Integer): Table` - Sorts the table based on the specified column index.

```typescript
var sortedTable = table.sortOn(columnIndex);
```

***

`removeColumns(...columnIndex: Integer[]): Table` - Removes specified columns from the table.

```typescript
var columnsToRemove = [1, 3]; // Example column indices to remove
var modifiedTable = table.removeColumns(...columnsToRemove);
```

***

`emptyCopy(): Table` - Returns a table with the same columns but no data.

```typescript
var emptyCopy = table.emptyCopy();
```

***

`sampleX(proportion: Double): Table` - Returns a table with a sample based on the given proportion.

```typescript
var proportion = 0.2; // Example proportion
var sampledTable = table.sampleX(proportion);
```

***

`sampleN(nRows: Integer): Table` - Returns a table with a random sample of the specified number of rows.

```typescript
var numRowsToSample = 5; // Example number of rows to sample
var sampledTable = table.sampleN(numRowsToSample);
```

***

`summary(): Table` - Returns a table containing summary statistics for the columns in the relation.

```typescript
var summaryTable = table.summary();
```

***

### Examples

```javascript
// Retrieve exchange rates from the API
var request = HttpUtil.get("https://boi.org.il/PublicApi/GetExchangeRates");
var jsonContent = JsonUtil.parse(request.asString().getBody());
var exchanges = jsonContent.exchangeRates;

// Create a table to store the data
var table = SuiteTable.create("MyTable");
table.addStringColumn("key");
table.addDoubleColumn("rate");
table.addStringColumn("lastUpdate");

// Populate the table with data from the API
for (var i = 0; i < exchanges.size(); i++) {
    var item = exchanges[i];
    var key = item.key.asText();
    var rate = item.currentExchangeRate.asDouble();
    var date = item.lastUpdate.asText();
    
    var row = {
        "key": key,
        "rate": rate,
        "lastUpdate": date
    };
    

    table.addRow(row);
}

// Filter table with some type of selection example:
var selection = table.stringColumn("key").isEqualTo("USD");
var filteredTable = table.where(selection);

// Return the filtered table
return filteredTable;
```
