Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ 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 | |
} | |