File size: 4,715 Bytes
800aa60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

namespace Piwik\Tracker;

/**
 * Base class for LogTables. You need to create a log table eg if you want to be able to create a segment for a custom
 * log table.
 */
abstract class LogTable
{
    /**
     * Get the unprefixed database table name. For example 'log_visit' or 'log_action'.
     * @return string
     */
    abstract public function getName();

    /**
     * Get the name of the column that represents the primary key. For example "idvisit" or "idlink_va". If the table
     * does not have a unique ID for each row, you may choose a column that comes closest to it, for example "idvisit".
     * @return string
     */
    public function getIdColumn()
    {
        return '';
    }

    /**
     * Get the name of the column that can be used to join a visit with another table. This is the name of the column
     * that represents the "idvisit".
     * @return string
     */
    public function getColumnToJoinOnIdVisit()
    {
        return '';
    }

    /**
     * Get the name of the column that can be used to join an action with another table. This is the name of the column
     * that represents the "idaction".
     *
     * This could be more generic eg by specifying "$this->joinableOn = array('action' => 'idaction') and this
     * would allow to also add more complex structures in the future but not needed for now I'd say. Let's go with
     * simpler, more clean and expressive solution for now until needed.
     *
     * @return string
     */
    public function getColumnToJoinOnIdAction()
    {
        return '';
    }

    /**
     * If a table can neither be joined via idVisit nor idAction, it should be given a way to join with other tables
     * so the log table can be joined via idvisit through a different table joins.
     *
     * For this to work it requires the same column to be present in two tables. If for example you have a table
     * `log_foo_bar (idlogfoobar, idlogfoo)` and a table `log_foo(idlogfoo, idsite, idvisit)`, then you can in the
     * log table instance for `log_foo_bar` return `array('log_foo' => 'idlogfoo')`. This tells the core that a join
     * with that other log table is possible using the specified column.
     * @return array
     */
    public function getWaysToJoinToOtherLogTables()
    {
        return array();
    }

    /**
     * Defines whether this table should be joined via a subselect. Return true if a complex join is needed. (eg when
     * having visits and needing actions, or when having visits and needing conversions, or vice versa).
     * @return bool
     */
    public function shouldJoinWithSubSelect()
    {
        return false;
    }

    /**
     * Defines a column that stores the date/time at which time an entry was written or updated. Setting this
     * can help improve the performance of some archive queries. For example the log_link_visit_action table would define
     * server_time while log_visit would define visit_last_action_time
     * @return string
     */
    public function getDateTimeColumn()
    {
        return '';
    }

    /**
     * Returns the name of a log table that allows to join on a visit. Eg if there is a table "action", and it is not
     * joinable with "visit" table, it can return "log_link_visit_action" to be able to join the action table on visit
     * via this link table.
     *
     * In theory there could be case where it may be needed to join via two tables, so it could be needed at some
     * point to return an array of tables here. not sure if we should handle this case just yet. Alternatively,
     * once needed eg in LogQueryBuilder, we should maybe better call instead ->getLinkTableToBeAbleToJoinOnVisit()
     * again on the returned table until we have found a table that can be joined with visit.
     *
     * @return string
     */
    public function getLinkTableToBeAbleToJoinOnVisit()
    {
        return;
    }

    /**
     * Get the names of the columns that represents the primary key. For example "idvisit" or "idlink_va". If the table
     * defines the primary key based on multiple columns, you must specify them all
     * (eg array('idvisit', 'idgoal', 'buster')).
     *
     * @return array
     */
    public function getPrimaryKey()
    {
        return array();
    }

    /**
     * Defines if the log table holds an `idvisitor` column.
     * If set to yes, existing records are automatically updated when the visitor id changes during a visit
     *
     */
    public function hasIdVisitorColumn(): bool
    {
        return false;
    }
}