KevinStephenson
Adding in weaviate code
b110593
raw
history blame
2.32 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package moduletools
type ObjectDiff struct {
oldVec []float32
oldPropValues map[string]interface{}
newPropValues map[string]interface{}
}
func NewObjectDiff(oldVec []float32) *ObjectDiff {
return &ObjectDiff{
oldVec: oldVec,
oldPropValues: map[string]interface{}{},
newPropValues: map[string]interface{}{},
}
}
func (od *ObjectDiff) WithProp(propName string, oldValue, newValue interface{}) *ObjectDiff {
od.oldPropValues[propName] = oldValue
od.newPropValues[propName] = newValue
return od
}
func (od *ObjectDiff) GetVec() []float32 {
return od.oldVec
}
func (od *ObjectDiff) IsChangedProp(propName string) bool {
oldVal, oldExists := od.oldPropValues[propName]
newVal, newExists := od.newPropValues[propName]
if !oldExists && !newExists {
return false
}
if !(oldExists && newExists) {
return true
}
// only strings are vectorized, therefore property changes are determined
// on values of types string, []string and []interface{} which are in fact strings
switch o := oldVal.(type) {
case string:
if n, ok := newVal.(string); ok {
return n != o
}
case []string:
if ns, ok := newVal.([]string); ok {
if len(ns) != len(o) {
return true
}
for i := range o {
if ns[i] != o[i] {
return true
}
}
return false
} else if ni, ok := newVal.([]interface{}); ok {
if len(ni) != len(o) {
return true
}
for i := range o {
if ni[i] != o[i] {
return true
}
}
return false
}
case []interface{}:
if ns, ok := newVal.([]string); ok {
if len(ns) != len(o) {
return true
}
for i := range o {
if ns[i] != o[i] {
return true
}
}
return false
} else if ni, ok := newVal.([]interface{}); ok {
if len(ni) != len(o) {
return true
}
for i := range o {
if ni[i] != o[i] {
return true
}
}
return false
}
}
return true
}