MLModelEntity.java

package com.kapil.verbametrics.ml.entities;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * JPA Entity for ML Model persistence operations.
 *
 * @author Kapil Garg
 */
@Entity
@Table(name = "ml_models")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MLModelEntity {

    @Id
    @Column(name = "model_id", length = 100)
    private String modelId;

    @Column(name = "model_type", nullable = false, length = 50)
    private String modelType;

    @Column(name = "name", nullable = false, length = 200)
    private String name;

    @Column(name = "description", length = 1000)
    private String description;

    @Column(name = "version", length = 20)
    private String version;

    @Column(name = "created_at", nullable = false)
    private LocalDateTime createdAt;

    @Column(name = "last_used")
    private LocalDateTime lastUsed;

    @Column(name = "model_path", length = 500)
    private String modelPath;

    @Column(name = "is_active")
    private Boolean isActive;

    @Column(name = "created_by", length = 100)
    private String createdBy;

    @Column(name = "training_data_size")
    private Integer trainingDataSize;

    @Column(name = "accuracy")
    private Double accuracy;

    @Column(name = "status", length = 20)
    private String status;

    @ElementCollection
    @CollectionTable(name = "ml_model_parameters", joinColumns = @JoinColumn(name = "model_id"))
    @MapKeyColumn(name = "param_key")
    @Column(name = "param_value")
    private Map<String, String> parameters;

    @ElementCollection
    @CollectionTable(name = "ml_model_metrics", joinColumns = @JoinColumn(name = "model_id"))
    @MapKeyColumn(name = "metric_key")
    @Column(name = "metric_value")
    private Map<String, String> performanceMetrics;

    @PrePersist
    protected void onCreate() {
        if (createdAt == null) {
            createdAt = LocalDateTime.now();
        }
        if (lastUsed == null) {
            lastUsed = LocalDateTime.now();
        }
        if (version == null) {
            version = "1.0";
        }
        if (isActive == null) {
            isActive = true;
        }
    }

    @PreUpdate
    protected void onUpdate() {
        lastUsed = LocalDateTime.now();
    }

}