app/Statistics/Repository/IndividualRepository.php
private function commonGivenQuery(string $sex, string $type, bool $show_tot, int $threshold, int $maxtoshow)
    {
        $query = DB::table('name')
            ->join('individuals', static function (JoinClause $join): void {
                $join
                    ->on('i_file', '=', 'n_file')
                    ->on('i_id', '=', 'n_id');
            })
            ->where('n_file', '=', $this->tree->id())
            ->where('n_type', '<>', '_MARNM')
            ->where('n_givn', '<>', '@P.N.')
            ->where(DB::raw('LENGTH(n_givn)'), '>', 1);

        switch ($sex) {
            case 'M':
            case 'F':
            case 'U':
                $query->where('i_sex', '=', $sex);
                break;

            case 'B':
            default:
                $query->where('i_sex', '<>', 'U');
                break;
        }

        $rows = $query
            ->groupBy(['n_givn'])
            ->select(['n_givn', DB::raw('COUNT(distinct n_id) AS count')])
            ->pluck('count', 'n_givn');

        $nameList = [];

        foreach ($rows as $n_givn => $count) {
            // Split “John Thomas” into “John” and “Thomas” and count against both totals
            foreach (explode(' ', $n_givn) as $given) {
                // Exclude initials and particles.
                if (!preg_match('/^([A-Z]|[a-z]{1,3})$/', $given)) {
                    if (array_key_exists($given, $nameList)) {
                        $nameList[$given] += (int) $count;
                    } else {
                        $nameList[$given] = (int) $count;
                    }
                }
            }
        }
        arsort($nameList);
        $nameList = array_slice($nameList, 0, $maxtoshow);

        foreach ($nameList as $given => $total) {
            if ($total < $threshold) {
                unset($nameList[$given]);
            }
        }

        switch ($type) {
            case 'chart':
                return $nameList;

            case 'table':
                return view('lists/given-names-table', [
                    'given_names' => $nameList,
                ]);

            case 'list':
                return view('lists/given-names-list', [
                    'given_names' => $nameList,
                    'show_totals' => $show_tot,
                ]);

            case 'nolist':
            default:
                array_walk($nameList, static function (string &$value, string $key) use ($show_tot): void {
                    if ($show_tot) {
                        $value = '<span dir="auto">' . e($key) . '</span>';
                    } else {
                        $value = '<span dir="auto">' . e($key) . '</span> (' . I18N::number((int) $value) . ')';
                    }
                });

                return implode(I18N::$list_separator, $nameList);
        }
    }
private function commonGivenQuery(string $sex, string $type, bool $show_tot, int $threshold, int $maxtoshow)
    {
        $query = DB::table('name')
            ->join('individuals', static function (JoinClause $join): void {
                $join
                    ->on('i_file', '=', 'n_file')
                    ->on('i_id', '=', 'n_id');
            })
            ->where('n_file', '=', $this->tree->id())
            ->where('n_type', '<>', '_MARNM')
            ->where('n_givn', '<>', '@P.N.')
            ->where(DB::raw('LENGTH(n_givn)'), '>', 1);

        switch ($sex) {
            case 'M':
            case 'F':
            case 'U':
                $query->where('i_sex', '=', $sex);
                break;

            case 'B':
            default:
                $query->where('i_sex', '<>', 'U');
                break;
        }

        $rows = $query
            ->groupBy(['n_givn'])
            ->select(['n_givn', DB::raw('COUNT(distinct n_id) AS count')])
            ->pluck('count', 'n_givn');

        $nameList = [];

        foreach ($rows as $n_givn => $count) {
            // Split “John Thomas” into “John” and “Thomas” and count against both totals
            foreach (explode(' ', $n_givn) as $given) {
                // Exclude initials and particles.
                if (!preg_match('/^([A-Z]|[a-z]{1,3})$/', $given)) {
                    if (array_key_exists($given, $nameList)) {
                        $nameList[$given] += (int) $count;
                    } else {
                        $nameList[$given] = (int) $count;
                    }
                }
            }
        }
        arsort($nameList);
        $nameList = array_slice($nameList, 0, $maxtoshow);

        foreach ($nameList as $given => $total) {
            if ($total < $threshold) {
                unset($nameList[$given]);
            }
        }

        switch ($type) {
            case 'chart':
                return $nameList;

            case 'table':
                return view('lists/given-names-table', [
                    'given_names' => $nameList,
                ]);

            case 'list':
                return view('lists/given-names-list', [
                    'given_names' => $nameList,
                    'show_totals' => $show_tot,
                ]);

            case 'nolist':
            default:
                array_walk($nameList, static function (string &$value, string $key) use ($show_tot): void {
                    if ($show_tot) {
                        $value = '<span dir="auto">' . e($key) . '</span>';
                    } else {
                        $value = '<span dir="auto">' . e($key) . '</span> (' . I18N::number((int) $value) . ')';
                    }
                });

                return implode(I18N::$list_separator, $nameList);
        }
    }
