Skip to content

Commit

Permalink
Add some logging
Browse files Browse the repository at this point in the history
  • Loading branch information
umutphp committed Mar 12, 2023
1 parent b0e9625 commit 5be5c4d
Showing 1 changed file with 33 additions and 24 deletions.
57 changes: 33 additions & 24 deletions src/HasRecommendation.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

namespace Umutphp\LaravelModelRecommendation;

use Umutphp\LaravelModelRecommendation\RecommendationsModel;
Expand All @@ -20,9 +21,12 @@ trait HasRecommendation
*/
public static function generateRecommendations($name)
{
$config = self::getRecommendationConfig()[$name]?? null;
$config = self::getRecommendationConfig()[$name] ?? null;

logger("Started generating recommendation for $name");

if ($config === null) {
logger()->error("No configuration for $name");
return;
}

Expand All @@ -48,6 +52,8 @@ public static function generateRecommendations($name)
$recommendation->save();
}
}

logger("Finished generating recommendation for $name");
}

/**
Expand All @@ -59,25 +65,28 @@ public static function generateRecommendations($name)
*/
public static function getData($config)
{
$algoritm = $config['recommendation_algorithm']?? 'db_relation';
$algoritm = $config['recommendation_algorithm'] ?? 'db_relation';
$recommendations = [];

logger("The algoritm is $algoritm");

if ($algoritm == 'db_relation') {
$data = DB::table($config['recommendation_data_table'])
->select(
$config['recommendation_group_field'] . ' as group_field',
$config['recommendation_data_field'] . ' as data_field'
);
->select(
$config['recommendation_group_field'] . ' as group_field',
$config['recommendation_data_field'] . ' as data_field'
);

if (is_array($config['recommendation_data_table_filter'])) {
foreach ($config['recommendation_data_table_filter'] as $field => $value) {
$data = $data->where($field, $value);
}
}

$data = $data->get();
logger("The query to fetch data: " . $data->toSql());

$count = $config['recommendation_count']?? config('laravel_model_recommendation.recommendation_count');
$data = $data->get();
$count = $config['recommendation_count'] ?? config('laravel_model_recommendation.recommendation_count');

$recommendations = self::calculateRecommendations($data, $count);
}
Expand Down Expand Up @@ -112,14 +121,14 @@ public static function calculateRecommendations($data, $dataCount)

$dataGroup[$value->group_field][$value->data_field] = $value->data_field;
}

foreach ($dataGroup as $group) {
foreach ($group as $data1) {
foreach ($group as $data2) {
if ($data1 == $data2) {
continue;
}

if (!isset($dataCartesianRanks[$data1])) {
$dataCartesianRanks[$data1] = [];
}
Expand Down Expand Up @@ -155,13 +164,13 @@ public static function calculateRecommendations($data, $dataCount)
*/
public static function calculateSimilarityScore($model1, $model2, $config)
{
$featureWeight = $config['similarity_feature_weight']?? 1;
$numericValueWeight = $config['similarity_numeric_value_weight']?? 1;
$taxonomyWeight = $config['similarity_taxonomy_weight']?? 1;
$numericValueHighRange = $config['similarity_numeric_value_high_range']?? 1000;
$featureFields = $config['similarity_feature_attributes']?? [];
$taxonomyFields = $config['similarity_taxonomy_attributes']?? [];
$numericFields = $config['similarity_numeric_value_attributes']?? [];
$featureWeight = $config['similarity_feature_weight'] ?? 1;
$numericValueWeight = $config['similarity_numeric_value_weight'] ?? 1;
$taxonomyWeight = $config['similarity_taxonomy_weight'] ?? 1;
$numericValueHighRange = $config['similarity_numeric_value_high_range'] ?? 1000;
$featureFields = $config['similarity_feature_attributes'] ?? [];
$taxonomyFields = $config['similarity_taxonomy_attributes'] ?? [];
$numericFields = $config['similarity_numeric_value_attributes'] ?? [];
$model1Features = implode(
'',
array_filter($model1->toArray(), function ($k) use ($featureFields) {
Expand All @@ -179,7 +188,7 @@ public static function calculateSimilarityScore($model1, $model2, $config)

$return = [];
$return[] = (SimilarityHelper::hamming($model1Features, $model2Features) * $featureWeight);

$numericFields1 = [];
$numericFields2 = [];

Expand All @@ -191,15 +200,15 @@ public static function calculateSimilarityScore($model1, $model2, $config)
}

$numericField2 = 0;

if (array_key_exists($field, $model2->toArray())) {
$numericField2 = $model2->$field;
}

$numericFields1[] = $numericField1;
$numericFields2[] = $numericField2;
}

$return[] = (SimilarityHelper::euclidean(
SimilarityHelper::minMaxNorm($numericFields1, 0, $numericValueHighRange),
SimilarityHelper::minMaxNorm($numericFields2, 0, $numericValueHighRange)
Expand Down Expand Up @@ -256,7 +265,7 @@ public static function calculateSimilarityMatrix($models, $config): array
{
$matrix = [];
$return = [];
$count = $config['recommendation_count']?? config('laravel_model_recommendation.recommendation_count');
$count = $config['recommendation_count'] ?? config('laravel_model_recommendation.recommendation_count');

foreach ($models as $model1) {
$similarityScores = [];
Expand All @@ -267,7 +276,7 @@ public static function calculateSimilarityMatrix($models, $config): array
}
$similarityScores[$model2->id] = self::calculateSimilarityScore($model1, $model2, $config);
}

$matrix[$model1->id] = $similarityScores;
}

Expand All @@ -291,7 +300,7 @@ public static function calculateSimilarityMatrix($models, $config): array
*/
public function getRecommendations($name)
{
$config = self::getRecommendationConfig()[$name]?? null;
$config = self::getRecommendationConfig()[$name] ?? null;

if ($config === null) {
return [];
Expand All @@ -312,7 +321,7 @@ public function getRecommendations($name)
$return->push($target);
}

$order = $config['recommendation_order']?? config('laravel_model_recommendation.recommendation_count');
$order = $config['recommendation_order'] ?? config('laravel_model_recommendation.recommendation_count');

if ($order == 'asc') {
return $return->reverse();
Expand Down

0 comments on commit 5be5c4d

Please sign in to comment.