Skip to content

Commit

Permalink
Use bytes instead of string internally.
Browse files Browse the repository at this point in the history
  • Loading branch information
notbdu committed Mar 6, 2019
1 parent b9cc347 commit c8ee351
Show file tree
Hide file tree
Showing 81 changed files with 2,696 additions and 1,192 deletions.
15 changes: 8 additions & 7 deletions calculation/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/xichen2020/eventdb/document/field"
"github.com/xichen2020/eventdb/generated/proto/servicepb"
"github.com/xichen2020/eventdb/x/bytes"
)

// Result represents a merge-able calculation result. In simple cases this can be simply
Expand All @@ -34,7 +35,7 @@ type Result interface {

var (
nan = math.NaN()
emptyString string
emptyString []byte

errMergingDifferentResultTypes = errors.New("merging calculation results with different result types")
)
Expand Down Expand Up @@ -173,7 +174,7 @@ func (r *minNumberResult) MarshalJSON() ([]byte, error) { return json.Marshal(r.

type minStringResult struct {
hasValues bool
v string
v []byte
}

// NewMinStringResult creates a new minimum string result.
Expand All @@ -187,7 +188,7 @@ func (r *minStringResult) Add(v ValueUnion) {
r.v = v.StringVal
return
}
if r.v > v.StringVal {
if bytes.GreaterThan(r.v, v.StringVal) {
r.v = v.StringVal
}
}
Expand All @@ -204,7 +205,7 @@ func (r *minStringResult) MergeInPlace(other Result) error {
*r = *or
return nil
}
if r.v > or.v {
if bytes.GreaterThan(r.v, or.v) {
r.v = or.v
}
return nil
Expand Down Expand Up @@ -269,7 +270,7 @@ func (r *maxNumberResult) MarshalJSON() ([]byte, error) { return json.Marshal(r.

type maxStringResult struct {
hasValues bool
v string
v []byte
}

// NewMaxStringResult creates a new maximum string result.
Expand All @@ -283,7 +284,7 @@ func (r *maxStringResult) Add(v ValueUnion) {
r.v = v.StringVal
return
}
if r.v < v.StringVal {
if bytes.LessThan(r.v, v.StringVal) {
r.v = v.StringVal
}
}
Expand All @@ -300,7 +301,7 @@ func (r *maxStringResult) MergeInPlace(other Result) error {
*r = *or
return nil
}
if r.v < or.v {
if bytes.LessThan(r.v, or.v) {
r.v = or.v
}
return nil
Expand Down
14 changes: 8 additions & 6 deletions calculation/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import (

"github.com/xichen2020/eventdb/document/field"
"github.com/xichen2020/eventdb/generated/proto/servicepb"
"github.com/xichen2020/eventdb/x/bytes"
"github.com/xichen2020/eventdb/x/compare"
"github.com/xichen2020/eventdb/x/safe"
)

// ValueType is the type of a calculation value.
Expand All @@ -27,7 +29,7 @@ var (
type ValueUnion struct {
Type ValueType
NumberVal float64
StringVal string
StringVal []byte
}

// NewValueFromProto creates a value from protobuf message.
Expand All @@ -39,7 +41,7 @@ func NewValueFromProto(pbValue servicepb.CalculationValue) (ValueUnion, error) {
v.NumberVal = pbValue.NumberVal
case servicepb.CalculationValue_STRING:
v.Type = StringType
v.StringVal = pbValue.StringVal
v.StringVal = []byte(pbValue.StringVal)
default:
return v, fmt.Errorf("invalid protobuf calculation value type %v", pbValue.Type)
}
Expand All @@ -56,7 +58,7 @@ func (u ValueUnion) MarshalJSON() ([]byte, error) {
}
return json.Marshal(u.NumberVal)
case StringType:
return json.Marshal(u.StringVal)
return json.Marshal(safe.ToString(u.StringVal))
default:
return nil, fmt.Errorf("unexpected value type %v", u.Type)
}
Expand All @@ -73,7 +75,7 @@ func (u ValueUnion) ToProto() servicepb.CalculationValue {
case StringType:
return servicepb.CalculationValue{
Type: servicepb.CalculationValue_STRING,
StringVal: u.StringVal,
StringVal: safe.ToString(u.StringVal),
}
default:
panic(fmt.Errorf("unexpected calculation value type %v", u.Type))
Expand All @@ -86,7 +88,7 @@ func NewNumberUnion(v float64) ValueUnion {
}

// NewStringUnion creates a new string union.
func NewStringUnion(v string) ValueUnion {
func NewStringUnion(v []byte) ValueUnion {
return ValueUnion{Type: StringType, StringVal: v}
}

Expand All @@ -107,7 +109,7 @@ func CompareValue(v1, v2 ValueUnion) (int, error) {
case NumberType:
return compare.DoubleCompare(v1.NumberVal, v2.NumberVal), nil
case StringType:
return compare.StringCompare(v1.StringVal, v2.StringVal), nil
return bytes.Compare(v1.StringVal, v2.StringVal), nil
}
panic("should never reach here")
}
Expand Down
12 changes: 0 additions & 12 deletions digest/digest_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions document/field/field_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ func TestNewValuesLessThan(t *testing.T) {
v1 := Values{
{
Type: StringType,
StringVal: "foo",
StringVal: []byte("foo"),
},
{
Type: IntType,
Expand All @@ -25,7 +25,7 @@ func TestNewValuesLessThan(t *testing.T) {
v2 := Values{
{
Type: StringType,
StringVal: "foo",
StringVal: []byte("foo"),
},
{
Type: IntType,
Expand All @@ -50,7 +50,7 @@ func TestFilterValues(t *testing.T) {
v := Values{
{
Type: StringType,
StringVal: "foo",
StringVal: []byte("foo"),
},
{
Type: IntType,
Expand Down Expand Up @@ -82,7 +82,7 @@ func TestArrayBasedIterator(t *testing.T) {
},
{
Path: []string{"baz"},
Value: NewStringUnion("blah"),
Value: NewStringUnion([]byte("blah")),
},
}
it := NewArrayBasedIterator(fields, nil)
Expand Down
19 changes: 10 additions & 9 deletions document/field/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"math"

"github.com/xichen2020/eventdb/generated/proto/servicepb"
"github.com/xichen2020/eventdb/x/bytes"
"github.com/xichen2020/eventdb/x/compare"
"github.com/xichen2020/eventdb/x/safe"

Expand Down Expand Up @@ -137,7 +138,7 @@ type ValueUnion struct {
BoolVal bool
IntVal int
DoubleVal float64
StringVal string
StringVal []byte
TimeNanosVal int64
}

Expand All @@ -156,7 +157,7 @@ type IntAsUnionFn func(v int) ValueUnion
type DoubleAsUnionFn func(v float64) ValueUnion

// StringAsUnionFn converts a string to a value union.
type StringAsUnionFn func(v string) ValueUnion
type StringAsUnionFn func(v []byte) ValueUnion

// TimeAsUnionFn converts a time to a value union.
type TimeAsUnionFn func(v int64) ValueUnion
Expand All @@ -178,7 +179,7 @@ func NewValueFromProto(pbValue servicepb.FieldValue) (ValueUnion, error) {
v.DoubleVal = pbValue.DoubleVal
case servicepb.FieldValue_STRING:
v.Type = StringType
v.StringVal = safe.ToString(pbValue.StringVal)
v.StringVal = pbValue.StringVal
case servicepb.FieldValue_TIME:
v.Type = TimeType
v.TimeNanosVal = pbValue.TimeNanosVal
Expand Down Expand Up @@ -213,7 +214,7 @@ func NewDoubleUnion(v float64) ValueUnion {
}

// NewStringUnion creates a new string union.
func NewStringUnion(v string) ValueUnion {
func NewStringUnion(v []byte) ValueUnion {
return ValueUnion{
Type: StringType,
StringVal: v,
Expand All @@ -240,7 +241,7 @@ func (v ValueUnion) MarshalJSON() ([]byte, error) {
case DoubleType:
return json.Marshal(v.DoubleVal)
case StringType:
return json.Marshal(v.StringVal)
return json.Marshal(safe.ToString(v.StringVal))
case TimeType:
return json.Marshal(v.TimeNanosVal)
default:
Expand All @@ -265,7 +266,7 @@ func (v *ValueUnion) ToProto() (servicepb.FieldValue, error) {
fb.DoubleVal = v.DoubleVal
case StringType:
fb.Type = servicepb.FieldValue_STRING
fb.StringVal = safe.ToBytes(v.StringVal)
fb.StringVal = v.StringVal
case TimeType:
fb.Type = servicepb.FieldValue_TIME
fb.TimeNanosVal = v.TimeNanosVal
Expand Down Expand Up @@ -296,7 +297,7 @@ func (v *ValueUnion) Equal(other *ValueUnion) bool {
case DoubleType:
return v.DoubleVal == other.DoubleVal
case StringType:
return v.StringVal == other.StringVal
return bytes.Equal(v.StringVal, other.StringVal)
case TimeType:
return v.TimeNanosVal == other.TimeNanosVal
}
Expand Down Expand Up @@ -324,7 +325,7 @@ func (v *ValueUnion) Hash() uint64 {
// NB(xichen): Hashing on bit patterns for doubles might be problematic.
return 31*hash + math.Float64bits(v.DoubleVal)
case StringType:
return 31*hash + xxhash.Sum64(safe.ToBytes(v.StringVal))
return 31*hash + xxhash.Sum64(v.StringVal)
case TimeType:
return 31*hash + uint64(v.TimeNanosVal)
}
Expand Down Expand Up @@ -354,7 +355,7 @@ func CompareValue(v1, v2 ValueUnion) (int, error) {
case DoubleType:
return compare.DoubleCompare(v1.DoubleVal, v2.DoubleVal), nil
case StringType:
return compare.StringCompare(v1.StringVal, v2.StringVal), nil
return bytes.Compare(v1.StringVal, v2.StringVal), nil
case TimeType:
return compare.TimeCompare(v1.TimeNanosVal, v2.TimeNanosVal), nil
default:
Expand Down
2 changes: 1 addition & 1 deletion document/field/value_extract_bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import "testing"
var (
benchStringValue = ValueUnion{
Type: StringType,
StringVal: "foo",
StringVal: []byte("foo"),
}
benchIntValue = ValueUnion{
Type: IntType,
Expand Down
13 changes: 7 additions & 6 deletions filter/filter_op.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/xichen2020/eventdb/document/field"
"github.com/xichen2020/eventdb/generated/proto/servicepb"
"github.com/xichen2020/eventdb/index"
"github.com/xichen2020/eventdb/x/bytes"
)

// Op represents a filter operator.
Expand Down Expand Up @@ -346,26 +347,26 @@ func (f Op) IntMaybeInRange(min, max, filterVal int) bool {
// If this returns false, it means filterVal is definitely not within the value range [min, max].
// If this returns true, it doesn't necessarily mean the filterVal exists in the values that this
// filter is acting on.
func (f Op) StringMaybeInRange(min, max, filterVal string) bool {
func (f Op) StringMaybeInRange(min, max, filterVal []byte) bool {
switch f {
case Equals, StartsWith:
if filterVal > max || filterVal < min {
if bytes.GreaterThan(filterVal, max) || bytes.LessThan(filterVal, min) {
return false
}
case LargerThan:
if filterVal >= max {
if bytes.GreaterThanOrEqual(filterVal, max) {
return false
}
case LargerThanOrEqual:
if filterVal > max {
if bytes.GreaterThan(filterVal, max) {
return false
}
case SmallerThan:
if filterVal <= min {
if bytes.LessThanOrEqual(filterVal, min) {
return false
}
case SmallerThanOrEqual:
if filterVal < min {
if bytes.LessThan(filterVal, min) {
return false
}
}
Expand Down
Loading

0 comments on commit c8ee351

Please sign in to comment.