.
*/
declare(strict_types=1);
namespace Fisharebest\Webtrees;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Module\ModuleInterface;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Statistics\Repository\BrowserRepository;
use Fisharebest\Webtrees\Statistics\Repository\ContactRepository;
use Fisharebest\Webtrees\Statistics\Repository\EventRepository;
use Fisharebest\Webtrees\Statistics\Repository\FamilyDatesRepository;
use Fisharebest\Webtrees\Statistics\Repository\FamilyRepository;
use Fisharebest\Webtrees\Statistics\Repository\FavoritesRepository;
use Fisharebest\Webtrees\Statistics\Repository\GedcomRepository;
use Fisharebest\Webtrees\Statistics\Repository\HitCountRepository;
use Fisharebest\Webtrees\Statistics\Repository\IndividualRepository;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\BrowserRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\ContactRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\EventRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\FamilyDatesRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\FavoritesRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\GedcomRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\HitCountRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\IndividualRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\LatestUserRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\MediaRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\MessageRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\NewsRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\PlaceRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\ServerRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\UserRepositoryInterface;
use Fisharebest\Webtrees\Statistics\Repository\LatestUserRepository;
use Fisharebest\Webtrees\Statistics\Repository\MediaRepository;
use Fisharebest\Webtrees\Statistics\Repository\MessageRepository;
use Fisharebest\Webtrees\Statistics\Repository\NewsRepository;
use Fisharebest\Webtrees\Statistics\Repository\PlaceRepository;
use Fisharebest\Webtrees\Statistics\Repository\ServerRepository;
use Fisharebest\Webtrees\Statistics\Repository\UserRepository;
use Fisharebest\Webtrees\Statistics\Service\CenturyService;
use Fisharebest\Webtrees\Statistics\Service\ColorService;
use Fisharebest\Webtrees\Statistics\Service\CountryService;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Collection;
use ReflectionClass;
use ReflectionException;
use ReflectionMethod;
use ReflectionNamedType;
use function call_user_func;
use function count;
use function in_array;
use function str_contains;
/**
* A selection of pre-formatted statistical queries.
* These are primarily used for embedded keywords on HTML blocks, but
* are also used elsewhere in the code.
*/
class Statistics implements
GedcomRepositoryInterface,
IndividualRepositoryInterface,
EventRepositoryInterface,
MediaRepositoryInterface,
UserRepositoryInterface,
ServerRepositoryInterface,
BrowserRepositoryInterface,
HitCountRepositoryInterface,
LatestUserRepositoryInterface,
FavoritesRepositoryInterface,
NewsRepositoryInterface,
MessageRepositoryInterface,
ContactRepositoryInterface,
FamilyDatesRepositoryInterface,
PlaceRepositoryInterface
{
private Tree $tree;
private GedcomRepository $gedcom_repository;
private IndividualRepository $individual_repository;
private FamilyRepository $family_repository;
private MediaRepository $media_repository;
private EventRepository $event_repository;
private UserRepository $user_repository;
private ServerRepository $server_repository;
private BrowserRepository $browser_repository;
private HitCountRepository $hit_count_repository;
private LatestUserRepository $latest_user_repository;
private FavoritesRepository $favorites_repository;
private NewsRepository $news_repository;
private MessageRepository $message_repository;
private ContactRepository $contact_repository;
private FamilyDatesRepository $family_dates_repository;
private PlaceRepository $place_repository;
private ModuleService $module_service;
/**
* Create the statistics for a tree.
*
* @param CenturyService $century_service
* @param ColorService $color_service
* @param CountryService $country_service
* @param ModuleService $module_service
* @param Tree $tree Generate statistics for this tree
* @param UserService $user_service
*/
public function __construct(
CenturyService $century_service,
ColorService $color_service,
CountryService $country_service,
ModuleService $module_service,
Tree $tree,
UserService $user_service
) {
$this->tree = $tree;
$this->gedcom_repository = new GedcomRepository($tree);
$this->individual_repository = new IndividualRepository($century_service, $color_service, $tree);
$this->family_repository = new FamilyRepository($century_service, $color_service, $tree);
$this->family_dates_repository = new FamilyDatesRepository($tree);
$this->media_repository = new MediaRepository($color_service, $tree);
$this->event_repository = new EventRepository($tree);
$this->user_repository = new UserRepository($tree, $user_service);
$this->server_repository = new ServerRepository();
$this->browser_repository = new BrowserRepository();
$this->hit_count_repository = new HitCountRepository($tree, $user_service);
$this->latest_user_repository = new LatestUserRepository($user_service);
$this->favorites_repository = new FavoritesRepository($tree, $module_service);
$this->news_repository = new NewsRepository($tree);
$this->message_repository = new MessageRepository();
$this->contact_repository = new ContactRepository($tree, $user_service);
$this->place_repository = new PlaceRepository($tree, $country_service, $this->individual_repository);
$this->module_service = $module_service;
}
/**
* Return a string of all supported tags and an example of its output in table row form.
*
* @return string
*/
public function getAllTagsTable(): string
{
try {
$class = new ReflectionClass($this);
$public_methods = $class->getMethods(ReflectionMethod::IS_PUBLIC);
$examples = Collection::make($public_methods)
->filter(static function (ReflectionMethod $method): bool {
return !in_array($method->getName(), ['embedTags', 'getAllTagsTable'], true);
})
->filter(static function (ReflectionMethod $method): bool {
$type = $method->getReturnType();
return $type instanceof ReflectionNamedType && $type->getName() === 'string';
})
->sort(static function (ReflectionMethod $x, ReflectionMethod $y): int {
return $x->getName() <=> $y->getName();
})
->map(function (ReflectionMethod $method): string {
$tag = $method->getName();
return '
#' . $tag . '#
' . call_user_func([$this, $tag]) . '
';
});
return '
' . $examples->implode('') . '
';
} catch (ReflectionException $ex) {
return $ex->getMessage();
}
}
/**
* Embed tags in text
*
* @param string $text
*
* @return string
*/
public function embedTags(string $text): string
{
if (str_contains($text, '#')) {
$text = strtr($text, $this->getTags($text));
}
return $text;
}
/**
* @return string
*/
public function gedcomFilename(): string
{
return $this->gedcom_repository->gedcomFilename();
}
/**
* @return int
*/
public function gedcomId(): int
{
return $this->gedcom_repository->gedcomId();
}
/**
* @return string
*/
public function gedcomTitle(): string
{
return $this->gedcom_repository->gedcomTitle();
}
/**
* @return string
*/
public function gedcomCreatedSoftware(): string
{
return $this->gedcom_repository->gedcomCreatedSoftware();
}
/**
* @return string
*/
public function gedcomCreatedVersion(): string
{
return $this->gedcom_repository->gedcomCreatedVersion();
}
/**
* @return string
*/
public function gedcomDate(): string
{
return $this->gedcom_repository->gedcomDate();
}
/**
* @return string
*/
public function gedcomUpdated(): string
{
return $this->gedcom_repository->gedcomUpdated();
}
/**
* @return string
*/
public function gedcomRootId(): string
{
return $this->gedcom_repository->gedcomRootId();
}
/**
* @return string
*/
public function totalRecords(): string
{
return $this->individual_repository->totalRecords();
}
/**
* @return string
*/
public function totalIndividuals(): string
{
return $this->individual_repository->totalIndividuals();
}
/**
* @return string
*/
public function totalIndisWithSources(): string
{
return $this->individual_repository->totalIndisWithSources();
}
/**
* @param string|null $color_from
* @param string|null $color_to
*
* @return string
*/
public function chartIndisWithSources(
string $color_from = null,
string $color_to = null
): string {
return $this->individual_repository->chartIndisWithSources($color_from, $color_to);
}
/**
* @return string
*/
public function totalIndividualsPercentage(): string
{
return $this->individual_repository->totalIndividualsPercentage();
}
/**
* @return string
*/
public function totalFamilies(): string
{
return $this->individual_repository->totalFamilies();
}
/**
* @return string
*/
public function totalFamiliesPercentage(): string
{
return $this->individual_repository->totalFamiliesPercentage();
}
/**
* @return string
*/
public function totalFamsWithSources(): string
{
return $this->individual_repository->totalFamsWithSources();
}
/**
* @param string|null $color_from
* @param string|null $color_to
*
* @return string
*/
public function chartFamsWithSources(
string $color_from = null,
string $color_to = null
): string {
return $this->individual_repository->chartFamsWithSources($color_from, $color_to);
}
/**
* @return string
*/
public function totalSources(): string
{
return $this->individual_repository->totalSources();
}
/**
* @return string
*/
public function totalSourcesPercentage(): string
{
return $this->individual_repository->totalSourcesPercentage();
}
/**
* @return string
*/
public function totalNotes(): string
{
return $this->individual_repository->totalNotes();
}
/**
* @return string
*/
public function totalNotesPercentage(): string
{
return $this->individual_repository->totalNotesPercentage();
}
/**
* @return string
*/
public function totalRepositories(): string
{
return $this->individual_repository->totalRepositories();
}
/**
* @return string
*/
public function totalRepositoriesPercentage(): string
{
return $this->individual_repository->totalRepositoriesPercentage();
}
/**
* @param array ...$params
*
* @return string
*/
public function totalSurnames(...$params): string
{
return $this->individual_repository->totalSurnames(...$params);
}
/**
* @param array ...$params
*
* @return string
*/
public function totalGivennames(...$params): string
{
return $this->individual_repository->totalGivennames(...$params);
}
/**
* @param array $events
*
* @return string
*/
public function totalEvents(array $events = []): string
{
return $this->event_repository->totalEvents($events);
}
/**
* @return string
*/
public function totalEventsBirth(): string
{
return $this->event_repository->totalEventsBirth();
}
/**
* @return string
*/
public function totalBirths(): string
{
return $this->event_repository->totalBirths();
}
/**
* @return string
*/
public function totalEventsDeath(): string
{
return $this->event_repository->totalEventsDeath();
}
/**
* @return string
*/
public function totalDeaths(): string
{
return $this->event_repository->totalDeaths();
}
/**
* @return string
*/
public function totalEventsMarriage(): string
{
return $this->event_repository->totalEventsMarriage();
}
/**
* @return string
*/
public function totalMarriages(): string
{
return $this->event_repository->totalMarriages();
}
/**
* @return string
*/
public function totalEventsDivorce(): string
{
return $this->event_repository->totalEventsDivorce();
}
/**
* @return string
*/
public function totalDivorces(): string
{
return $this->event_repository->totalDivorces();
}
/**
* @return string
*/
public function totalEventsOther(): string
{
return $this->event_repository->totalEventsOther();
}
/**
* @return string
*/
public function totalSexMales(): string
{
return $this->individual_repository->totalSexMales();
}
/**
* @return string
*/
public function totalSexMalesPercentage(): string
{
return $this->individual_repository->totalSexMalesPercentage();
}
/**
* @return string
*/
public function totalSexFemales(): string
{
return $this->individual_repository->totalSexFemales();
}
/**
* @return string
*/
public function totalSexFemalesPercentage(): string
{
return $this->individual_repository->totalSexFemalesPercentage();
}
/**
* @return string
*/
public function totalSexUnknown(): string
{
return $this->individual_repository->totalSexUnknown();
}
/**
* @return string
*/
public function totalSexUnknownPercentage(): string
{
return $this->individual_repository->totalSexUnknownPercentage();
}
/**
* @param string|null $color_female
* @param string|null $color_male
* @param string|null $color_unknown
*
* @return string
*/
public function chartSex(
string $color_female = null,
string $color_male = null,
string $color_unknown = null
): string {
return $this->individual_repository->chartSex($color_female, $color_male, $color_unknown);
}
/**
* @return string
*/
public function totalLiving(): string
{
return $this->individual_repository->totalLiving();
}
/**
* @return string
*/
public function totalLivingPercentage(): string
{
return $this->individual_repository->totalLivingPercentage();
}
/**
* @return string
*/
public function totalDeceased(): string
{
return $this->individual_repository->totalDeceased();
}
/**
* @return string
*/
public function totalDeceasedPercentage(): string
{
return $this->individual_repository->totalDeceasedPercentage();
}
/**
* @param string|null $color_living
* @param string|null $color_dead
*
* @return string
*/
public function chartMortality(string $color_living = null, string $color_dead = null): string
{
return $this->individual_repository->chartMortality($color_living, $color_dead);
}
/**
* @return string
*/
public function totalMedia(): string
{
return $this->media_repository->totalMedia();
}
/**
* @return string
*/
public function totalMediaAudio(): string
{
return $this->media_repository->totalMediaAudio();
}
/**
* @return string
*/
public function totalMediaBook(): string
{
return $this->media_repository->totalMediaBook();
}
/**
* @return string
*/
public function totalMediaCard(): string
{
return $this->media_repository->totalMediaCard();
}
/**
* @return string
*/
public function totalMediaCertificate(): string
{
return $this->media_repository->totalMediaCertificate();
}
/**
* @return string
*/
public function totalMediaCoatOfArms(): string
{
return $this->media_repository->totalMediaCoatOfArms();
}
/**
* @return string
*/
public function totalMediaDocument(): string
{
return $this->media_repository->totalMediaDocument();
}
/**
* @return string
*/
public function totalMediaElectronic(): string
{
return $this->media_repository->totalMediaElectronic();
}
/**
* @return string
*/
public function totalMediaMagazine(): string
{
return $this->media_repository->totalMediaMagazine();
}
/**
* @return string
*/
public function totalMediaManuscript(): string
{
return $this->media_repository->totalMediaManuscript();
}
/**
* @return string
*/
public function totalMediaMap(): string
{
return $this->media_repository->totalMediaMap();
}
/**
* @return string
*/
public function totalMediaFiche(): string
{
return $this->media_repository->totalMediaFiche();
}
/**
* @return string
*/
public function totalMediaFilm(): string
{
return $this->media_repository->totalMediaFilm();
}
/**
* @return string
*/
public function totalMediaNewspaper(): string
{
return $this->media_repository->totalMediaNewspaper();
}
/**
* @return string
*/
public function totalMediaPainting(): string
{
return $this->media_repository->totalMediaPainting();
}
/**
* @return string
*/
public function totalMediaPhoto(): string
{
return $this->media_repository->totalMediaPhoto();
}
/**
* @return string
*/
public function totalMediaTombstone(): string
{
return $this->media_repository->totalMediaTombstone();
}
/**
* @return string
*/
public function totalMediaVideo(): string
{
return $this->media_repository->totalMediaVideo();
}
/**
* @return string
*/
public function totalMediaOther(): string
{
return $this->media_repository->totalMediaOther();
}
/**
* @return string
*/
public function totalMediaUnknown(): string
{
return $this->media_repository->totalMediaUnknown();
}
/**
* @param string|null $color_from
* @param string|null $color_to
*
* @return string
*/
public function chartMedia(string $color_from = null, string $color_to = null): string
{
return $this->media_repository->chartMedia($color_from, $color_to);
}
/**
* @param string $what
* @param string $fact
* @param int $parent
* @param bool $country
*
* @return array