func NewIoTDBRpcDataSet()

in client/rpcdataset.go [55:157]


func NewIoTDBRpcDataSet(sql string, columnNameList []string, columnTypeList []string, columnNameIndex map[string]int32, ignoreTimestamp bool, moreData bool, queryId int64, statementId int64, client *rpc.IClientRPCServiceClient, sessionId int64, queryResult [][]byte, fetchSize int32, timeout *int64, zoneId string, timeFormat string, timeFactor int32, columnIndex2TsBlockColumnIndexList []int32) (rpcDataSet *IoTDBRpcDataSet, err error) {
	ds := &IoTDBRpcDataSet{
		sessionId:                        sessionId,
		statementId:                      statementId,
		ignoreTimestamp:                  ignoreTimestamp,
		sql:                              sql,
		queryId:                          queryId,
		client:                           client,
		fetchSize:                        fetchSize,
		timeout:                          timeout,
		moreData:                         moreData,
		columnSize:                       int32(len(columnNameList)),
		columnNameList:                   make([]string, 0, len(columnNameList)+1),
		columnTypeList:                   make([]string, 0, len(columnTypeList)+1),
		columnOrdinalMap:                 make(map[string]int32),
		columnName2TsBlockColumnIndexMap: make(map[string]int32),
	}
	columnStartIndex := int32(1)
	resultSetColumnSize := int32(len(columnNameList))
	// newly generated or updated columnIndex2TsBlockColumnIndexList.size() may not be equal to
	// columnNameList.size()
	// so we need startIndexForColumnIndex2TsBlockColumnIndexList to adjust the mapping relation
	startIndexForColumnIndex2TsBlockColumnIndexList := int32(0)

	// for Time Column in tree model which should always be the first column and its index for
	// TsBlockColumn is -1
	if !ignoreTimestamp {
		ds.columnNameList = append(ds.columnNameList, TimestampColumnName)
		ds.columnTypeList = append(ds.columnTypeList, "INT64")
		ds.columnName2TsBlockColumnIndexMap[TimestampColumnName] = -1
		ds.columnOrdinalMap[TimestampColumnName] = 1
		if columnIndex2TsBlockColumnIndexList != nil {
			newColumnIndex2TsBlockColumnIndexList := make([]int32, 0, len(columnIndex2TsBlockColumnIndexList)+1)
			newColumnIndex2TsBlockColumnIndexList = append(newColumnIndex2TsBlockColumnIndexList, -1)
			newColumnIndex2TsBlockColumnIndexList = append(newColumnIndex2TsBlockColumnIndexList, columnIndex2TsBlockColumnIndexList...)
			columnIndex2TsBlockColumnIndexList = newColumnIndex2TsBlockColumnIndexList
			startIndexForColumnIndex2TsBlockColumnIndexList = 1
		}
		columnStartIndex += 1
		resultSetColumnSize += 1
	}

	ds.columnNameList = append(ds.columnNameList, columnNameList...)
	ds.columnTypeList = append(ds.columnTypeList, columnTypeList...)

	if columnIndex2TsBlockColumnIndexList == nil {
		columnIndex2TsBlockColumnIndexList = make([]int32, 0, resultSetColumnSize)
		if !ignoreTimestamp {
			startIndexForColumnIndex2TsBlockColumnIndexList = 1
			columnIndex2TsBlockColumnIndexList = append(columnIndex2TsBlockColumnIndexList, -1)
		}
		for i := 0; i < len(columnNameList); i++ {
			columnIndex2TsBlockColumnIndexList = append(columnIndex2TsBlockColumnIndexList, int32(i))
		}
	}

	tsBlockColumnSize := int32(0)
	for _, value := range columnIndex2TsBlockColumnIndexList {
		if value > tsBlockColumnSize {
			tsBlockColumnSize = value
		}
	}
	tsBlockColumnSize += 1
	ds.dataTypeForTsBlockColumn = make([]TSDataType, tsBlockColumnSize)

	for i, columnName := range columnNameList {
		tsBlockColumnIndex := columnIndex2TsBlockColumnIndexList[startIndexForColumnIndex2TsBlockColumnIndexList+int32(i)]
		if tsBlockColumnIndex != -1 {
			columnType, err := GetDataTypeByStr(columnTypeList[i])
			if err != nil {
				return nil, err
			}
			ds.dataTypeForTsBlockColumn[tsBlockColumnIndex] = columnType
		}
		if _, exists := ds.columnName2TsBlockColumnIndexMap[columnName]; !exists {
			ds.columnOrdinalMap[columnName] = int32(i) + columnStartIndex
			ds.columnName2TsBlockColumnIndexMap[columnName] = tsBlockColumnIndex
		}
	}

	ds.queryResult = queryResult
	if queryResult != nil {
		ds.queryResultSize = int32(len(queryResult))
	} else {
		ds.queryResultSize = 0
	}
	ds.queryResultIndex = 0
	ds.tsBlockSize = 0
	ds.tsBlockIndex = -1
	if ds.zoneId, err = time.LoadLocation(zoneId); err != nil {
		return nil, err
	}
	ds.timeFormat = timeFormat
	ds.timeFactor = timeFactor
	if ds.timePrecision, err = getTimePrecision(timeFactor); err != nil {
		return nil, err
	}
	if len(columnIndex2TsBlockColumnIndexList) != len(ds.columnNameList) {
		return nil, fmt.Errorf("size of columnIndex2TsBlockColumnIndexList %v doesn't equal to size of columnNameList %v", len(columnIndex2TsBlockColumnIndexList), len(ds.columnNameList))
	}
	ds.columnIndex2TsBlockColumnIndexList = columnIndex2TsBlockColumnIndexList
	return ds, nil
}