Browse Source

Change initialization state

* Flow: SetRegistry is now UseRegistry
* Variable WIP
luis 7 years ago
parent
commit
1f102be086

+ 1 - 0
TODO.md

@@ -2,6 +2,7 @@
 
 ## Ideas
 
+* Make editor importable to any vue UI
 * Consider adding f.Err again
 
 * [ ] FlowServer: Maintain flow to keep variables

+ 1 - 1
browser/vue-flow/src/assets/default-theme.css

@@ -15,7 +15,7 @@
   --secondary-inverse: #fff;
   --node-label: #fff;
   --node-socket: #444;
-  --node-socket--withvalue: #44F;
+  --node-socket--withvalue: #44f;
   --link-hover: #f00;
   --selector-background: rgba(0, 0, 200, 0.1);
   --selector-color: var(--primary);

+ 5 - 37
browser/vue-flow/src/assets/doc/readme.md

@@ -38,10 +38,12 @@ func main() {
 	f := flow.New()
 	f.SetRegistry(r)
 
-	op1, _ := f.Op("Split", "hello world", " ")
-	op2, _ := f.Op("Join", op1, ",")
+	op := f.Op("Join",
+		f.Op("Split", "hello world", " "),
+		",",
+	)
 
-	res, err := op2.Process()
+	res, err := op.Process()
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -116,40 +118,6 @@ registry.Describer(
 ![fig4](img/runningsplit.jpg)
 ![fig5](img/runningjoin.jpg)
 
-## Without UI
-
-```go
-package main
-
-import (
-	"flow"
-	"flow/registry"
-	"log"
-	"strings"
-)
-
-func main() {
-
-	r := registry.New()
-	r.Add(strings.Split, strings.Join)
-
-	f := flow.New()
-	f.SetRegistry(r)
-
-	op := f.Op("Join",
-		f.Op("Split", "hello world", " "),
-		",",
-	)
-
-	res, err := op.Process()
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Println("res:", res)
-
-}
-```
-
 ---
 
 > WIP

+ 1 - 1
browser/vue-flow/src/store/flow/default-registry.js

@@ -7,7 +7,7 @@ export default{
   },
   'Variable': {
     categories: ['core'],
-    inputs: [{type: 'interface {}', name: 'initial'}],
+    inputs: [{type: 'string', name: 'name'}, {type: 'interface {}', name: 'initial'}],
     output: {type: 'interface {}'},
     style: { color: '#88a', shape: 'circle' }
   },

+ 1 - 1
browser/vue-flow/src/store/flow/state.js

@@ -9,7 +9,7 @@ export default {
   nodeInspect: {},
 
   registry: {},
-  activity: {},
+  activity: {nodes: []},
 
   notifications: []
 }

+ 1 - 1
browser/vue-flow/src/store/ws.js

@@ -87,7 +87,7 @@ export default store => {
     store.dispatch(flow.NOTIFICATION_ADD, v.data)
   })
   flowService.on('sessionJoin', (v) => {
-    store.dispatch(flow.NOTIFICATION_ADD, 'Connected')
+    // store.dispatch(flow.NOTIFICATION_ADD, 'Connected')
     const sessId = v.id
     store.dispatch(chat.CHAT_JOIN, {
       handle: store.state.chat.handle,

+ 4 - 2
go/src/demos/cmd/demo1/gonumops/gonumops.go

@@ -3,6 +3,7 @@ package gonumops
 import (
 	"flow"
 	"flow/registry"
+	"log"
 	"math"
 	"math/rand"
 
@@ -67,8 +68,9 @@ func logistic(a Tensor) Tensor {
 	// Should be a vector perhaps
 	r, c := a.Dims()
 	ret := mat.NewDense(r, c, nil)
-	for ; c >= 0; c-- {
-		for ; r >= 0; r-- {
+	log.Println("Dimentions", r, c)
+	for c--; c >= 0; c-- {
+		for r--; r >= 0; r-- {
 			ret.Set(r, c, activator(a.At(r, c)))
 		}
 	}

+ 11 - 4
go/src/demos/cmd/noui/flow.go

@@ -13,14 +13,21 @@ func main() {
 	r.Add(strings.Split, strings.Join)
 
 	f := flow.New()
-	f.SetRegistry(r)
+	f.UseRegistry(r)
 
-	op := f.Op("Join",
+	first := f.Op("Join",
 		f.Op("Split", "hello world", " "),
-		",",
+		"|",
 	)
 
-	res, err := op.Process()
+	// Find a way to process this
+	v := f.Var("x", first)
+
+	opSplit := f.Op("Split", v, " ")
+
+	opJoin := f.Op("Join", opSplit, ",")
+
+	res, err := opJoin.Process()
 	if err != nil {
 		log.Fatal(err)
 	}

+ 2 - 2
go/src/flow/flow.go

@@ -44,8 +44,8 @@ func New() *Flow {
 	}
 }
 
-//SetRegistry use the registry specified
-func (f *Flow) SetRegistry(r *registry.R) *Flow {
+//UseRegistry use the registry specified
+func (f *Flow) UseRegistry(r *registry.R) *Flow {
 	f.registry = r
 	// chain
 	return f

+ 1 - 1
go/src/flow/flow_test.go

@@ -229,7 +229,7 @@ func TestLocalRegistry(t *testing.T) {
 	a.NotEq(e, nil, "registered in a local register")
 
 	f := flow.New()
-	f.SetRegistry(r)
+	f.UseRegistry(r)
 	op := f.Op("test")
 	a.NotEq(op, nil, "operation should be valid")
 

+ 38 - 35
go/src/flow/flowserver/flowbuilder/builder.go

@@ -35,7 +35,7 @@ func New(r *registry.R) *FlowBuilder {
 // Load document from json into builder
 func (fb *FlowBuilder) Load(rawData []byte) *FlowBuilder {
 	fb.flow = flow.New()
-	fb.flow.SetRegistry(fb.registry)
+	fb.flow.UseRegistry(fb.registry)
 
 	doc := &FlowDocument{[]Node{}, []Link{}, []Trigger{}}
 	log.Println("Loading document from:", string(rawData))
@@ -80,15 +80,26 @@ func (fb *FlowBuilder) Build(ID string) flow.Operation {
 	}
 
 	var op flow.Operation
+	var err error
+	var inputs []reflect.Type
 
 	switch node.Src {
 	case "Input":
 		inputID, err := strconv.Atoi(node.Prop["input"])
 		if err != nil {
-			op = f.DefErrOp(node.ID, errors.New("Invalid inputID value, must be a number"))
-		} else {
-			op = f.In(inputID) // By id perhaps
+			return f.DefErrOp(node.ID, errors.New("Invalid inputID value, must be a number"))
 		}
+		return f.In(inputID) // By id perhaps
+	default:
+		log.Println("Loading entry:", node.Src)
+		entry, err := r.Entry(node.Src)
+		if err != nil {
+			op = f.DefErrOp(node.ID, err)
+			return nil
+		}
+		inputs = entry.Inputs
+
+	}
 	/*case "Variable":
 	// Input 1 is the var
 	raw := node.Prop["init"]
@@ -97,47 +108,39 @@ func (fb *FlowBuilder) Build(ID string) flow.Operation {
 		op, _ = f.DefErrOp(node.ID, err)
 	} else {
 		op = f.DefVar(node.ID, node.Label, val)
-	}*/
+	}
 	case "Const":
 		raw := node.Label
 		val, err := parseValue(nil, raw)
 		if err != nil {
-			op = f.DefErrOp(node.ID, err)
-		} else {
-			op = f.DefConst(node.ID, val)
+			return f.DefErrOp(node.ID, err)
 		}
-	default:
-		// Load entry
-		entry, err := r.Entry(node.Src)
-		if err != nil {
-			op = f.DefErrOp(node.ID, err)
-			return nil
-		}
-		//// Process inputs ////
-		param := make([]flow.Data, len(entry.Inputs))
-		for i := range param {
-			l := doc.fetchLinkTo(node.ID, i)
-			if l == nil { // No link we fetch the value inserted
-				// Const value
-				v, err := parseValue(entry.Inputs[i], node.DefaultInputs[i])
-				if err != nil {
-					param[i] = f.ErrOp(err)
-					continue
-				}
-				param[i] = v
+		return f.DefConst(node.ID, val)*/
+	// Load entry
+
+	//// Build inputs ////
+	param := make([]flow.Data, len(inputs))
+	for i := range param {
+		l := doc.fetchLinkTo(node.ID, i)
+		if l == nil { // No link we fetch the value inserted
+			// Direct input entries
+			v, err := parseValue(inputs[i], node.DefaultInputs[i])
+			if err != nil {
+				param[i] = f.ErrOp(err)
 				continue
 			}
-
-			param[i] = fb.Build(l.From)
+			param[i] = v
+			continue
 		}
+		param[i] = fb.Build(l.From)
+	}
 
-		op, err = f.DefOp(node.ID, node.Src, param...)
-		if err != nil {
-			op := f.DefErrOp(node.ID, err)
-			return op
-		}
-		fb.addTriggersTo(node)
+	op, err = f.DefOp(node.ID, node.Src, param...)
+	if err != nil {
+		op := f.DefErrOp(node.ID, err)
+		return op
 	}
+	fb.addTriggersTo(node)
 
 	return op
 }

+ 10 - 7
go/src/flow/flowserver/session.go

@@ -199,6 +199,7 @@ func (s *FlowSession) NodeRun(c *websocket.Conn, data []byte) error {
 		})
 		// Special func
 		localR.Add("Variable", func(name string, initial flow.Data) flow.Data {
+			log.Println("Loading variable:", name)
 			_, ok := s.flow.Data[name]
 			if !ok {
 				s.flow.Data[name] = initial
@@ -214,25 +215,25 @@ func (s *FlowSession) NodeRun(c *websocket.Conn, data []byte) error {
 		})
 		builder := flowbuilder.New(localR)
 		builder.Load(s.RawDoc).Build(ID)
-
 		if builder.Err != nil {
 			return builder.Err
 		}
-		log.Println("New flow")
+
 		s.flow = builder.Flow()
+		log.Println("Flow:", s.flow)
 
 		defer func() { // After routing gone
 			s.flow = nil
 		}()
 		s.flow.Hook(flow.Hook{
-			Any: func(name string, ID string, triggerTime time.Time, extra ...flow.Data) {
+			Any: func(name string, nodeID string, triggerTime time.Time, extra ...flow.Data) {
 				s.Lock()
 				defer s.Unlock()
 
-				act, ok := s.nodeActivity[ID]
+				act, ok := s.nodeActivity[nodeID]
 				if !ok {
-					act = &NodeActivity{ID: ID}
-					s.nodeActivity[ID] = act
+					act = &NodeActivity{ID: nodeID}
+					s.nodeActivity[nodeID] = act
 				}
 				status := ""
 				switch name {
@@ -247,7 +248,9 @@ func (s *FlowSession) NodeRun(c *websocket.Conn, data []byte) error {
 				case "Finish":
 					status = "finish"
 					act.EndTime = triggerTime
-					act.Data = extra[0]
+					if nodeID == ID { // only load data from requested node
+						act.Data = extra[0]
+					}
 				case "Error":
 					status = "error"
 					act.EndTime = triggerTime

+ 0 - 1
go/src/flow/flowserver/sessionmgr.go

@@ -141,7 +141,6 @@ func (fsm *FlowSessionManager) ServeHTTP(w http.ResponseWriter, r *http.Request)
 			// DOCUMENTUPDATE Receive a document
 			//////
 			case "documentUpdate":
-				log.Println("Updating document:", m.ID)
 				sess, err = fsm.LoadSession(m.ID)
 				if e(err) {
 					return err