classDiagram
direction TB
	namespace com.apacy.queryprocessor {
		class Main {
			+static main(String\[\] args)
		}
	
		class QueryProcessor {
			-IQueryOptimizer qo
			-IStorageManager sm
			-IConcurrencyControlManager ccm
			-IFailureRecoveryManager frm
			-PlanTranslator planTranslator
			-JoinStrategy joinStrategy
			-SortStrategy sortStrategy
			+executeQuery(String sqlQuery)
			+initialize()
			+shutdown()
		}
	
		class PlanTranslator {
			+translateToRetrieval(ParsedQuery, String)
			+translateToWrite(ParsedQuery, String, boolean)
			+translateToDeletion(ParsedQuery, String)
		}
	}
	
	  namespace com.apacy.common.enums {
    class Action {
	    <<Enumeration>>
      READ
      WRITE
    }
    class DataType {
     <<Enumeration>> 
      INTEGER
      FLOAT
      CHAR
      VARCHAR
    }
    class IndexType  {
    <<Enumeration>>
      Hash
      BPlusTree
    }
  }

  namespace com.apacy.queryprocessor.execution {
    class JoinStrategy {
      +static nestedLoopJoin(List, List, String)
      +static hashJoin(List, List, String)
      +static sortMergeJoin(List, List, String)
    }

    class SortStrategy {
      +static sort(List, String, boolean)
      +static sortMultiple(List, String\[\], boolean\[\])
      +static externalSort(List, String, boolean, int)
    }
  }
  
  namespace com.apacy.queryprocessor.cli {
    class ApacyCLI {
      -QueryProcessor queryProcessor
      -Scanner scanner
      +start()
      -processInput(String)
      -executeQuery(String)
    }
  }

  namespace com.apacy.common {
    class DBMSComponent {
      +initialize()
      +shutdown()
    }
  }
  
  namespace com.apacy.common.interfaces {
    class IQueryOptimizer {
	    <<interface>>
      +parseQuery(String) ParsedQuery
      +optimizeQuery(ParsedQuery, Map) ParsedQuery
      +getCost(ParsedQuery, Map) double
    }
    class IStorageManager {
	    <<interface>>
      +readBlock(DataRetrieval) List
      +writeBlock(DataWrite) int
      +deleteBlock(DataDeletion) int
      +setIndex(String, String, String) void
      +getAllStats() Map
    }
    class IConcurrencyControlManager {
    	<<interface>>
      +beginTransaction() int
      +logObject(Row, int) void
      +validateObject(String, int, Action) Response
      +endTransaction(int, boolean) void
    }
    class IFailureRecoveryManager {
	    <<interface>>
      +writeLog(ExecutionResult) void
      +saveCheckpoint() void
      +recover(RecoveryCriteria) void
    }
  }
  
namespace com.apacy.common.dto {
    class Column {
      +String name
      +DataType type
      +int length
    }
    class DataDeletion {
      +String tableName
      +Object filterCondition
    }
    class DataRetrieval {
      +String tableName
      +List columns
      +Object filterCondition
      +boolean useIndex
    }
    class DataWrite {
      +String tableName
      +Row newData
      +Object filterCondition
    }
    class ExecutionResult {
      +boolean success
      +String message
      +int transactionId
      +String operation
      +int affectedRows
      +List rows
    }
    class IndexSchema {
      +String indexName
      +String columnName
      +IndexType indexType
      +String indexFile
    }
    class ParsedQuery {
      +String queryType
      +List targetTables
      +List targetColumns
      +List values
      +Object joinConditions
      +Object whereClause
      +String orderByColumn
      +boolean isDescending
      +boolean isOptimized
    }
    class RecoveryCriteria {
      +String recoveryType
      +String transactionId
      +LocalDateTime targetTime
    }
    class Response {
      +boolean isAllowed
      +String reason
    }
    class Row {
      +Map data
      +get(String) Object
    }
    class Schema {
      +String tableName
      +String dataFile
      +List columns
      +List indexes
    }
    class Statistic {
      +int nr
      +int br
      +int lr
      +int fr
      +Map V
      +Map indexedColumn
    }
  }

	Main ..> QueryProcessor 
  Main ..> ApacyCLI 

  ApacyCLI o-- QueryProcessor 
  ApacyCLI ..> ExecutionResult 
  ApacyCLI ..> Row 

  QueryProcessor --|> DBMSComponent 
  QueryProcessor o-- PlanTranslator 
  QueryProcessor o-- JoinStrategy 
  QueryProcessor o-- SortStrategy 

  QueryProcessor o-- IQueryOptimizer 
  QueryProcessor o-- IStorageManager 
  QueryProcessor o-- IConcurrencyControlManager 
  QueryProcessor o-- IFailureRecoveryManager 
  
    PlanTranslator ..> ParsedQuery 
  PlanTranslator ..> DataRetrieval
  PlanTranslator ..> DataWrite 
  PlanTranslator ..> DataDeletion
  PlanTranslator ..> Row

  QueryProcessor ..> ParsedQuery 
  QueryProcessor ..> DataRetrieval 
  QueryProcessor ..> ExecutionResult 
  QueryProcessor ..> RecoveryCriteria 
  QueryProcessor ..> Response 
  QueryProcessor ..> Row 
  QueryProcessor ..> Action 


  JoinStrategy ..> SortStrategy
  JoinStrategy ..> Row
  SortStrategy ..> Row 

  IQueryOptimizer ..> ParsedQuery 
  IQueryOptimizer ..> Statistic 

  IStorageManager ..> DataRetrieval
  IStorageManager ..> DataWrite
  IStorageManager ..> DataDeletion
  IStorageManager ..> Row
  IStorageManager ..> Statistic
  
  IConcurrencyControlManager ..> Response 
  IConcurrencyControlManager ..> Row 
  IConcurrencyControlManager ..> Action 

  IFailureRecoveryManager ..> ExecutionResult 
  IFailureRecoveryManager ..> RecoveryCriteria

  Schema o-- "1..*" Column
  Schema o-- "0..*" IndexSchema
  IndexSchema ..> IndexType
  Column ..> DataType
  Statistic ..> IndexType
  DataWrite ..> Row