Public/New-NexosisDataSet.ps1

Function New-NexosisDataSet {
<#
 .Synopsis
  This operation creates a new dataset or updates an existing dataset using data from a PSCustomObject.

 .Description
  This operation creates a new dataset using data provided in an object formatted as an Array of HashTables, like so:

    $data = @(
            @{
                timestamp = "2013-01-01T00:00:00+00:00"
                sales = "1500.56"
                transactions = "195.0"
            },
            @{
                timestamp = "2013-01-02T00:00:00+00:00"
                sales = "4078.52"
                transactions = "696.0"
            },
            @{
                timestamp = "2013-01-03T00:00:00+00:00"
                sales = "4545.69"
                transactions = "743.0"
            },
            @{
                timestamp = "2013-01-04T00:00:00+00:00"
                sales = "4872.63"
                transactions = "797.0"
            },
            @{
                timestamp = "2013-01-05T00:00:00+00:00"
                sales = "2420.81"
                transactions = "367.0"
            }
        )

  Optionally, metadata for the columns can be submitted to help describe the data being uploaded as a hashtable, for example:
  
  $columns = @{
            timestamp = @{
                dataType = "date"
                role = "timestamp"
                imputation = "zeroes"
                aggregation = "sum"
            }
            sales = @{
                dataType = "numeric"
                role = "target"
                imputation = $null
                aggregation = $null
            }
            transactions = @{
                dataType = "numeric"
                role = "none"
                imputation = "zeroes"
                aggregation = "sum"
            }
        }

  If the dataset already exists, adds rows to the dataset. If the specified data contains records with timestamps that
  already exist in the dataset, those records will be overwritten.

 .Parameter DataSetName
  Name of the dataset to create or which to add data
  
 .Parameter Data
  An object array containing data used to submit as a dataset.

  .Parameter ColumnMetaData
  A hashtable containing metadata that describes submitted data, such as data types and imputation and aggragation strategies.

 .Example
  # create a new dataset using an array of hashes containing 3 columns to submit
  New-NexosisDataSet -dataSetName 'new-data' -data `
    @(
        @{
            timestamp = "2013-01-01T00:00:00+00:00"
            sales = "1500.56"
            transactions = "195.0"
        }
           @{
            timestamp = "2013-01-02T00:00:00+00:00"
            sales = "4078.52"
            transactions = "696.0"
        },
        @{
            timestamp = "2013-01-03T00:00:00+00:00"
            sales = "4545.69"
            transactions = "743.0"
        },
        @{
            timestamp = "2013-01-04T00:00:00+00:00"
            sales = "4872.63"
            transactions = "797.0"
        },
        @{
            timestamp = "2013-01-05T00:00:00+00:00"
            sales = "2420.81"
            transactions = "367.0"
        }
    )

  .Example
  # Submit a dataset with a data array object and a columns metadata hashtable
  New-NexosisDataSet -dataSetName 'new-data' -data `
    @(
        @{
            timestamp = "2013-01-01T00:00:00+00:00"
            sales = "1500.56"
            transactions = "195.0"
        }
           @{
            timestamp = "2013-01-02T00:00:00+00:00"
            sales = "4078.52"
            transactions = "696.0"
        },
        @{
            timestamp = "2013-01-03T00:00:00+00:00"
            sales = "4545.69"
            transactions = "743.0"
        },
        @{
            timestamp = "2013-01-04T00:00:00+00:00"
            sales = "4872.63"
            transactions = "797.0"
        },
        @{
            timestamp = "2013-01-05T00:00:00+00:00"
            sales = "2420.81"
            transactions = "367.0"
        }
    ) `
    -columnMetaData `
    @{
        timestamp = @{
            dataType = "date"
            role = "timestamp"
            imputation = "zeroes"
            aggregation = "sum"
        }
        sales = @{
            dataType = "numeric"
            role = "target"
            imputation = $null
            aggregation = $null
        }
        transactions = @{
            dataType = "numeric"
            role = "none"
            imputation = "zeroes"
            aggregation = "sum"
        }
    }
#>
[CmdletBinding(SupportsShouldProcess=$true)]
    Param(
        [Parameter(Mandatory=$true, ValueFromPipeline=$True)]
        [string]$dataSetName,
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
        $data,
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
        $columnMetaData
    )
    process {

        if (($null -ne $data) -and ($data -isnot [System.Array])) {
            throw "Parameter '-data' must be an array of hashes."
        }

        if ($null -ne $columnMetaData -and $columnMetaData -isnot [Hashtable])
        {
            throw "Parameter '-columnMetaData' must be a hashtable of column metadata for the data."    
        }

        if($null -ne $data) {
            # Construct the object to send to the REST endpoint
            $dataSet = @{
                dataSetName = $dataSetName
                columns = $columnMetaData
                data =@(
                    $data
                )
            }
        } else {
            # Construct the object to send to the REST endpoint
            $dataSet = @{
                dataSetName = $dataSetName
                columns = $columnMetaData
            }
        }

        if ($dataSetName.Trim().Length -eq 0) { 
            throw "Argument '-DataSetName' cannot be null or empty."
        }

        if ($pscmdlet.ShouldProcess($dataSetName)) {
            Invoke-Http -method Put -path "data/$dataSetName" -Body ($dataSet | ConvertTo-Json -depth 6)
        }
    }
}