data::tp_sql_join()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 34
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 25
CRAP Score 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 17
nc 6
nop 0
dl 0
loc 34
ccs 25
cts 25
cp 1
crap 4
rs 9.7
c 1
b 0
f 0
1
<?php
2
/**
3
 *
4
 * Topic Preview
5
 *
6
 * @copyright (c) 2013 Matt Friedman
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace vse\topicpreview\core;
12
13
class data extends base
14
{
15
	/**
16
	 * Update an SQL SELECT statement to get data needed for topic previews
17
	 *
18
	 * @return string SQL SELECT appendage
19
	 */
20 2
	public function tp_sql_select()
21
	{
22 2
		$sql = ', fp.post_text AS first_post_text';
23
24 2
		if ($this->last_post_enabled())
25 2
		{
26 2
			$sql .= ', lp.post_text AS last_post_text';
27 2
		}
28
29 2
		if ($this->avatars_enabled())
30 2
		{
31 2
			$sql .= $this->build_avatar_select('fp');
32
33 2
			if ($this->last_post_enabled())
34 2
			{
35 2
				$sql .= $this->build_avatar_select('lp');
36 2
			}
37 2
		}
38
39 2
		return $sql;
40
	}
41
42
	/**
43
	 * Update an SQL JOIN statement to get data needed for topic previews
44
	 *
45
	 * @return array SQL JOIN params
46
	 */
47 2
	public function tp_sql_join()
48
	{
49 2
		$sql_array = array();
50
51 2
		$sql_array['LEFT_JOIN'][] = array(
52 2
			'FROM'	=> array(POSTS_TABLE => 'fp'),
0 ignored issues
show
Bug introduced by
The constant vse\topicpreview\core\POSTS_TABLE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
53 2
			'ON'	=> 'fp.post_id = t.topic_first_post_id'
54 2
		);
55
56 2
		if ($this->avatars_enabled())
57 2
		{
58 2
			$sql_array['LEFT_JOIN'][] = array(
59 2
				'FROM'	=> array(USERS_TABLE => 'fpu'),
0 ignored issues
show
Bug introduced by
The constant vse\topicpreview\core\USERS_TABLE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
60
				'ON'	=> 'fpu.user_id = t.topic_poster'
61 2
			);
62 2
		}
63
64 2
		if ($this->last_post_enabled())
65 2
		{
66 2
			$sql_array['LEFT_JOIN'][] = array(
67 2
				'FROM'	=> array(POSTS_TABLE => 'lp'),
68
				'ON'	=> 'lp.post_id = t.topic_last_post_id'
69 2
			);
70
71 2
			if ($this->avatars_enabled())
72 2
			{
73 2
				$sql_array['LEFT_JOIN'][] = array(
74 2
					'FROM'	=> array(USERS_TABLE => 'lpu'),
75
					'ON'	=> 'lpu.user_id = t.topic_last_poster_id'
76 2
				);
77 2
			}
78 2
		}
79
80 2
		return $sql_array;
81
	}
82
83
	/**
84
	 * Modify SQL string|array to get post text
85
	 *
86
	 * @param string|array $sql_stmt SQL string or array to be modified
87
	 * @param string       $type     Type of SQL statement SELECT|JOIN
88
	 *
89
	 * @return string|array SQL statement string or array
90
	 */
91 3
	public function modify_sql($sql_stmt, $type)
92
	{
93 3
		if (!$this->is_enabled())
94 3
		{
95 1
			return $sql_stmt;
96
		}
97
98 2
		if (is_array($sql_stmt))
99 2
		{
100 1
			$sql_stmt = $this->build_join_array($sql_stmt);
101 1
			$sql_stmt['SELECT'] .= $this->tp_sql_select();
102 1
			return $sql_stmt;
103
		}
104
105 1
		if ($type === 'SELECT')
106 1
		{
107 1
			$sql_stmt .= $this->tp_sql_select();
108 1
			return $sql_stmt;
109
		}
110
111 1
		return $this->build_join_statement($sql_stmt);
112
	}
113
114
	/**
115
	 * Build select statement for user avatar fields, e.g.:
116
	 * ', fpu.user_avatar AS fp_avatar
117
	 *  , fpu.user_avatar_type AS fp_avatar_type
118
	 *  , fpu.user_avatar_width AS fp_avatar_width
119
	 *  , fpu.user_avatar_height AS fp_avatar_height'
120
	 *
121
	 * @param string $prefix First or last post (fp|lp)
122
	 *
123
	 * @return string Partial sql statement
124
	 */
125 2
	protected function build_avatar_select($prefix)
126
	{
127 2
		$sql = '';
128
129
		$avatar_ary = array(
130 2
			'user_avatar'        => 'avatar',
131 2
			'user_avatar_type'   => 'avatar_type',
132 2
			'user_avatar_width'  => 'avatar_width',
133 2
			'user_avatar_height' => 'avatar_height',
134 2
		);
135
136 2
		foreach ($avatar_ary as $key => $var)
137
		{
138 2
			$sql .= ", {$prefix}u.$key AS {$prefix}_$var";
139 2
		}
140
141 2
		return $sql;
142
	}
143
144
	/**
145
	 * Add LEFT_JOIN statements to an sql array
146
	 *
147
	 * @param array $sql_stmt An sql array
148
	 *
149
	 * @return array Updated sql array
150
	 */
151 1
	protected function build_join_array($sql_stmt)
152
	{
153 1
		$array = $this->tp_sql_join();
154
155 1
		foreach ($array['LEFT_JOIN'] as $join)
156
		{
157 1
			$sql_stmt['LEFT_JOIN'][] = $join;
158 1
		}
159
160 1
		return $sql_stmt;
161
	}
162
163
	/**
164
	 * Add LEFT_JOIN statements to an sql statement
165
	 *
166
	 * @param string $sql_stmt An sql statement
167
	 *
168
	 * @return string Updated sql statement
169
	 */
170 1
	protected function build_join_statement($sql_stmt)
171
	{
172 1
		$array = $this->tp_sql_join();
173
174 1
		foreach ($array['LEFT_JOIN'] as $join)
175
		{
176 1
			$sql_stmt .= ' LEFT JOIN ' . key($join['FROM']) . ' ' . current($join['FROM']) . ' ON (' . $join['ON'] . ')';
177 1
		}
178
179 1
		return $sql_stmt;
180
	}
181
}
182