WriteOperator.go

package main

import (
	"errors"
	"fmt"
	"hash/fnv"
	"strconv"
	"strings"
)

// Constants for status size limit
const STATUS_SIZE_LIMIT = 1000

// Config struct as a placeholder
type Config struct{}

// State struct to manage the process state and other properties
type State struct {
	process  string
	state    string
	weight   int
	breaking bool
	result   string
}

// SignedData struct to manage cached data
type SignedData struct {
	cache map[string]interface{}
}

// Method to cache universal data
func (sd *SignedData) CachedUniversal(statusHash string, value interface{}) {
	sd.cache[statusHash] = value
}

// Method to cache local data
func (sd *SignedData) CachedLocal(statusHash string, value interface{}) {
	sd.cache[statusHash] = value
}

// WriteOperator struct to handle writing operations
type WriteOperator struct {
	code        *Code
	postProcess *PostProcess
	state       *State
	signedData  *SignedData
}

// Code struct as a placeholder
type Code struct{}

// Method to get the writer
func (c *Code) Writer() string {
	return "writer"
}

// Method to get the space
func (c *Code) Space() string {
	return "space"
}

// PostProcess struct as a placeholder
type PostProcess struct{}

// Method to get the writer
func (pp *PostProcess) Writer() string {
	return "writer"
}

// Method to get the space
func (pp *PostProcess) Space() string {
	return "space"
}

// Helper function to generate a status hash
func generateStatusHash(writer, space, attr, key string) (string, error) {
	if writer == "" || space == "" || attr == "" || key == "" {
		return "", errors.New("invalid parameters")
	}
	h := fnv.New64a()
	h.Write([]byte(writer + space + attr + key))
	return fmt.Sprintf("%x", h.Sum(nil)), nil
}

// Method to handle writing universal data
func (wo *WriteOperator) WriteUniversal(vars []interface{}) (interface{}, error) {
	attr, ok1 := vars[0].(string)
	key, ok2 := vars[1].(string)
	if !ok1 || !ok2 {
		return nil, errors.New("invalid parameters")
	}

	var statusHash string
	var err error
	if wo.state.process == "MAIN" {
		statusHash, err = generateStatusHash(wo.code.Writer(), wo.code.Space(), attr, key)
	} else if wo.state.process == "POST" {
		statusHash, err = generateStatusHash(wo.postProcess.Writer(), wo.postProcess.Space(), attr, key)
	} else {
		return nil, nil
	}

	if err != nil {
		return nil, err
	}

	switch wo.state.state {
	case "READ":
		wo.addUniversalLoads(statusHash)
	case "CONDITION":
		value := vars[2]
		length := len(fmt.Sprintf("%v", value))

		if length > STATUS_SIZE_LIMIT {
			wo.state.breaking = true
			wo.state.result = fmt.Sprintf("Too long status values. maximum size: %d", STATUS_SIZE_LIMIT)
		}

		if wo.state.process == "MAIN" {
			wo.signedData.CachedUniversal(statusHash, value)
			wo.state.weight += len(statusHash) + length
		}
		return map[string]interface{}{"$write_universal": vars}, nil
	case "EXECUTION":
		value := vars[2]
		return wo.setUniversalStatus(statusHash, value)
	}

	return nil, nil
}

// Method to handle writing local data
func (wo *WriteOperator) WriteLocal(vars []interface{}) (interface{}, error) {
	attr, ok1 := vars[0].(string)
	key, ok2 := vars[1].(string)
	if !ok1 || !ok2 {
		return nil, errors.New("invalid parameters")
	}

	var statusHash string
	var err error
	if wo.state.process == "MAIN" {
		statusHash, err = generateStatusHash(wo.code.Writer(), wo.code.Space(), attr, key)
	} else if wo.state.process == "POST" {
		statusHash, err = generateStatusHash(wo.postProcess.Writer(), wo.postProcess.Space(), attr, key)
	} else {
		return nil, nil
	}

	if err != nil {
		return nil, err
	}

	switch wo.state.state {
	case "READ":
		wo.addLocalLoads(statusHash)
	case "CONDITION":
		value := vars[2]
		length := len(fmt.Sprintf("%v", value))

		if length > STATUS_SIZE_LIMIT {
			wo.state.breaking = true
			wo.state.result = fmt.Sprintf("Too long status values. maximum size: %d", STATUS_SIZE_LIMIT)
		}

		if wo.state.process == "MAIN" {
			wo.signedData.CachedLocal(statusHash, value)
			wo.state.weight += len(statusHash) + (length * 1000000000)
		}
		return map[string]interface{}{"$write_local": vars}, nil
	case "EXECUTION":
		value := vars[2]
		return wo.setLocalStatus(statusHash, value)
	}

	return nil, nil
}

