src/Entity/Cvs/SearchStats.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Cvs;
  3. use Doctrine\DBAL\Types\Types;
  4. use Doctrine\ORM\Mapping as ORM;
  5. /**
  6.  * Statistiques de recherche : 1 ligne par combinaison unique
  7.  * (normalizedQuery, cityKeyword, locale) sur une fenêtre glissante de 24h.
  8.  *
  9.  * Lorsqu'une recherche est faite :
  10.  *   - Si une ligne existe pour cette combinaison ET lastSeenAt est dans les 24h
  11.  *     → on incrémente views et on met à jour lastSeenAt
  12.  *   - Sinon (pas de ligne OU dernière > 24h) → nouvelle ligne avec views=1
  13.  *
  14.  * @ORM\Table("cvs_searchstats", indexes={
  15.  *   @ORM\Index(name="idx_searchstats_combo", columns={"normalized_query", "city_keyword", "locale"}),
  16.  *   @ORM\Index(name="idx_searchstats_lastseen", columns={"last_seen_at"}),
  17.  *   @ORM\Index(name="idx_searchstats_views", columns={"views"})
  18.  * })
  19.  * @ORM\Entity(repositoryClass="App\Repository\Cvs\SearchStatsRepository")
  20.  * @ORM\HasLifecycleCallbacks()
  21.  */
  22. class SearchStats
  23. {
  24.     /**
  25.      * @ORM\Column(name="id", type="integer")
  26.      * @ORM\Id
  27.      * @ORM\GeneratedValue(strategy="AUTO")
  28.      */
  29.     protected $id;
  30.     /**
  31.      * Texte de la recherche (tel que tapé/envoyé par l'utilisateur).
  32.      *
  33.      * @ORM\Column(name="query", type="string", length=255, nullable=true)
  34.      */
  35.     protected $query;
  36.     /**
  37.      * Version normalisée de la recherche (lowercase + trim + slugify partiel)
  38.      * utilisée pour le matching (évite les doublons "Paris" / "paris" / " Paris ").
  39.      *
  40.      * @ORM\Column(name="normalized_query", type="string", length=255, nullable=true)
  41.      */
  42.     protected $normalizedQuery;
  43.     /**
  44.      * Si la recherche a été faite depuis une page ville (ex: /jobs/paris),
  45.      * stocke le keyword ville (label de JobsFilters). NULL si pas de contexte ville.
  46.      *
  47.      * @ORM\Column(name="city_keyword", type="string", length=255, nullable=true)
  48.      */
  49.     protected $cityKeyword;
  50.     /**
  51.      * Langue (fr, en).
  52.      *
  53.      * @ORM\Column(name="locale", type="string", length=2, nullable=true)
  54.      */
  55.     protected $locale;
  56.     /**
  57.      * Source de la recherche : 'submit' | 'landing_city' | 'landing_keyword'.
  58.      *
  59.      * @ORM\Column(name="source", type="string", length=32, nullable=true)
  60.      */
  61.     protected $source;
  62.     /**
  63.      * Compteur d'occurrences pour cette combinaison dans la fenêtre 24h.
  64.      *
  65.      * @ORM\Column(name="views", type="integer", options={"default":1})
  66.      */
  67.     protected $views 1;
  68.     /**
  69.      * Date de la 1ère vue dans la fenêtre courante.
  70.      *
  71.      * @ORM\Column(name="first_seen_at", type="datetime", nullable=true)
  72.      */
  73.     protected $firstSeenAt;
  74.     /**
  75.      * Date de la dernière vue (utilisée pour le check "dans les 24h").
  76.      *
  77.      * @ORM\Column(name="last_seen_at", type="datetime", nullable=true)
  78.      */
  79.     protected $lastSeenAt;
  80.     public function getId(): ?int { return $this->id; }
  81.     public function getQuery(): ?string { return $this->query; }
  82.     public function setQuery(?string $query): self $this->query $query; return $this; }
  83.     public function getNormalizedQuery(): ?string { return $this->normalizedQuery; }
  84.     public function setNormalizedQuery(?string $q): self $this->normalizedQuery $q; return $this; }
  85.     public function getCityKeyword(): ?string { return $this->cityKeyword; }
  86.     public function setCityKeyword(?string $c): self $this->cityKeyword $c; return $this; }
  87.     public function getLocale(): ?string { return $this->locale; }
  88.     public function setLocale(?string $l): self $this->locale $l; return $this; }
  89.     public function getSource(): ?string { return $this->source; }
  90.     public function setSource(?string $s): self $this->source $s; return $this; }
  91.     public function getViews(): int { return $this->views ?? 0; }
  92.     public function setViews(int $v): self $this->views $v; return $this; }
  93.     public function incrementViews(): self $this->views = ($this->views ?? 0) + 1; return $this; }
  94.     public function getFirstSeenAt(): ?\DateTime { return $this->firstSeenAt; }
  95.     public function setFirstSeenAt(?\DateTime $d): self $this->firstSeenAt $d; return $this; }
  96.     public function getLastSeenAt(): ?\DateTime { return $this->lastSeenAt; }
  97.     public function setLastSeenAt(?\DateTime $d): self $this->lastSeenAt $d; return $this; }
  98. }