|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534 |
- package plans
-
- import (
- "fmt"
-
- "github.com/samber/lo"
- "gitlink.org.cn/cloudream/common/pkgs/ipfs"
- cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ec"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/dag"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/exec"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/ops"
- )
-
- type IPFSReadType struct {
- FileHash string
- Option ipfs.ReadOption
- }
-
- func (t *IPFSReadType) InitNode(node *Node) {
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *IPFSReadType) GenerateOp(node *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.IPFSRead{
- Output: node.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- FileHash: t.FileHash,
- Option: t.Option,
- }, node.Env, blder)
- return nil
- }
-
- func (t *IPFSReadType) String(node *Node) string {
- return fmt.Sprintf("IPFSRead[%s,%v+%v]%v%v", t.FileHash, t.Option.Offset, t.Option.Length, formatStreamIO(node), formatValueIO(node))
- }
-
- type IPFSWriteType struct {
- FileHashStoreKey string
- Range Range
- }
-
- func (t *IPFSWriteType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- dag.NodeNewOutputValue(node, VarProps{})
- }
-
- func (t *IPFSWriteType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.IPFSWrite{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- FileHash: op.OutputValues[0].Props.Var.(*ioswitch.StringVar),
- }, op.Env, blder)
- return nil
- }
-
- func (t *IPFSWriteType) String(node *Node) string {
- return fmt.Sprintf("IPFSWrite[%s,%v+%v](%v>)", t.FileHashStoreKey, t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
- }
-
- type ChunkedSplitType struct {
- OutputCount int
- ChunkSize int
- }
-
- func (t *ChunkedSplitType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- for i := 0; i < t.OutputCount; i++ {
- dag.NodeNewOutputStream(node, VarProps{})
- }
- }
-
- func (t *ChunkedSplitType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.ChunkedSplit{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
- return v.Props.Var.(*ioswitch.StreamVar)
- }),
- ChunkSize: t.ChunkSize,
- PaddingZeros: true,
- }, op.Env, blder)
- return nil
- }
-
- func (t *ChunkedSplitType) String(node *Node) string {
- return fmt.Sprintf("ChunkedSplit[%v]", t.ChunkSize, formatStreamIO(node), formatValueIO(node))
- }
-
- type ChunkedJoinType struct {
- InputCount int
- ChunkSize int
- }
-
- func (t *ChunkedJoinType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, t.InputCount)
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *ChunkedJoinType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.ChunkedJoin{
- Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
- return v.Props.Var.(*ioswitch.StreamVar)
- }),
- Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- ChunkSize: t.ChunkSize,
- }, op.Env, blder)
- return nil
- }
-
- func (t *ChunkedJoinType) String(node *Node) string {
- return fmt.Sprintf("ChunkedJoin[%v]", t.ChunkSize, formatStreamIO(node), formatValueIO(node))
- }
-
- type CloneStreamType struct{}
-
- func (t *CloneStreamType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- }
-
- func (t *CloneStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.CloneStream{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
- return v.Props.Var.(*ioswitch.StreamVar)
- }),
- }, op.Env, blder)
- return nil
- }
-
- func (t *CloneStreamType) NewOutput(node *Node) *StreamVar {
- return dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *CloneStreamType) String(node *Node) string {
- return fmt.Sprintf("CloneStream[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type CloneVarType struct{}
-
- func (t *CloneVarType) InitNode(node *Node) {
- dag.NodeDeclareInputValue(node, 1)
- }
-
- func (t *CloneVarType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.CloneVar{
- Raw: op.InputValues[0].Props.Var,
- Cloneds: lo.Map(op.OutputValues, func(v *ValueVar, idx int) ioswitch.Var {
- return v.Props.Var
- }),
- }, op.Env, blder)
- return nil
- }
-
- func (t *CloneVarType) NewOutput(node *Node) *ValueVar {
- return dag.NodeNewOutputValue(node, VarProps{})
- }
-
- func (t *CloneVarType) String(node *Node) string {
- return fmt.Sprintf("CloneVar[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type MultiplyType struct {
- EC cdssdk.ECRedundancy
- }
-
- func (t *MultiplyType) InitNode(node *Node) {}
-
- func (t *MultiplyType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- var inputIdxs []int
- var outputIdxs []int
- for _, in := range op.InputStreams {
- inputIdxs = append(inputIdxs, in.Props.StreamIndex)
- }
- for _, out := range op.OutputStreams {
- outputIdxs = append(outputIdxs, out.Props.StreamIndex)
- }
-
- rs, err := ec.NewRs(t.EC.K, t.EC.N)
- coef, err := rs.GenerateMatrix(inputIdxs, outputIdxs)
- if err != nil {
- return err
- }
-
- addOpByEnv(&ops.ECMultiply{
- Coef: coef,
- Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Props.Var.(*ioswitch.StreamVar) }),
- Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Props.Var.(*ioswitch.StreamVar) }),
- ChunkSize: t.EC.ChunkSize,
- }, op.Env, blder)
- return nil
- }
-
- func (t *MultiplyType) AddInput(node *Node, str *StreamVar) {
- node.InputStreams = append(node.InputStreams, str)
- str.To(node, len(node.InputStreams)-1)
- }
-
- func (t *MultiplyType) NewOutput(node *Node, dataIndex int) *StreamVar {
- return dag.NodeNewOutputStream(node, VarProps{StreamIndex: dataIndex})
- }
-
- func (t *MultiplyType) String(node *Node) string {
- return fmt.Sprintf("Multiply[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type FileReadType struct {
- FilePath string
- }
-
- func (t *FileReadType) InitNode(node *Node) {
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *FileReadType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.FileRead{
- Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- FilePath: t.FilePath,
- }, op.Env, blder)
- return nil
- }
-
- func (t *FileReadType) String(node *Node) string {
- return fmt.Sprintf("FileRead[%s]%v%v", t.FilePath, formatStreamIO(node), formatValueIO(node))
- }
-
- type FileWriteType struct {
- FilePath string
- }
-
- func (t *FileWriteType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- }
-
- func (t *FileWriteType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.FileWrite{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- FilePath: t.FilePath,
- }, op.Env, blder)
- return nil
- }
-
- type FromExecutorType struct {
- Handle *exec.ExecutorWriteStream
- }
-
- func (t *FromExecutorType) InitNode(node *Node) {
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *FromExecutorType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- t.Handle.Var = op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar)
- return nil
- }
-
- func (t *FromExecutorType) String(node *Node) string {
- return fmt.Sprintf("FromExecutor[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type ToExecutorType struct {
- Handle *exec.ExecutorReadStream
- Range Range
- }
-
- func (t *ToExecutorType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- }
-
- func (t *ToExecutorType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- t.Handle.Var = op.InputStreams[0].Props.Var.(*ioswitch.StreamVar)
- return nil
- }
-
- func (t *ToExecutorType) String(node *Node) string {
- return fmt.Sprintf("ToExecutor[%v+%v]%v%v", t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
- }
-
- type StoreType struct {
- StoreKey string
- }
-
- func (t *StoreType) InitNode(node *Node) {
- dag.NodeDeclareInputValue(node, 1)
- }
-
- func (t *StoreType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- blder.AtExecutor().AddOp(&ops.Store{
- Var: op.InputValues[0].Props.Var,
- Key: t.StoreKey,
- Store: blder.ExecutorPlan.StoreMap,
- })
- return nil
- }
-
- func (t *StoreType) String(node *Node) string {
- return fmt.Sprintf("Store[%s]%v%v", t.StoreKey, formatStreamIO(node), formatValueIO(node))
- }
-
- type DropType struct{}
-
- func (t *DropType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- }
-
- func (t *DropType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.DropStream{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- }, op.Env, blder)
- return nil
- }
-
- func (t *DropType) String(node *Node) string {
- return fmt.Sprintf("Drop[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type SendStreamType struct {
- }
-
- func (t *SendStreamType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *SendStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- toAgt := op.OutputStreams[0].Toes[0].Node.Env.Worker.(*AgentWorker)
- addOpByEnv(&ops.SendStream{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Send: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Node: toAgt.Node,
- }, op.Env, blder)
- return nil
- }
-
- func (t *SendStreamType) String(node *Node) string {
- return fmt.Sprintf("SendStream[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type SendVarType struct {
- }
-
- func (t *SendVarType) InitNode(node *Node) {
- dag.NodeDeclareInputValue(node, 1)
- dag.NodeNewOutputValue(node, VarProps{})
- }
-
- func (t *SendVarType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- toAgt := op.OutputValues[0].Toes[0].Node.Env.Worker.(*AgentWorker)
- addOpByEnv(&ops.SendVar{
- Input: op.InputValues[0].Props.Var,
- Send: op.OutputValues[0].Props.Var,
- Node: toAgt.Node,
- }, op.Env, blder)
- return nil
- }
-
- func (t *SendVarType) String(node *Node) string {
- return fmt.Sprintf("SendVar[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type GetStreamType struct {
- }
-
- func (t *GetStreamType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- dag.NodeNewOutputValue(node, VarProps{})
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *GetStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- fromAgt := op.InputStreams[0].From.Node.Env.Worker.(*AgentWorker)
- addOpByEnv(&ops.GetStream{
- Signal: op.OutputValues[0].Props.Var.(*ioswitch.SignalVar),
- Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Target: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Node: fromAgt.Node,
- }, op.Env, blder)
- return nil
- }
-
- func (t *GetStreamType) String(node *Node) string {
- return fmt.Sprintf("GetStream[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type GetVaType struct {
- }
-
- func (t *GetVaType) InitNode(node *Node) {
- dag.NodeDeclareInputValue(node, 1)
- dag.NodeNewOutputValue(node, VarProps{})
- dag.NodeNewOutputValue(node, VarProps{})
- }
-
- func (t *GetVaType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- fromAgt := op.InputValues[0].From.Node.Env.Worker.(*AgentWorker)
- addOpByEnv(&ops.GetVar{
- Signal: op.OutputValues[0].Props.Var.(*ioswitch.SignalVar),
- Output: op.OutputValues[1].Props.Var,
- Target: op.InputValues[0].Props.Var,
- Node: fromAgt.Node,
- }, op.Env, blder)
- return nil
- }
-
- func (t *GetVaType) String(node *Node) string {
- return fmt.Sprintf("GetVar[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- type RangeType struct {
- Range Range
- }
-
- func (t *RangeType) InitNode(node *Node) {
- dag.NodeDeclareInputStream(node, 1)
- dag.NodeNewOutputStream(node, VarProps{})
- }
-
- func (t *RangeType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- addOpByEnv(&ops.Range{
- Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
- Offset: t.Range.Offset,
- Length: t.Range.Length,
- }, op.Env, blder)
- return nil
- }
-
- func (t *RangeType) String(node *Node) string {
- return fmt.Sprintf("Range[%v+%v]%v%v", t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
- }
-
- type HoldUntilType struct {
- }
-
- func (t *HoldUntilType) InitNode(node *Node) {
- dag.NodeDeclareInputValue(node, 1)
- }
-
- func (t *HoldUntilType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
- o := &ops.HoldUntil{
- Waits: []*ioswitch.SignalVar{op.InputValues[0].Props.Var.(*ioswitch.SignalVar)},
- }
-
- for i := 0; i < len(op.OutputValues); i++ {
- o.Holds = append(o.Holds, op.InputValues[i+1].Props.Var)
- o.Emits = append(o.Emits, op.OutputValues[i].Props.Var)
- }
-
- for i := 0; i < len(op.OutputStreams); i++ {
- o.Holds = append(o.Holds, op.InputStreams[i].Props.Var)
- o.Emits = append(o.Emits, op.OutputStreams[i].Props.Var)
- }
-
- addOpByEnv(o, op.Env, blder)
- return nil
- }
-
- func (t *HoldUntilType) String(node *Node) string {
- return fmt.Sprintf("HoldUntil[]%v%v", formatStreamIO(node), formatValueIO(node))
- }
-
- func addOpByEnv(op ioswitch.Op, env dag.NodeEnv, blder *exec.PlanBuilder) {
- switch env.Type {
- case dag.EnvWorker:
- blder.AtAgent(env.Worker.(*AgentWorker).Node).AddOp(op)
- case dag.EnvExecutor:
- blder.AtExecutor().AddOp(op)
- }
- }
-
- func formatStreamIO(node *Node) string {
- is := ""
- for i, in := range node.InputStreams {
- if i > 0 {
- is += ","
- }
-
- if in == nil {
- is += "."
- } else {
- is += fmt.Sprintf("%v", in.ID)
- }
- }
-
- os := ""
- for i, out := range node.OutputStreams {
- if i > 0 {
- os += ","
- }
-
- if out == nil {
- os += "."
- } else {
- os += fmt.Sprintf("%v", out.ID)
- }
- }
-
- if is == "" && os == "" {
- return ""
- }
-
- return fmt.Sprintf("S{%s>%s}", is, os)
- }
-
- func formatValueIO(node *Node) string {
- is := ""
- for i, in := range node.InputValues {
- if i > 0 {
- is += ","
- }
-
- if in == nil {
- is += "."
- } else {
- is += fmt.Sprintf("%v", in.ID)
- }
- }
-
- os := ""
- for i, out := range node.OutputValues {
- if i > 0 {
- os += ","
- }
-
- if out == nil {
- os += "."
- } else {
- os += fmt.Sprintf("%v", out.ID)
- }
- }
-
- if is == "" && os == "" {
- return ""
- }
-
- return fmt.Sprintf("V{%s>%s}", is, os)
- }
|