# 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

```typescript
var dataFrame = NodeInputReader.inputAsDataFrame();
for (var i = 0; i < dataFrame.rowCount(); i++) {
    var row = dataFrame.row(i);
    var objectId = row.getString("object_id");
    var display = row.getString("display");
}
```

```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;
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.b2winsuite.com/6.1/scripting/types-and-objects/objects/suitetable.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