private function commonGivenQuery ( string $ sex , string $ type , bool $ show_tot , int $ threshold , int $ maxtoshow ) { $ query = DB :: table ( 'name' ) -> join ( 'individuals' , static function ( JoinClause $ join ) : void { $ join -> on ( 'i_file' , '=' , 'n_file' ) -> on ( 'i_id' , '=' , 'n_id' ) ; } ) -> where ( 'n_file' , '=' , $ this -> tree -> id ( ) ) -> where ( 'n_type' , '<>' , '_MARNM' ) -> where ( 'n_givn' , '<>' , '@P.N.' ) -> where ( DB :: raw ( 'LENGTH(n_givn)' ) , '>' , 1 ) ; switch ( $ sex ) { case 'M' : case 'F' : case 'U' : $ query -> where ( 'i_sex' , '=' , $ sex ) ; break ; case 'B' : default : $ query -> where ( 'i_sex' , '<>' , 'U' ) ; break ; } $ rows = $ query -> groupBy ( [ 'n_givn' ] ) -> select ( [ 'n_givn' , DB :: raw ( 'COUNT(distinct n_id) AS count' ) ] ) -> pluck ( 'count' , 'n_givn' ) ; $ nameList = [ ] ; foreach ( $ rows as $ n_givn => $ count ) { // Split “John Thomas” into “John” and “Thomas” and count against both totals foreach ( explode ( ' ' , $ n_givn ) as $ given ) { // Exclude initials and particles. if ( ! preg_match ( '/^([A-Z]|[a-z]{1,3})$/' , $ given ) ) { if ( array_key_exists ( $ given , $ nameList ) ) { $ nameList [ $ given ] += ( int ) $ count ; } else { $ nameList [ $ given ] = ( int ) $ count ; } } } } arsort ( $ nameList ) ; $ nameList = array_slice ( $ nameList , 0 , $ maxtoshow ) ; foreach ( $ nameList as $ given => $ total ) { if ( $ total < $ threshold ) { unset ( $ nameList [ $ given ] ) ; } } switch ( $ type ) { case 'chart' : return $ nameList ; case 'table' : return view ( 'lists/given-names-table' , [ 'given_names' => $ nameList , ] ) ; case 'list' : return view ( 'lists/given-names-list' , [ 'given_names' => $ nameList , 'show_totals' => $ show_tot , ] ) ; case 'nolist' : default : array_walk ( $ nameList , static function ( string & $ value , string $ key ) use ( $ show_tot ) : void { if ( $ show_tot ) { $ value = '<span dir="auto">' . e ( $ key ) . '</span>' ; } else { $ value = '<span dir="auto">' . e ( $ key ) . '</span> (' . I18N :: number ( ( int ) $ value ) . ')' ; } } ) ; return implode ( I18N :: $ list_separator , $ nameList ) ; } }
Find common given names.

@param string $sex
@param string $type
@param bool   $show_tot
@param int    $threshold
@param int    $maxtoshow

@return string|int[]
Find common given names .