// Placeholder method for adding universal loads
func (wo *WriteOperator) addUniversalLoads(statusHash string) {
	// Placeholder for actual implementation
}

// Placeholder method for adding local loads
func (wo *WriteOperator) addLocalLoads(statusHash string) {
	// Placeholder for actual implementation
}

// Placeholder method for setting universal status
func (wo *WriteOperator) setUniversalStatus(statusHash string, value interface{}) (interface{}, error) {
	// Placeholder for actual implementation
	return nil, nil
}

// Placeholder method for setting local status
func (wo *WriteOperator) setLocalStatus(statusHash string, value interface{}) (interface{}, error) {
	// Placeholder for actual implementation
	return nil, nil
}

func main() {
	wo := &WriteOperator{
		code:        &Code{},
		postProcess: &PostProcess{},
		state: &State{
			process: "MAIN",
			state:   "CONDITION",
		},
		signedData: &SignedData{
			cache: make(map[string]interface{}),
		},
	}

	result, err := wo.WriteUniversal([]interface{}{"attr", "key", "value"})
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("WriteUniversal result:", result)
	}

	result, err = wo.WriteLocal([]interface{}{"attr", "key", "value"})
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("WriteLocal result:", result)
	}
}

μ½”λ“œ μ„€λͺ…

이 μ½”λ“œλŠ” WriteOperator ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜μ—¬ μœ λ‹ˆλ²„μ„€ 및 둜컬 데이터λ₯Ό μž‘μ„±ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. 각 ν•¨μˆ˜λŠ” λ‹€μ–‘ν•œ μƒνƒœ(READ, CONDITION, EXECUTION)에 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

μ£Όμš” ν•¨μˆ˜ μ„€λͺ…

  1. generateStatusHash ν•¨μˆ˜

    • μ£Όμ–΄μ§„ writer, space, attr, keyλ₯Ό ν•΄μ‹±ν•˜μ—¬ μƒνƒœ ν•΄μ‹œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

  2. WriteUniversal ν•¨μˆ˜

    • μœ λ‹ˆλ²„μ„€ 데이터λ₯Ό μž‘μ„±ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    • READ, CONDITION, EXECUTION μƒνƒœμ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

    • μƒνƒœ ν•΄μ‹œλ₯Ό μƒμ„±ν•˜κ³ , READ μƒνƒœμ—μ„œλŠ” λ‘œλ“œλ₯Ό μΆ”κ°€ν•˜κ³ , CONDITION μƒνƒœμ—μ„œλŠ” 값을 μΊμ‹±ν•˜λ©°, EXECUTION μƒνƒœμ—μ„œλŠ” μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

  3. WriteLocal ν•¨μˆ˜

    • 둜컬 데이터λ₯Ό μž‘μ„±ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    • READ, CONDITION, EXECUTION μƒνƒœμ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

    • μƒνƒœ ν•΄μ‹œλ₯Ό μƒμ„±ν•˜κ³ , READ μƒνƒœμ—μ„œλŠ” λ‘œλ“œλ₯Ό μΆ”κ°€ν•˜κ³ , CONDITION μƒνƒœμ—μ„œλŠ” 값을 μΊμ‹±ν•˜λ©°, EXECUTION μƒνƒœμ—μ„œλŠ” μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

  4. addUniversalLoads ν•¨μˆ˜

    • μœ λ‹ˆλ²„μ„€ λ‘œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. (ν”Œλ ˆμ΄μŠ€ν™€λ”)

  5. addLocalLoads ν•¨μˆ˜

    • 둜컬 λ‘œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. (ν”Œλ ˆμ΄μŠ€ν™€λ”)

  6. setUniversalStatus ν•¨μˆ˜

    • μœ λ‹ˆλ²„μ„€ μƒνƒœλ₯Ό μ„€μ •ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. (ν”Œλ ˆμ΄μŠ€ν™€λ”)

  7. setLocalStatus ν•¨μˆ˜

    • 둜컬 μƒνƒœλ₯Ό μ„€μ •ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. (ν”Œλ ˆμ΄μŠ€ν™€λ”)

main ν•¨μˆ˜

  • WriteOperator ꡬ쑰체의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , μœ λ‹ˆλ²„μ„€ 및 둜컬 데이터λ₯Ό μž‘μ„±ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

Last updated