mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
* first cut at pre-sort command that works on ndjson * finish pre_sort command for CSV and JSON and add test * try fixing golangci-lint * remove some dumb lint checks * more linter disabling * take .golangci.yml from previous repo * go fmt (facepalm) * remove ioutil to fix lint
309 lines
6.3 KiB
Go
309 lines
6.3 KiB
Go
package kafka
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/featurebasedb/featurebase/v3/idk"
|
|
"github.com/go-avro/avro"
|
|
)
|
|
|
|
func TestIdkSchemaToAvroRecordSchema(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
name string
|
|
field idk.Field
|
|
fields []idk.Field
|
|
schemaField []*avro.SchemaField
|
|
expRecordSchema string
|
|
expErr string
|
|
}{
|
|
{
|
|
name: "string field ttl",
|
|
fields: []idk.Field{
|
|
idk.StringField{
|
|
NameVal: "a",
|
|
DestNameVal: "a",
|
|
Quantum: "YMD",
|
|
TTL: "11s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "a",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.StringSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "0",
|
|
"cacheType": "",
|
|
"mutex": false,
|
|
"quantum": "YMD",
|
|
"ttl": "11s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "string field bad ttl",
|
|
fields: []idk.Field{
|
|
idk.StringField{
|
|
NameVal: "b",
|
|
DestNameVal: "b",
|
|
Quantum: "YMD",
|
|
TTL: "bad-ttl",
|
|
},
|
|
},
|
|
expRecordSchema: "bad-ttl-no-recordSchema",
|
|
expErr: "unable to parse TTL",
|
|
},
|
|
{
|
|
name: "string field ttl without quantum",
|
|
fields: []idk.Field{
|
|
idk.StringField{
|
|
NameVal: "c",
|
|
DestNameVal: "c",
|
|
TTL: "12s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "c",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.StringSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "50000",
|
|
"cacheType": "ranked",
|
|
"mutex": false,
|
|
"quantum": "",
|
|
"ttl": "0s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "id field ttl",
|
|
fields: []idk.Field{
|
|
idk.IDField{
|
|
NameVal: "d",
|
|
DestNameVal: "d",
|
|
Quantum: "YMD",
|
|
TTL: "13s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "d",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.LongSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "0",
|
|
"cacheType": "",
|
|
"mutex": false,
|
|
"quantum": "YMD",
|
|
"ttl": "13s",
|
|
"fieldType": "id",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "id field ttl without quantum",
|
|
fields: []idk.Field{
|
|
idk.IDField{
|
|
NameVal: "e",
|
|
DestNameVal: "e",
|
|
TTL: "14s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "e",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.LongSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "50000",
|
|
"cacheType": "ranked",
|
|
"mutex": false,
|
|
"quantum": "",
|
|
"ttl": "0s",
|
|
"fieldType": "id",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "string array field ttl",
|
|
fields: []idk.Field{
|
|
idk.StringArrayField{
|
|
NameVal: "f",
|
|
DestNameVal: "f",
|
|
Quantum: "YMD",
|
|
TTL: "15s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "f",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.ArraySchema{
|
|
Items: &avro.StringSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "0",
|
|
"cacheType": "",
|
|
"quantum": "YMD",
|
|
"ttl": "15s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "string array field ttl without quantum",
|
|
fields: []idk.Field{
|
|
idk.StringArrayField{
|
|
NameVal: "g",
|
|
DestNameVal: "g",
|
|
TTL: "16s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "g",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.ArraySchema{
|
|
Items: &avro.StringSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "50000",
|
|
"cacheType": "ranked",
|
|
"quantum": "",
|
|
"ttl": "0s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "id array field ttl",
|
|
fields: []idk.Field{
|
|
idk.IDArrayField{
|
|
NameVal: "h",
|
|
DestNameVal: "h",
|
|
Quantum: "YMD",
|
|
TTL: "17s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "h",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.ArraySchema{
|
|
Items: &avro.LongSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "0",
|
|
"cacheType": "",
|
|
"quantum": "YMD",
|
|
"ttl": "17s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
{
|
|
name: "id array field ttl without quantum",
|
|
fields: []idk.Field{
|
|
idk.IDArrayField{
|
|
NameVal: "i",
|
|
DestNameVal: "i",
|
|
TTL: "18s",
|
|
},
|
|
},
|
|
schemaField: []*avro.SchemaField{
|
|
{
|
|
Name: "i",
|
|
Type: &avro.UnionSchema{
|
|
Types: []avro.Schema{
|
|
&avro.NullSchema{},
|
|
&avro.ArraySchema{
|
|
Items: &avro.LongSchema{
|
|
Properties: map[string]interface{}{
|
|
"cacheSize": "50000",
|
|
"cacheType": "ranked",
|
|
"quantum": "",
|
|
"ttl": "0s",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expErr: "",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
testRecordSchema := &avro.RecordSchema{
|
|
Name: "idk_datagen",
|
|
Namespace: "idk.datagen",
|
|
Doc: "idk-datagen",
|
|
}
|
|
if test.expRecordSchema == "bad-ttl-no-recordSchema" {
|
|
testRecordSchema = nil
|
|
} else {
|
|
testRecordSchema.Fields = test.schemaField
|
|
}
|
|
|
|
field, err := idkSchemaToAvroRecordSchema(test.fields)
|
|
if !reflect.DeepEqual(field, testRecordSchema) {
|
|
t.Errorf("expected field: '%v', got: '%v'", testRecordSchema, field)
|
|
}
|
|
if err != nil && !strings.Contains(err.Error(), test.expErr) {
|
|
t.Errorf("expected error: '%s', got: '%s'", test.expErr, err.Error())
|
|
}
|
|
})
|
|
}
|
|
}
|