Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/ml')
-rw-r--r--app/models/ml/experiment.rb3
-rw-r--r--app/models/ml/model_metadata.rb2
-rw-r--r--app/models/ml/model_version.rb13
-rw-r--r--app/models/ml/model_version_metadata.rb14
4 files changed, 31 insertions, 1 deletions
diff --git a/app/models/ml/experiment.rb b/app/models/ml/experiment.rb
index ad6c6b7b3bf..456c23df0e0 100644
--- a/app/models/ml/experiment.rb
+++ b/app/models/ml/experiment.rb
@@ -3,6 +3,7 @@
module Ml
class Experiment < ApplicationRecord
include AtomicInternalId
+ include Sortable
PACKAGE_PREFIX = 'ml_experiment_'
@@ -15,6 +16,8 @@ module Ml
has_many :candidates, class_name: 'Ml::Candidate'
has_many :metadata, class_name: 'Ml::ExperimentMetadata'
+ scope :including_project, -> { includes(:project) }
+ scope :by_project, ->(project) { where(project: project) }
scope :with_candidate_count, -> {
left_outer_joins(:candidates)
.select("ml_experiments.*, count(ml_candidates.id) as candidate_count")
diff --git a/app/models/ml/model_metadata.rb b/app/models/ml/model_metadata.rb
index 9c4273c629c..9695621e47d 100644
--- a/app/models/ml/model_metadata.rb
+++ b/app/models/ml/model_metadata.rb
@@ -3,7 +3,7 @@
module Ml
class ModelMetadata < ApplicationRecord
validates :name,
- length: { maximum: 250 },
+ length: { maximum: 255 },
presence: true,
uniqueness: { scope: :model, message: ->(metadata, _) { "'#{metadata.name}' already taken" } }
validates :value, length: { maximum: 5000 }, presence: true
diff --git a/app/models/ml/model_version.rb b/app/models/ml/model_version.rb
index 58da57f27d6..1b3313c803a 100644
--- a/app/models/ml/model_version.rb
+++ b/app/models/ml/model_version.rb
@@ -21,12 +21,25 @@ module Ml
belongs_to :project
belongs_to :package, class_name: 'Packages::MlModel::Package', optional: true
has_one :candidate, class_name: 'Ml::Candidate'
+ has_many :metadata, class_name: 'Ml::ModelVersionMetadata'
delegate :name, to: :model
scope :order_by_model_id_id_desc, -> { order('model_id, id DESC') }
scope :latest_by_model, -> { order_by_model_id_id_desc.select('DISTINCT ON (model_id) *') }
+ def add_metadata(metadata_key_value)
+ return unless metadata_key_value.present?
+
+ metadata_key_value.each do |entry|
+ metadata.create!(
+ project_id: project_id,
+ name: entry[:key],
+ value: entry[:value]
+ )
+ end
+ end
+
class << self
def find_or_create!(model, version, package, description)
create_with(package: package, description: description)
diff --git a/app/models/ml/model_version_metadata.rb b/app/models/ml/model_version_metadata.rb
new file mode 100644
index 00000000000..61810786091
--- /dev/null
+++ b/app/models/ml/model_version_metadata.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Ml
+ class ModelVersionMetadata < ApplicationRecord
+ validates :name,
+ length: { maximum: 255 },
+ presence: true,
+ uniqueness: { scope: :model_version, message: ->(metadata, _) { "'#{metadata.name}' already taken" } }
+ validates :value, length: { maximum: 5000 }, presence: true
+
+ belongs_to :project, optional: false
+ belongs_to :model_version, class_name: 'Ml::ModelVersion', optional: false
+ end
+end