diff --git a/all_examples_helper_test.go b/all_examples_helper_test.go index d68e661..df913d3 100644 --- a/all_examples_helper_test.go +++ b/all_examples_helper_test.go @@ -19,7 +19,7 @@ func MustCreateTimeseriesWithColumns(alias string) (*HandleType, *TimeseriesEntr func MustCreateTimeseriesWithData(alias string) (*HandleType, *TimeseriesEntry) { h, timeseries := MustCreateTimeseriesWithColumns(alias) - blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, symbolColumns, err := timeseries.Columns() + blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, err := timeseries.Columns() if err != nil { panic(err) } @@ -31,7 +31,6 @@ func MustCreateTimeseriesWithData(alias string) (*HandleType, *TimeseriesEntry) int64Points := make([]TsInt64Point, count) stringPoints := make([]TsStringPoint, count) timestampPoints := make([]TsTimestampPoint, count) - symbolPoints := make([]TsSymbolPoint, count) for idx := int64(0); idx < count; idx++ { timestamps[idx] = time.Unix((idx+1)*10, 0) blobPoints[idx] = NewTsBlobPoint(timestamps[idx], []byte(fmt.Sprintf("content_%d", idx))) @@ -39,7 +38,6 @@ func MustCreateTimeseriesWithData(alias string) (*HandleType, *TimeseriesEntry) int64Points[idx] = NewTsInt64Point(timestamps[idx], idx) stringPoints[idx] = NewTsStringPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) timestampPoints[idx] = NewTsTimestampPoint(timestamps[idx], timestamps[idx]) - symbolPoints[idx] = NewTsSymbolPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) } err = blobColumns[0].Insert(blobPoints...) if err != nil { @@ -61,7 +59,7 @@ func MustCreateTimeseriesWithData(alias string) (*HandleType, *TimeseriesEntry) if err != nil { panic(err) } - err = symbolColumns[0].Insert(symbolPoints...) + err = stringColumns[1].Insert(stringPoints...) if err != nil { panic(err) } diff --git a/all_examples_test.go b/all_examples_test.go index ce1822e..65b77cd 100644 --- a/all_examples_test.go +++ b/all_examples_test.go @@ -138,7 +138,7 @@ func ExampleTimeseriesEntry_Columns() { defer h.Close() SetLogFile("qdb_api.examples.log") - blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, symbolColumns, err := timeseries.Columns() + blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, err := timeseries.Columns() if err != nil { // handle error } @@ -162,17 +162,13 @@ func ExampleTimeseriesEntry_Columns() { fmt.Println("column:", col.Name()) // do something like Insert, GetRanges with a timestamp column } - for _, col := range symbolColumns { - fmt.Println("column:", col.Name()) - // do something like Insert, GetRanges with a symbol column - } // Output: // column: series_column_blob // column: series_column_double // column: series_column_int64 // column: series_column_string - // column: series_column_timestamp // column: series_column_symbol + // column: series_column_timestamp } func ExampleTimeseriesEntry_ColumnsInfo() { diff --git a/entry_timeseries_blob_test.go b/entry_timeseries_blob_test.go index 032107d..73624ac 100644 --- a/entry_timeseries_blob_test.go +++ b/entry_timeseries_blob_test.go @@ -57,13 +57,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one blob column", func() { - cols, _, _, _, _, _, err := timeseries.Columns() + cols, _, _, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnBlob).To(Equal(cols[0].Type())) }) It("should retrieve one blob column", func() { - cols, _, _, _, _, _, err := timeseries.Columns() + cols, _, _, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) diff --git a/entry_timeseries_common.go b/entry_timeseries_common.go index dacef9e..2a2eb29 100644 --- a/entry_timeseries_common.go +++ b/entry_timeseries_common.go @@ -149,14 +149,13 @@ func oldColumnInfoArrayToSlice(columns *C.qdb_ts_column_info_t, length int) []C. return (*[(math.MaxInt32 - 1) / unsafe.Sizeof(C.qdb_ts_column_info_t{})]C.qdb_ts_column_info_t)(unsafe.Pointer(columns))[:length:length] } -func columnArrayToGo(entry TimeseriesEntry, columns *C.qdb_ts_column_info_ex_t, columnsCount C.qdb_size_t) ([]TsBlobColumn, []TsDoubleColumn, []TsInt64Column, []TsStringColumn, []TsTimestampColumn, []TsSymbolColumn) { +func columnArrayToGo(entry TimeseriesEntry, columns *C.qdb_ts_column_info_ex_t, columnsCount C.qdb_size_t) ([]TsBlobColumn, []TsDoubleColumn, []TsInt64Column, []TsStringColumn, []TsTimestampColumn) { length := int(columnsCount) blobColumns := []TsBlobColumn{} doubleColumns := []TsDoubleColumn{} int64Columns := []TsInt64Column{} stringColumns := []TsStringColumn{} timestampColumns := []TsTimestampColumn{} - symbolColumns := []TsSymbolColumn{} if length > 0 { slice := columnInfoArrayToSlice(columns, length) for _, s := range slice { @@ -166,20 +165,18 @@ func columnArrayToGo(entry TimeseriesEntry, columns *C.qdb_ts_column_info_ex_t, doubleColumns = append(doubleColumns, TsDoubleColumn{s.toStructG(entry)}) } else if s._type == C.qdb_ts_column_int64 { int64Columns = append(int64Columns, TsInt64Column{s.toStructG(entry)}) - } else if s._type == C.qdb_ts_column_string { + } else if s._type == C.qdb_ts_column_string || s._type == C.qdb_ts_column_symbol { stringColumns = append(stringColumns, TsStringColumn{s.toStructG(entry)}) } else if s._type == C.qdb_ts_column_timestamp { timestampColumns = append(timestampColumns, TsTimestampColumn{s.toStructG(entry)}) - } else if s._type == C.qdb_ts_column_symbol { - symbolColumns = append(symbolColumns, TsSymbolColumn{s.toStructG(entry)}) } } } - return blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, symbolColumns + return blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns } // Columns : return the current columns -func (entry TimeseriesEntry) Columns() ([]TsBlobColumn, []TsDoubleColumn, []TsInt64Column, []TsStringColumn, []TsTimestampColumn, []TsSymbolColumn, error) { +func (entry TimeseriesEntry) Columns() ([]TsBlobColumn, []TsDoubleColumn, []TsInt64Column, []TsStringColumn, []TsTimestampColumn, error) { alias := convertToCharStar(entry.alias) defer releaseCharStar(alias) var columns *C.qdb_ts_column_info_ex_t @@ -190,11 +187,10 @@ func (entry TimeseriesEntry) Columns() ([]TsBlobColumn, []TsDoubleColumn, []TsIn var int64Columns []TsInt64Column var stringColumns []TsStringColumn var timestampColumns []TsTimestampColumn - var symbolColumns []TsSymbolColumn if err == 0 { - blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, symbolColumns = columnArrayToGo(entry, columns, columnsCount) + blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns = columnArrayToGo(entry, columns, columnsCount) } - return blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, symbolColumns, makeErrorOrNil(err) + return blobColumns, doubleColumns, int64Columns, stringColumns, timestampColumns, makeErrorOrNil(err) } // ColumnsInfo : return the current columns information diff --git a/entry_timeseries_common_test.go b/entry_timeseries_common_test.go index aa5cc65..b45a5e8 100644 --- a/entry_timeseries_common_test.go +++ b/entry_timeseries_common_test.go @@ -27,7 +27,7 @@ var _ = Describe("Tests", func() { int64Column TsInt64Column stringColumn TsStringColumn timestampColumn TsTimestampColumn - symbolColumn TsSymbolColumn + symbolColumn TsStringColumn columnsInfo []TsColumnInfo ) const ( @@ -70,20 +70,19 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) }) It("should not work to get columns before creating the time series", func() { - _, _, _, _, _, _, err := timeseries.Columns() + _, _, _, _, _, err := timeseries.Columns() Expect(err).To(HaveOccurred()) }) It("should work with zero columns", func() { err := timeseries.Create(24*time.Hour, columnsInfo...) Expect(err).ToNot(HaveOccurred()) - blobCols, doubleCols, int64Cols, stringCols, timestampCols, symbolCols, err := timeseries.Columns() + blobCols, doubleCols, int64Cols, stringCols, timestampCols, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(0).To(Equal(len(blobCols))) Expect(0).To(Equal(len(doubleCols))) Expect(0).To(Equal(len(int64Cols))) Expect(0).To(Equal(len(stringCols))) Expect(0).To(Equal(len(timestampCols))) - Expect(0).To(Equal(len(symbolCols))) }) It("should work with a shard size of 1ms", func() { err := timeseries.Create(1*time.Millisecond, columnsInfo...) @@ -102,7 +101,6 @@ var _ = Describe("Tests", func() { int64Points []TsInt64Point stringPoints []TsStringPoint timestampPoints []TsTimestampPoint - symbolPoints []TsSymbolPoint ) BeforeEach(func() { timestamps = make([]time.Time, count) @@ -111,7 +109,6 @@ var _ = Describe("Tests", func() { int64Points = make([]TsInt64Point, count) stringPoints = make([]TsStringPoint, count) timestampPoints = make([]TsTimestampPoint, count) - symbolPoints = make([]TsSymbolPoint, count) for idx := int64(0); idx < count; idx++ { timestamps[idx] = time.Unix((idx+1)*10, 0) blobPoints[idx] = NewTsBlobPoint(timestamps[idx], []byte(fmt.Sprintf("content_%d", idx))) @@ -119,7 +116,6 @@ var _ = Describe("Tests", func() { int64Points[idx] = NewTsInt64Point(timestamps[idx], idx) stringPoints[idx] = NewTsStringPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) timestampPoints[idx] = NewTsTimestampPoint(timestamps[idx], timestamps[idx]) - symbolPoints[idx] = NewTsSymbolPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) } }) JustBeforeEach(func() { @@ -133,20 +129,19 @@ var _ = Describe("Tests", func() { symbolColumn = timeseries.SymbolColumn(columnsInfo[symbolIndex].Name(), symtableName) }) It("should have one column of each type", func() { - blobCols, doubleCols, int64Cols, stringCols, timestampCols, symbolCols, err := timeseries.Columns() + blobCols, doubleCols, int64Cols, stringCols, timestampCols, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(doubleCols))) Expect(1).To(Equal(len(blobCols))) Expect(1).To(Equal(len(int64Cols))) - Expect(1).To(Equal(len(stringCols))) + Expect(2).To(Equal(len(stringCols))) Expect(1).To(Equal(len(timestampCols))) - Expect(1).To(Equal(len(symbolCols))) Expect(TsColumnDouble).To(Equal(doubleCols[0].Type())) Expect(TsColumnBlob).To(Equal(blobCols[0].Type())) Expect(TsColumnInt64).To(Equal(int64Cols[0].Type())) Expect(TsColumnString).To(Equal(stringCols[0].Type())) Expect(TsColumnTimestamp).To(Equal(timestampCols[0].Type())) - Expect(TsColumnSymbol).To(Equal(symbolCols[0].Type())) + Expect(TsColumnSymbol).To(Equal(stringCols[1].Type())) }) Context("Insert Columns", func() { It("should work to insert new columns", func() { @@ -190,7 +185,7 @@ var _ = Describe("Tests", func() { bulk, err := timeseries.Bulk() Expect(err).ToNot(HaveOccurred()) for i := int64(0); i < count; i++ { - err := bulk.Row(time.Now()).Blob(blobValue).Double(doubleValue).Int64(int64Value).String(stringValue).Timestamp(timestampValue).Symbol(symbolValue).Append() + err := bulk.Row(time.Now()).Blob(blobValue).Double(doubleValue).Int64(int64Value).String(stringValue).Timestamp(timestampValue).String(symbolValue).Append() Expect(err).ToNot(HaveOccurred()) } _, err = bulk.Push() @@ -201,7 +196,7 @@ var _ = Describe("Tests", func() { bulk, err := timeseries.Bulk(columnsInfo...) Expect(err).ToNot(HaveOccurred()) for i := int64(0); i < count; i++ { - err := bulk.Row(time.Now()).Blob(blobValue).Double(doubleValue).Int64(int64Value).String(stringValue).Timestamp(timestampValue).Symbol(symbolValue).Append() + err := bulk.Row(time.Now()).Blob(blobValue).Double(doubleValue).Int64(int64Value).String(stringValue).Timestamp(timestampValue).String(symbolValue).Append() Expect(err).ToNot(HaveOccurred()) } _, err = bulk.Push() @@ -263,7 +258,7 @@ var _ = Describe("Tests", func() { int64Column.Insert(int64Points...) stringColumn.Insert(stringPoints...) timestampColumn.Insert(timestampPoints...) - symbolColumn.Insert(symbolPoints...) + symbolColumn.Insert(stringPoints...) }) It("Should work to get all values", func() { bulk, err := timeseries.Bulk() @@ -298,9 +293,9 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(timestampPoints[bulk.RowCount()].Content()).To(Equal(timestampValue)) - symbolValue, err := bulk.GetSymbol() + symbolValue, err := bulk.GetString() Expect(err).ToNot(HaveOccurred()) - Expect(symbolPoints[bulk.RowCount()].Content()).To(Equal(symbolValue)) + Expect(stringPoints[bulk.RowCount()].Content()).To(Equal(symbolValue)) } Expect(err).To(Equal(ErrIteratorEnd)) bulk.Release() @@ -385,7 +380,7 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) err = tsBatch.RowSetTimestamp(timestampIndex, timestampValue) Expect(err).ToNot(HaveOccurred()) - err = tsBatch.RowSetSymbol(symbolIndex, symbolValue) + err = tsBatch.RowSetString(symbolIndex, symbolValue) Expect(err).ToNot(HaveOccurred()) }) It("should append columns and ignore fields", func() { @@ -424,7 +419,7 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) err = tsBatch.RowSetTimestamp(timestampIndex, timestampValue) Expect(err).ToNot(HaveOccurred()) - err = tsBatch.RowSetSymbol(symbolIndex, symbolValue) + err = tsBatch.RowSetString(symbolIndex, symbolValue) Expect(err).ToNot(HaveOccurred()) }) It("should push", func() { @@ -479,7 +474,7 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) err = tsBatch.RowSetTimestamp(timestampIndex, timestampValue) Expect(err).ToNot(HaveOccurred()) - err = tsBatch.RowSetSymbol(symbolIndex, symbolValue) + err = tsBatch.RowSetString(symbolIndex, symbolValue) Expect(err).ToNot(HaveOccurred()) }) It("should push", func() { diff --git a/entry_timeseries_double_test.go b/entry_timeseries_double_test.go index 24e524f..adf77ed 100644 --- a/entry_timeseries_double_test.go +++ b/entry_timeseries_double_test.go @@ -56,13 +56,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one double column", func() { - _, cols, _, _, _, _, err := timeseries.Columns() + _, cols, _, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnDouble).To(Equal(cols[0].Type())) }) It("should retrieve one double column", func() { - _, cols, _, _, _, _, err := timeseries.Columns() + _, cols, _, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) diff --git a/entry_timeseries_int64_test.go b/entry_timeseries_int64_test.go index 68f6126..86d1887 100644 --- a/entry_timeseries_int64_test.go +++ b/entry_timeseries_int64_test.go @@ -56,13 +56,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one int64 column", func() { - _, _, cols, _, _, _, err := timeseries.Columns() + _, _, cols, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnInt64).To(Equal(cols[0].Type())) }) It("should retrieve one int64 column", func() { - _, _, cols, _, _, _, err := timeseries.Columns() + _, _, cols, _, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) diff --git a/entry_timeseries_string.go b/entry_timeseries_string.go index a4247b8..3fb8870 100644 --- a/entry_timeseries_string.go +++ b/entry_timeseries_string.go @@ -90,6 +90,11 @@ func (entry TimeseriesEntry) StringColumn(columnName string) TsStringColumn { return TsStringColumn{tsColumn{NewTsColumnInfo(columnName, TsColumnString), entry}} } +// SymbolColumn : create a column object (the symbol table name is not set) +func (entry TimeseriesEntry) SymbolColumn(columnName string, symtableName string) TsStringColumn { + return TsStringColumn{tsColumn{NewSymbolColumnInfo(columnName, symtableName), entry}} +} + // Insert string points into a timeseries func (column TsStringColumn) Insert(points ...TsStringPoint) error { alias := convertToCharStar(column.parent.alias) diff --git a/entry_timeseries_string_test.go b/entry_timeseries_string_test.go index 42a85ee..fd71a3b 100644 --- a/entry_timeseries_string_test.go +++ b/entry_timeseries_string_test.go @@ -57,13 +57,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one string column", func() { - _, _, _, cols, _, _, err := timeseries.Columns() + _, _, _, cols, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnString).To(Equal(cols[0].Type())) }) It("should retrieve one string column", func() { - _, _, _, cols, _, _, err := timeseries.Columns() + _, _, _, cols, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) diff --git a/entry_timeseries_symbol.go b/entry_timeseries_symbol.go deleted file mode 100644 index e1fb3c0..0000000 --- a/entry_timeseries_symbol.go +++ /dev/null @@ -1,276 +0,0 @@ -package qdb - -/* - #include - #include -*/ -import "C" -import ( - "math" - "time" - "unsafe" -) - -// TsSymbolPoint : timestamped symbol -type TsSymbolPoint struct { - timestamp time.Time - content string -} - -// Timestamp : return data point timestamp -func (t TsSymbolPoint) Timestamp() time.Time { - return t.timestamp -} - -// Content : return data point content -func (t TsSymbolPoint) Content() string { - return t.content -} - -// NewTsSymbolPoint : Create new timeseries symbol point -func NewTsSymbolPoint(timestamp time.Time, value string) TsSymbolPoint { - return TsSymbolPoint{timestamp, value} -} - -// :: internals -func (t TsSymbolPoint) toStructC() C.qdb_ts_symbol_point { - dataSize := C.qdb_size_t(len(t.content)) - data := convertToCharStar(string(t.content)) - return C.qdb_ts_symbol_point{toQdbTimespec(t.timestamp), data, dataSize} -} - -func (t C.qdb_ts_symbol_point) toStructG() TsSymbolPoint { - return TsSymbolPoint{t.timestamp.toStructG(), C.GoStringN(t.content, C.int(t.content_length))} -} - -func symbolPointArrayToC(pts ...TsSymbolPoint) *C.qdb_ts_symbol_point { - if len(pts) == 0 { - return nil - } - points := make([]C.qdb_ts_symbol_point, len(pts)) - for idx, pt := range pts { - points[idx] = pt.toStructC() - } - return &points[0] -} - -func releaseSymbolPointArray(points *C.qdb_ts_symbol_point, length int) { - if length > 0 { - slice := symbolPointArrayToSlice(points, length) - for _, s := range slice { - C.free(unsafe.Pointer(s.content)) - } - } -} - -func symbolPointArrayToSlice(points *C.qdb_ts_symbol_point, length int) []C.qdb_ts_symbol_point { - // See https://github.com/mattn/go-sqlite3/issues/238 for details. - return (*[(math.MaxInt32 - 1) / unsafe.Sizeof(C.qdb_ts_symbol_point{})]C.qdb_ts_symbol_point)(unsafe.Pointer(points))[:length:length] -} - -func symbolPointArrayToGo(points *C.qdb_ts_symbol_point, pointsCount C.qdb_size_t) []TsSymbolPoint { - length := int(pointsCount) - output := make([]TsSymbolPoint, length) - if length > 0 { - slice := symbolPointArrayToSlice(points, length) - for i, s := range slice { - output[i] = s.toStructG() - } - } - return output -} - -// TsSymbolColumn : a time series symbol column -type TsSymbolColumn struct { - tsColumn -} - -// SymbolColumn : create a column object (the symbol table name is not set) -func (entry TimeseriesEntry) SymbolColumn(columnName string, symtableName string) TsSymbolColumn { - return TsSymbolColumn{tsColumn{NewSymbolColumnInfo(columnName, symtableName), entry}} -} - -// Insert symbol points into a timeseries -func (column TsSymbolColumn) Insert(points ...TsSymbolPoint) error { - alias := convertToCharStar(column.parent.alias) - defer releaseCharStar(alias) - columnName := convertToCharStar(column.name) - defer releaseCharStar(columnName) - contentCount := C.qdb_size_t(len(points)) - content := symbolPointArrayToC(points...) - defer releaseSymbolPointArray(content, len(points)) - err := C.qdb_ts_symbol_insert(column.parent.handle, alias, columnName, content, contentCount) - return makeErrorOrNil(err) -} - -// EraseRanges : erase all points in the specified ranges -func (column TsSymbolColumn) EraseRanges(rgs ...TsRange) (uint64, error) { - alias := convertToCharStar(column.parent.alias) - defer releaseCharStar(alias) - columnName := convertToCharStar(column.name) - defer releaseCharStar(columnName) - ranges := rangeArrayToC(rgs...) - rangesCount := C.qdb_size_t(len(rgs)) - erasedCount := C.qdb_uint_t(0) - err := C.qdb_ts_erase_ranges(column.parent.handle, alias, columnName, ranges, rangesCount, &erasedCount) - return uint64(erasedCount), makeErrorOrNil(err) -} - -// GetRanges : Retrieves symbols in the specified range of the time series column. -// It is an error to call this function on a non existing time-series. -func (column TsSymbolColumn) GetRanges(rgs ...TsRange) ([]TsSymbolPoint, error) { - alias := convertToCharStar(column.parent.alias) - defer releaseCharStar(alias) - columnName := convertToCharStar(column.name) - defer releaseCharStar(columnName) - ranges := rangeArrayToC(rgs...) - rangesCount := C.qdb_size_t(len(rgs)) - var points *C.qdb_ts_symbol_point - var pointsCount C.qdb_size_t - err := C.qdb_ts_symbol_get_ranges(column.parent.handle, alias, columnName, ranges, rangesCount, &points, &pointsCount) - - if err == 0 { - defer column.parent.Release(unsafe.Pointer(points)) - return symbolPointArrayToGo(points, pointsCount), nil - } - return nil, ErrorType(err) -} - -// TsSymbolAggregation : Aggregation of double type -type TsSymbolAggregation struct { - kind TsAggregationType - rng TsRange - count int64 - point TsSymbolPoint -} - -// Type : returns the type of the aggregation -func (t TsSymbolAggregation) Type() TsAggregationType { - return t.kind -} - -// Range : returns the range of the aggregation -func (t TsSymbolAggregation) Range() TsRange { - return t.rng -} - -// Count : returns the number of points aggregated into the result -func (t TsSymbolAggregation) Count() int64 { - return t.count -} - -// Result : result of the aggregation -func (t TsSymbolAggregation) Result() TsSymbolPoint { - return t.point -} - -// NewSymbolAggregation : Create new timeseries string aggregation -func NewSymbolAggregation(kind TsAggregationType, rng TsRange) *TsSymbolAggregation { - return &TsSymbolAggregation{kind, rng, 0, TsSymbolPoint{}} -} - -// :: internals -func (t TsSymbolAggregation) toStructC() C.qdb_ts_symbol_aggregation_t { - var cAgg C.qdb_ts_symbol_aggregation_t - cAgg._type = C.qdb_ts_aggregation_type_t(t.kind) - cAgg._range = t.rng.toStructC() - cAgg.count = C.qdb_size_t(t.count) - cAgg.result = t.point.toStructC() - return cAgg -} - -func (t C.qdb_ts_symbol_aggregation_t) toStructG() TsSymbolAggregation { - var gAgg TsSymbolAggregation - gAgg.kind = TsAggregationType(t._type) - gAgg.rng = t._range.toStructG() - gAgg.count = int64(t.count) - gAgg.point = t.result.toStructG() - return gAgg -} - -func symbolAggregationArrayToC(ags ...*TsSymbolAggregation) *C.qdb_ts_symbol_aggregation_t { - if len(ags) == 0 { - return nil - } - var symbolAggregations []C.qdb_ts_symbol_aggregation_t - for _, ag := range ags { - symbolAggregations = append(symbolAggregations, ag.toStructC()) - } - return &symbolAggregations[0] -} - -func symbolAggregationArrayToSlice(aggregations *C.qdb_ts_symbol_aggregation_t, length int) []C.qdb_ts_symbol_aggregation_t { - // See https://github.com/mattn/go-sqlite3/issues/238 for details. - return (*[(math.MaxInt32 - 1) / unsafe.Sizeof(C.qdb_ts_symbol_aggregation_t{})]C.qdb_ts_symbol_aggregation_t)(unsafe.Pointer(aggregations))[:length:length] -} - -func symbolAggregationArrayToGo(aggregations *C.qdb_ts_symbol_aggregation_t, aggregationsCount C.qdb_size_t, aggs []*TsSymbolAggregation) []TsSymbolAggregation { - length := int(aggregationsCount) - output := make([]TsSymbolAggregation, length) - if length > 0 { - slice := symbolAggregationArrayToSlice(aggregations, length) - for i, s := range slice { - *aggs[i] = s.toStructG() - output[i] = s.toStructG() - } - } - return output -} - -// Aggregate : Aggregate a sub-part of the time series. -// It is an error to call this function on a non existing time-series. -func (column TsSymbolColumn) Aggregate(aggs ...*TsSymbolAggregation) ([]TsSymbolAggregation, error) { - alias := convertToCharStar(column.parent.alias) - defer releaseCharStar(alias) - columnName := convertToCharStar(column.name) - defer releaseCharStar(columnName) - aggregations := symbolAggregationArrayToC(aggs...) - aggregationsCount := C.qdb_size_t(len(aggs)) - var output []TsSymbolAggregation - err := C.qdb_ts_symbol_aggregate(column.parent.handle, alias, columnName, aggregations, aggregationsCount) - if err == 0 { - output = symbolAggregationArrayToGo(aggregations, aggregationsCount, aggs) - } - return output, makeErrorOrNil(err) -} - -// Symbol : adds a symbol in row transaction -func (t *TsBulk) Symbol(content string) *TsBulk { - contentSize := C.qdb_size_t(len(content)) - contentPtr := convertToCharStar(content) - defer releaseCharStar(contentPtr) - if t.err == nil { - t.err = makeErrorOrNil(C.qdb_ts_row_set_symbol(t.table, C.qdb_size_t(t.index), contentPtr, contentSize)) - } - t.index++ - return t -} - -// GetSymbol : gets a symbol in row -func (t *TsBulk) GetSymbol() (string, error) { - var content *C.char - defer t.h.Release(unsafe.Pointer(content)) - var contentLength C.qdb_size_t - err := C.qdb_ts_row_get_symbol(t.table, C.qdb_size_t(t.index), &content, &contentLength) - - t.index++ - return C.GoStringN(content, C.int(contentLength)), makeErrorOrNil(err) -} - -// RowSetSymbol : Set symbol at specified index in current row -func (t *TsBatch) RowSetSymbol(index int64, content string) error { - valueIndex := C.qdb_size_t(index) - contentSize := C.qdb_size_t(len(content)) - contentPtr := convertToCharStar(content) - defer releaseCharStar(contentPtr) - return makeErrorOrNil(C.qdb_ts_batch_row_set_symbol(t.table, valueIndex, contentPtr, contentSize)) -} - -// RowSetSymbolNoCopy : Set symbol at specified index in current row without copying it -func (t *TsBatch) RowSetSymbolNoCopy(index int64, content string) error { - valueIndex := C.qdb_size_t(index) - contentSize := C.qdb_size_t(len(content)) - contentPtr := convertToCharStar(content) - defer releaseCharStar(contentPtr) - return makeErrorOrNil(C.qdb_ts_batch_row_set_symbol_no_copy(t.table, valueIndex, contentPtr, contentSize)) -} diff --git a/entry_timeseries_symbol_test.go b/entry_timeseries_symbol_test.go index 5583c50..da67bed 100644 --- a/entry_timeseries_symbol_test.go +++ b/entry_timeseries_symbol_test.go @@ -23,12 +23,12 @@ var _ = Describe("Tests", func() { Context("Timeseries - Symbol", func() { var ( timeseries TimeseriesEntry - column TsSymbolColumn + column TsStringColumn columnInfo TsColumnInfo timestamps []time.Time - points []TsSymbolPoint + points []TsStringPoint r TsRange - aggs []*TsSymbolAggregation + aggs []*TsStringAggregation value string ) const ( @@ -39,14 +39,14 @@ var _ = Describe("Tests", func() { BeforeEach(func() { columnInfo = NewSymbolColumnInfo("column", symtable) timestamps = make([]time.Time, count) - points = make([]TsSymbolPoint, count) + points = make([]TsStringPoint, count) for idx := int64(0); idx < count; idx++ { timestamps[idx] = time.Unix((idx+1)*10, 0) - points[idx] = NewTsSymbolPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) + points[idx] = NewTsStringPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) } - aggFirst := NewSymbolAggregation(AggFirst, r) - aggLast := NewSymbolAggregation(AggLast, r) - aggs = []*TsSymbolAggregation{aggFirst, aggLast} + aggFirst := NewStringAggregation(AggFirst, r) + aggLast := NewStringAggregation(AggLast, r) + aggs = []*TsStringAggregation{aggFirst, aggLast} value = "content" r = NewRange(timestamps[start], timestamps[end].Add(5*time.Nanosecond)) @@ -59,13 +59,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one symbol column", func() { - _, _, _, _, _, cols, err := timeseries.Columns() + _, _, _, cols, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnSymbol).To(Equal(cols[0].Type())) }) It("should retrieve one symbol column", func() { - _, _, _, _, _, cols, err := timeseries.Columns() + _, _, _, cols, _, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) @@ -74,7 +74,7 @@ var _ = Describe("Tests", func() { column.Insert(points...) }) It("should not return an error when attempting to insert empty array of symbol points", func() { - err := column.Insert([]TsSymbolPoint{}...) + err := column.Insert([]TsStringPoint{}...) Expect(err).ToNot(HaveOccurred()) }) Context("with points inserted", func() { @@ -90,7 +90,7 @@ var _ = Describe("Tests", func() { It("should get the first and last symbol points", func() { r1 := NewRange(timestamps[start].Truncate(5*time.Nanosecond), timestamps[start].Add(5*time.Nanosecond)) r2 := NewRange(timestamps[end].Truncate(5*time.Nanosecond), timestamps[end].Add(5*time.Nanosecond)) - pts := []TsSymbolPoint{points[start], points[end]} + pts := []TsStringPoint{points[start], points[end]} results, err := column.GetRanges(r1, r2) Expect(err).ToNot(HaveOccurred()) Expect(results).To(ConsistOf(pts)) @@ -98,10 +98,10 @@ var _ = Describe("Tests", func() { It("should get empty symbol points with empty range array", func() { results, err := column.GetRanges() Expect(err).ToNot(HaveOccurred()) - Expect(results).To(ConsistOf([]TsSymbolPoint{})) + Expect(results).To(ConsistOf([]TsStringPoint{})) }) It("should create a symbol aggregation", func() { - agg := NewSymbolAggregation(AggMin, r) + agg := NewStringAggregation(AggMin, r) Expect(AggMin).To(Equal(agg.Type())) Expect(r).To(Equal(agg.Range())) }) @@ -111,7 +111,7 @@ var _ = Describe("Tests", func() { }) It("should get first symbol with symbol aggregation", func() { first := points[start] - aggs, err := column.Aggregate(NewSymbolAggregation(AggFirst, r)) + aggs, err := column.Aggregate(NewStringAggregation(AggFirst, r)) Expect(err).ToNot(HaveOccurred()) Expect(first).To(Equal(aggs[0].Result())) }) @@ -163,7 +163,7 @@ var _ = Describe("Tests", func() { bulk, err := timeseries.Bulk() Expect(err).ToNot(HaveOccurred()) for i := int64(0); i < count; i++ { - err := bulk.Row(time.Now()).Symbol(value).Append() + err := bulk.Row(time.Now()).String(value).Append() Expect(err).ToNot(HaveOccurred()) } _, err = bulk.Push() @@ -199,7 +199,7 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(timestamps[bulk.RowCount()]).To(Equal(timestamp)) - value, err := bulk.GetSymbol() + value, err := bulk.GetString() Expect(err).ToNot(HaveOccurred()) Expect(points[bulk.RowCount()].Content()).To(Equal(value)) @@ -230,7 +230,7 @@ var _ = Describe("Tests", func() { It("should append symbol column", func() { err = tsBatch.StartRow(timestamp) Expect(err).ToNot(HaveOccurred()) - err = tsBatch.RowSetSymbol(0, value) + err = tsBatch.RowSetString(0, value) Expect(err).ToNot(HaveOccurred()) }) It("should fail to append any other columns type than symbol", func() { @@ -247,7 +247,7 @@ var _ = Describe("Tests", func() { JustBeforeEach(func() { err = tsBatch.StartRow(timestamp) Expect(err).ToNot(HaveOccurred()) - err := tsBatch.RowSetSymbol(0, value) + err := tsBatch.RowSetString(0, value) Expect(err).ToNot(HaveOccurred()) }) It("should push", func() { @@ -264,7 +264,7 @@ var _ = Describe("Tests", func() { JustBeforeEach(func() { err = tsBatch.StartRow(timestamp) Expect(err).ToNot(HaveOccurred()) - err := tsBatch.RowSetSymbol(0, value) + err := tsBatch.RowSetString(0, value) Expect(err).ToNot(HaveOccurred()) }) It("should push fast", func() { diff --git a/entry_timeseries_timestamp_test.go b/entry_timeseries_timestamp_test.go index 84b8a76..a9fabf7 100644 --- a/entry_timeseries_timestamp_test.go +++ b/entry_timeseries_timestamp_test.go @@ -56,13 +56,13 @@ var _ = Describe("Tests", func() { timeseries.Remove() }) It("should have one timestamp column", func() { - _, _, _, _, cols, _, err := timeseries.Columns() + _, _, _, _, cols, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(TsColumnTimestamp).To(Equal(cols[0].Type())) }) It("should retrieve one timestamp column", func() { - _, _, _, _, cols, _, err := timeseries.Columns() + _, _, _, _, cols, err := timeseries.Columns() Expect(err).ToNot(HaveOccurred()) Expect(1).To(Equal(len(cols))) Expect(column.Type()).To(Equal(cols[0].Type())) diff --git a/query.go b/query.go index d52ef2c..c29745a 100644 --- a/query.go +++ b/query.go @@ -30,12 +30,6 @@ package qdb *length = result->payload.string.content_length; } - void get_symbol_from_payload(const qdb_point_result_t *result, const char ** content, qdb_size_t *length) - { - *content = result->payload.symbol.content; - *length = result->payload.symbol.content_length; - } - qdb_timespec_t get_timestamp_from_payload(const qdb_point_result_t * result) { @@ -66,7 +60,6 @@ const ( QueryResultBlob QueryResultValueType = C.qdb_query_result_blob QueryResultInt64 QueryResultValueType = C.qdb_query_result_int64 QueryResultString QueryResultValueType = C.qdb_query_result_string - QueryResultSymbol QueryResultValueType = C.qdb_query_result_symbol QueryResultTimestamp QueryResultValueType = C.qdb_query_result_timestamp QueryResultCount QueryResultValueType = C.qdb_query_result_count ) @@ -101,13 +94,6 @@ func getStringUnsafe(result *C.qdb_point_result_t) string { return C.GoStringN(content, C.int(contentLength)) } -func getSymbolUnsafe(result *C.qdb_point_result_t) string { - var content *C.char - var contentLength C.qdb_size_t - C.get_symbol_from_payload(result, &content, &contentLength) - return C.GoStringN(content, C.int(contentLength)) -} - // Get : retrieve the raw interface func (r *QueryPoint) Get() QueryPointResult { result := (*C.qdb_point_result_t)(unsafe.Pointer(r)) @@ -122,8 +108,6 @@ func (r *QueryPoint) Get() QueryPointResult { output.value = int64(C.get_int64_from_payload(result)) case C.qdb_query_result_string: output.value = getStringUnsafe(result) - case C.qdb_query_result_symbol: - output.value = getSymbolUnsafe(result) case C.qdb_query_result_timestamp: output.value = C.get_timestamp_from_payload(result).toStructG() case C.qdb_query_result_count: @@ -168,15 +152,6 @@ func (r *QueryPoint) GetString() (string, error) { return "", makeErrorOrNil(C.qdb_e_operation_not_permitted) } -// GetSymbol : retrieve a symbol from the interface -func (r *QueryPoint) GetSymbol() (string, error) { - if r._type == C.qdb_query_result_symbol { - result := (*C.qdb_point_result_t)(unsafe.Pointer(r)) - return getSymbolUnsafe(result), nil - } - return "", makeErrorOrNil(C.qdb_e_operation_not_permitted) -} - // GetTimestamp : retrieve a timestamp from the interface func (r *QueryPoint) GetTimestamp() (time.Time, error) { result := (*C.qdb_point_result_t)(unsafe.Pointer(r)) diff --git a/query_test.go b/query_test.go index b460596..e3df5d5 100644 --- a/query_test.go +++ b/query_test.go @@ -20,7 +20,7 @@ var _ = Describe("Tests", func() { int64Column TsInt64Column stringColumn TsStringColumn timestampColumn TsTimestampColumn - symbolColumn TsSymbolColumn + symbolColumn TsStringColumn columnsInfo []TsColumnInfo timestamps []time.Time @@ -29,7 +29,7 @@ var _ = Describe("Tests", func() { int64Points []TsInt64Point stringPoints []TsStringPoint timestampPoints []TsTimestampPoint - symbolPoints []TsSymbolPoint + symbolPoints []TsStringPoint ) const ( count int64 = 8 @@ -66,7 +66,7 @@ var _ = Describe("Tests", func() { int64Points = make([]TsInt64Point, count) stringPoints = make([]TsStringPoint, count) timestampPoints = make([]TsTimestampPoint, count) - symbolPoints = make([]TsSymbolPoint, count) + symbolPoints = make([]TsStringPoint, count) for idx := int64(0); idx < count; idx++ { timestamps[idx] = time.Unix((idx+1)*10, 0) blobPoints[idx] = NewTsBlobPoint(timestamps[idx], []byte(fmt.Sprintf("content_%d", idx))) @@ -74,7 +74,7 @@ var _ = Describe("Tests", func() { int64Points[idx] = NewTsInt64Point(timestamps[idx], idx) stringPoints[idx] = NewTsStringPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) timestampPoints[idx] = NewTsTimestampPoint(timestamps[idx], timestamps[idx]) - symbolPoints[idx] = NewTsSymbolPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) + symbolPoints[idx] = NewTsStringPoint(timestamps[idx], fmt.Sprintf("content_%d", idx)) } err := timeseries.Create(24*time.Hour, columnsInfo...) @@ -132,7 +132,7 @@ var _ = Describe("Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(timestampValue).To(Equal(timestampPoints[rowIdx].Content())) - symbolValue, err := columns[symbolIndex+2].GetSymbol() + symbolValue, err := columns[symbolIndex+2].GetString() Expect(err).ToNot(HaveOccurred()) Expect(symbolValue).To(Equal(symbolPoints[rowIdx].Content())) @@ -164,10 +164,6 @@ var _ = Describe("Tests", func() { value := point.Value() Expect(err).ToNot(HaveOccurred()) Expect(value).To(Equal(timestampPoints[rowIdx].Content())) - case QueryResultSymbol: - value := point.Value() - Expect(err).ToNot(HaveOccurred()) - Expect(value).To(Equal(symbolPoints[rowIdx].Content())) } } }