mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-16 04:37:21 +08:00
fix: add GetInputForm for string_transform (#16900)
### Summary As title: #### merge: <img width="2972" height="1473" alt="image" src="https://github.com/user-attachments/assets/2171e31f-13f4-4799-a6d0-1b9326210658" /> --- #### split <img width="858" height="416" alt="image" src="https://github.com/user-attachments/assets/f89d39e3-da85-4349-a53c-e27a17cc9dfa" />
This commit is contained in:
@@ -181,6 +181,61 @@ func (s *StringTransformComponent) Inputs() map[string]string {
|
||||
return out
|
||||
}
|
||||
|
||||
func (s *StringTransformComponent) GetInputForm() map[string]any {
|
||||
if s.param.Method == "split" {
|
||||
return map[string]any{
|
||||
"line": map[string]any{
|
||||
"name": "String",
|
||||
"type": "line",
|
||||
},
|
||||
}
|
||||
}
|
||||
out := make(map[string]any)
|
||||
for k, o := range getInputElementsFromText(s.param.Script) {
|
||||
name, _ := o["name"].(string)
|
||||
if name == "" {
|
||||
name = k
|
||||
}
|
||||
out[k] = map[string]any{
|
||||
"name": name,
|
||||
"type": "line",
|
||||
}
|
||||
}
|
||||
if len(out) == 0 {
|
||||
return nil
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func getInputElementsFromText(txt string) map[string]map[string]any {
|
||||
res := make(map[string]map[string]any)
|
||||
for _, match := range runtime.VarRefPattern.FindAllStringSubmatch(txt, -1) {
|
||||
if len(match) < 2 {
|
||||
continue
|
||||
}
|
||||
exp := match[1]
|
||||
if _, ok := res[exp]; ok {
|
||||
continue
|
||||
}
|
||||
cpnID, varName := "", exp
|
||||
if at := strings.Index(exp, "@"); at > 0 {
|
||||
cpnID = exp[:at]
|
||||
varName = exp[at+1:]
|
||||
}
|
||||
name := exp
|
||||
if cpnID != "" {
|
||||
name = cpnID + "@" + varName
|
||||
}
|
||||
res[exp] = map[string]any{
|
||||
"name": name,
|
||||
"value": nil,
|
||||
"_retrieval": nil,
|
||||
"_cpn_id": cpnID,
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// Outputs returns the transformed payload.
|
||||
func (s *StringTransformComponent) Outputs() map[string]string {
|
||||
return map[string]string{
|
||||
|
||||
@@ -173,3 +173,77 @@ func TestStringTransform_Registered(t *testing.T) {
|
||||
t.Errorf("Name()=%q, want StringTransform", c.Name())
|
||||
}
|
||||
}
|
||||
|
||||
func TestStringTransform_GetInputFormSplit(t *testing.T) {
|
||||
c, err := NewStringTransformComponent(map[string]any{
|
||||
"method": "split",
|
||||
"delimiters": []string{","},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("NewStringTransformComponent: %v", err)
|
||||
}
|
||||
|
||||
got := c.(*StringTransformComponent).GetInputForm()
|
||||
want := map[string]any{
|
||||
"line": map[string]any{
|
||||
"name": "String",
|
||||
"type": "line",
|
||||
},
|
||||
}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("GetInputForm split = %#v, want %#v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStringTransform_GetInputFormMerge(t *testing.T) {
|
||||
c, err := NewStringTransformComponent(map[string]any{
|
||||
"method": "merge",
|
||||
"delimiters": []string{","},
|
||||
"script": "{{sys.query}} - {{CodeExec:Run@result}} - {{sys.query}}",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("NewStringTransformComponent: %v", err)
|
||||
}
|
||||
|
||||
got := c.(*StringTransformComponent).GetInputForm()
|
||||
want := map[string]any{
|
||||
"sys.query": map[string]any{
|
||||
"name": "sys.query",
|
||||
"type": "line",
|
||||
},
|
||||
"CodeExec:Run@result": map[string]any{
|
||||
"name": "CodeExec:Run@result",
|
||||
"type": "line",
|
||||
},
|
||||
}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("GetInputForm merge = %#v, want %#v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetInputElementsFromText(t *testing.T) {
|
||||
got := getInputElementsFromText("{{ sys.query }} {{env.foo}} {{Node_1@answer.text}} {{sys.query}}")
|
||||
want := map[string]map[string]any{
|
||||
"sys.query": {
|
||||
"name": "sys.query",
|
||||
"value": nil,
|
||||
"_retrieval": nil,
|
||||
"_cpn_id": "",
|
||||
},
|
||||
"env.foo": {
|
||||
"name": "env.foo",
|
||||
"value": nil,
|
||||
"_retrieval": nil,
|
||||
"_cpn_id": "",
|
||||
},
|
||||
"Node_1@answer.text": {
|
||||
"name": "Node_1@answer.text",
|
||||
"value": nil,
|
||||
"_retrieval": nil,
|
||||
"_cpn_id": "Node_1",
|
||||
},
|
||||
}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("getInputElementsFromText = %#v, want %#v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user