* feat: make new connections * refact: context groups | feat: area detection and a bunch of small things. hate yourself for this massive commit
		
			
				
	
	
		
			148 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package contextGroup
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"textualize/entities"
 | 
						|
)
 | 
						|
 | 
						|
type ContextGroupCollection struct {
 | 
						|
	Groups []entities.LinkedAreaList
 | 
						|
}
 | 
						|
 | 
						|
var contextGroupCollectionInstance *ContextGroupCollection
 | 
						|
 | 
						|
func GetContextGroupCollection() *ContextGroupCollection {
 | 
						|
	if contextGroupCollectionInstance == nil {
 | 
						|
		contextGroupCollectionInstance = &ContextGroupCollection{}
 | 
						|
	}
 | 
						|
	return contextGroupCollectionInstance
 | 
						|
}
 | 
						|
 | 
						|
func SetContextGroupCollection(collection ContextGroupCollection) *ContextGroupCollection {
 | 
						|
	contextGroupCollectionInstance = &collection
 | 
						|
	return contextGroupCollectionInstance
 | 
						|
}
 | 
						|
 | 
						|
func SetContextGroupCollectionBySerialized(serialized []entities.SerializedLinkedProcessedArea) *ContextGroupCollection {
 | 
						|
	newInstance := ContextGroupCollection{}
 | 
						|
 | 
						|
	newInstance.Groups = append(newInstance.Groups, entities.DeserializeLinkedAreaList(serialized))
 | 
						|
 | 
						|
	SetContextGroupCollection(newInstance)
 | 
						|
	return &newInstance
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) DoesGroupExistBetweenProcessedAreas(ancestorAreaId string, descendantAreaId string) bool {
 | 
						|
	ancestorGroup, _ := collection.FindGroupByLinkedProcessedAreaId(ancestorAreaId)
 | 
						|
	descendantGroup, _ := collection.FindGroupByLinkedProcessedAreaId(descendantAreaId)
 | 
						|
 | 
						|
	isAncestorInAnyInGroup := ancestorGroup != nil
 | 
						|
	isDescendantInAnyInGroup := descendantGroup != nil
 | 
						|
	areBothInAnyInGroup := isAncestorInAnyInGroup && isDescendantInAnyInGroup
 | 
						|
	areBothInSameGroup := false
 | 
						|
	if areBothInAnyInGroup {
 | 
						|
		areBothInSameGroup = ancestorGroup.Id == descendantGroup.Id
 | 
						|
	}
 | 
						|
 | 
						|
	return areBothInSameGroup
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) DisconnectProcessedAreas(ancestorAreaId string, descendantAreaId string) bool {
 | 
						|
	doesConnectionExist := collection.DoesGroupExistBetweenProcessedAreas(ancestorAreaId, descendantAreaId)
 | 
						|
 | 
						|
	if !doesConnectionExist {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	ancestorGroup, _ := collection.FindGroupByLinkedProcessedAreaId(ancestorAreaId)
 | 
						|
 | 
						|
	wasRemoved := false
 | 
						|
	for i, group := range collection.Groups {
 | 
						|
		if group.Id == ancestorGroup.Id {
 | 
						|
			collection.Groups = append(collection.Groups[:i], collection.Groups[i+1:]...)
 | 
						|
			wasRemoved = true
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return wasRemoved
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) FindGroupById(id string) (*entities.LinkedAreaList, error) {
 | 
						|
	found := false
 | 
						|
	var foundGroup *entities.LinkedAreaList = nil
 | 
						|
	for _, group := range collection.Groups {
 | 
						|
		if group.Id == id {
 | 
						|
			found = true
 | 
						|
			foundGroup = &group
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if !found {
 | 
						|
		return nil, fmt.Errorf("ContextGroupCollection.FindGroupById: Group with id %s not found", id)
 | 
						|
	}
 | 
						|
	return foundGroup, nil
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) FindGroupByLinkedProcessedAreaId(id string) (*entities.LinkedAreaList, error) {
 | 
						|
	found := false
 | 
						|
	var foundGroup *entities.LinkedAreaList = nil
 | 
						|
	for _, group := range collection.Groups {
 | 
						|
		for n := group.First(); n != nil && !found; n = n.GetNext() {
 | 
						|
			if n.Area.Id == id {
 | 
						|
				found = true
 | 
						|
				foundGroup = &group
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if !found {
 | 
						|
		return nil, fmt.Errorf("ContextGroupCollection.FindGroupByLinkedProcessedAreaId: Group with LinkedProcessedArea.Id %s not found", id)
 | 
						|
	}
 | 
						|
	return foundGroup, nil
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) ConnectProcessedAreas(ancestorNode entities.ProcessedArea, descendantNode entities.ProcessedArea) bool {
 | 
						|
	ancestorGroup, _ := collection.FindGroupByLinkedProcessedAreaId(ancestorNode.Id)
 | 
						|
	descendantGroup, _ := collection.FindGroupByLinkedProcessedAreaId(descendantNode.Id)
 | 
						|
 | 
						|
	isAncestorInAnyInGroup := ancestorGroup != nil
 | 
						|
	isDescendantInAnyInGroup := descendantGroup != nil
 | 
						|
	isEitherInAnyInGroup := isAncestorInAnyInGroup || isDescendantInAnyInGroup
 | 
						|
	areBothInAnyInGroup := isAncestorInAnyInGroup && isDescendantInAnyInGroup
 | 
						|
	areBothInSameGroup := false
 | 
						|
	if areBothInAnyInGroup {
 | 
						|
		areBothInSameGroup = ancestorGroup.Id == descendantGroup.Id
 | 
						|
	}
 | 
						|
 | 
						|
	if areBothInSameGroup {
 | 
						|
		return true
 | 
						|
	}
 | 
						|
 | 
						|
	if !isEitherInAnyInGroup {
 | 
						|
		collection.createNewGroupAndConnectNodes(ancestorNode, descendantNode)
 | 
						|
		return true
 | 
						|
	}
 | 
						|
 | 
						|
	if isAncestorInAnyInGroup && !isDescendantInAnyInGroup {
 | 
						|
		ancestorGroup.InsertAfter(ancestorNode.Id, descendantNode)
 | 
						|
		return true
 | 
						|
	}
 | 
						|
 | 
						|
	if !isAncestorInAnyInGroup && isDescendantInAnyInGroup {
 | 
						|
		descendantGroup.InsertBefore(descendantNode.Id, ancestorNode)
 | 
						|
		return true
 | 
						|
	}
 | 
						|
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
func (collection *ContextGroupCollection) createNewGroupAndConnectNodes(ancestorNode entities.ProcessedArea, descendantNode entities.ProcessedArea) {
 | 
						|
	newGroup := entities.LinkedAreaList{
 | 
						|
		Id:         ancestorNode.Id,
 | 
						|
		DocumentId: ancestorNode.DocumentId,
 | 
						|
		Head:       &entities.LinkedProcessedArea{Area: ancestorNode},
 | 
						|
		Tail:       &entities.LinkedProcessedArea{Area: descendantNode},
 | 
						|
	}
 | 
						|
	newGroup.Head.Next = newGroup.Tail
 | 
						|
	newGroup.Tail.Previous = newGroup.Head
 | 
						|
	collection.Groups = append(collection.Groups, newGroup)
 | 
						|
}
 |