(t *testing.T)
| 162 | } |
| 163 | |
| 164 | func TestSqlRewrite(t *testing.T) { |
| 165 | t.Parallel() |
| 166 | /* |
| 167 | SQL Re-writing is to take select statement with multiple sources (joins, sub-select) |
| 168 | and rewrite these sub-statements/sources into standalone statements |
| 169 | and prepare the column name, index mapping |
| 170 | |
| 171 | - Do we want to send the columns fully aliased? ie |
| 172 | SELECT name AS u.name, email as u.email, user_id as u.user_id FROM users |
| 173 | */ |
| 174 | s := `SELECT u.name, o.item_id, u.email, o.price |
| 175 | FROM users AS u INNER JOIN orders AS o |
| 176 | ON u.user_id = o.user_id;` |
| 177 | sql := parseOrPanic(t, s).(*rel.SqlSelect) |
| 178 | err := sql.Finalize() |
| 179 | assert.True(t, err == nil, "no error: %v", err) |
| 180 | assert.True(t, len(sql.Columns) == 4, "has 4 cols: %v", len(sql.Columns)) |
| 181 | assert.True(t, len(sql.From) == 2, "has 2 sources: %v", len(sql.From)) |
| 182 | |
| 183 | // Test the Left/Right column level parsing |
| 184 | // TODO: This field should not be u.name? sourcefield should be name right? as = u.name? |
| 185 | col, _ := sql.Columns.ByName("u.name") |
| 186 | assert.True(t, col.As == "u.name", "col.As=%s", col.As) |
| 187 | left, right, ok := col.LeftRight() |
| 188 | //u.Debugf("left=%v right=%v ok%v", left, right, ok) |
| 189 | assert.True(t, left == "u" && right == "name" && ok == true) |
| 190 | |
| 191 | rw1 := sql.From[0].Rewrite(sql) |
| 192 | assert.True(t, rw1 != nil, "should not be nil:") |
| 193 | assert.True(t, len(rw1.Columns) == 3, "has 3 cols: %v", rw1.Columns.String()) |
| 194 | //u.Infof("SQL?: '%v'", rw1.String()) |
| 195 | assert.Equal(t, rw1.String(), "SELECT name, email, user_id FROM users", "%v", rw1.String()) |
| 196 | |
| 197 | rw1 = sql.From[1].Rewrite(sql) |
| 198 | assert.True(t, rw1 != nil, "should not be nil:") |
| 199 | assert.True(t, len(rw1.Columns) == 3, "has 3 cols: %v", rw1.Columns.String()) |
| 200 | //u.Infof("SQL?: '%v'", rw1.String()) |
| 201 | assert.True(t, rw1.String() == "SELECT item_id, price, user_id FROM orders", "%v", rw1.String()) |
| 202 | |
| 203 | // Do we change? |
| 204 | //assert.Equal(t, sql.Columns.FieldNames(), []string{"user_id", "email", "item_id", "price"}) |
| 205 | |
| 206 | s = `SELECT u.name, u.email, b.title |
| 207 | FROM users AS u INNER JOIN blog AS b |
| 208 | ON u.name = b.author;` |
| 209 | sql = parseOrPanic(t, s).(*rel.SqlSelect) |
| 210 | assert.True(t, len(sql.Columns) == 3, "has 3 cols: %v", len(sql.Columns)) |
| 211 | assert.True(t, len(sql.From) == 2, "has 2 sources: %v", len(sql.From)) |
| 212 | rw1 = sql.From[0].Rewrite(sql) |
| 213 | assert.True(t, rw1 != nil, "should not be nil:") |
| 214 | assert.True(t, len(rw1.Columns) == 2, "has 2 cols: %v", rw1.Columns.String()) |
| 215 | //u.Infof("SQL?: '%v'", rw1.String()) |
| 216 | assert.True(t, rw1.String() == "SELECT name, email FROM users", "%v", rw1.String()) |
| 217 | jn := sql.From[0].JoinNodes() |
| 218 | assert.True(t, len(jn) == 1, "%v", jn) |
| 219 | assert.True(t, jn[0].String() == "name", "wanted 1 node %v", jn[0].String()) |
| 220 | cols := sql.From[0].UnAliasedColumns() |
| 221 | assert.True(t, len(cols) == 2, "Should have 2: %#v", cols) |
nothing calls this directly
no test coverage detected