1
0
Fork 0
forked from mirror/pixelfed

Add Related Hashtags

This commit is contained in:
Daniel Supernault 2023-11-16 06:06:22 -07:00
parent 051eb962e1
commit 175203089b
No known key found for this signature in database
GPG key ID: 23740873EE6F76A1
3 changed files with 91 additions and 0 deletions

View file

@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class HashtagRelated extends Model
{
use HasFactory;
/**
* The attributes that should be mutated to dates and other custom formats.
*
* @var array
*/
protected $casts = [
'related_tags' => 'array',
'last_calculated_at' => 'datetime',
'last_moderated_at' => 'datetime',
];
}

View file

@ -0,0 +1,36 @@
<?php
namespace App\Services;
use DB;
use App\StatusHashtag;
use App\Models\HashtagRelated;
class HashtagRelatedService
{
public static function get($id)
{
return HashtagRelated::whereHashtagId($id)->first();
}
public static function fetchRelatedTags($tag)
{
$res = StatusHashtag::query()
->select('h2.name', DB::raw('COUNT(*) as related_count'))
->join('status_hashtags as hs2', function ($join) {
$join->on('status_hashtags.status_id', '=', 'hs2.status_id')
->whereRaw('status_hashtags.hashtag_id != hs2.hashtag_id')
->where('status_hashtags.created_at', '>', now()->subMonths(3));
})
->join('hashtags as h1', 'status_hashtags.hashtag_id', '=', 'h1.id')
->join('hashtags as h2', 'hs2.hashtag_id', '=', 'h2.id')
->where('h1.name', '=', $tag)
->groupBy('h2.name')
->orderBy('related_count', 'desc')
->limit(10)
->get();
return $res;
}
}

View file

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('hashtag_related', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('hashtag_id')->unsigned()->unique()->index();
$table->json('related_tags')->nullable();
$table->bigInteger('agg_score')->unsigned()->nullable()->index();
$table->timestamp('last_calculated_at')->nullable()->index();
$table->timestamp('last_moderated_at')->nullable()->index();
$table->boolean('skip_refresh')->default(false)->index();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('hashtag_related');
}
};