HasNeighbors applies on the given Selector a neighbors check.
(q *sql.Selector, s *Step)
| 238 | |
| 239 | // HasNeighbors applies on the given Selector a neighbors check. |
| 240 | func HasNeighbors(q *sql.Selector, s *Step) { |
| 241 | builder := sql.Dialect(q.Dialect()) |
| 242 | switch { |
| 243 | case s.ThroughEdgeTable(): |
| 244 | pk1 := s.Edge.Columns[0] |
| 245 | if s.Edge.Inverse { |
| 246 | pk1 = s.Edge.Columns[1] |
| 247 | } |
| 248 | join := builder.Table(s.Edge.Table).Schema(s.Edge.Schema) |
| 249 | q.Where( |
| 250 | sql.In( |
| 251 | q.C(s.From.Column), |
| 252 | builder.Select(join.C(pk1)).From(join), |
| 253 | ), |
| 254 | ) |
| 255 | case s.FromEdgeOwner(): |
| 256 | q.Where(sql.NotNull(q.C(s.Edge.Columns[0]))) |
| 257 | case s.ToEdgeOwner(): |
| 258 | to := builder.Table(s.Edge.Table).Schema(s.Edge.Schema) |
| 259 | // In case the edge reside on the same table, give |
| 260 | // the edge an alias to make qualifier different. |
| 261 | if s.From.Table == s.Edge.Table { |
| 262 | to.As(fmt.Sprintf("%s_edge", s.Edge.Table)) |
| 263 | } |
| 264 | q.Where( |
| 265 | sql.Exists( |
| 266 | builder.Select(to.C(s.Edge.Columns[0])). |
| 267 | From(to). |
| 268 | Where( |
| 269 | sql.ColumnsEQ( |
| 270 | q.C(s.From.Column), |
| 271 | to.C(s.Edge.Columns[0]), |
| 272 | ), |
| 273 | ), |
| 274 | ), |
| 275 | ) |
| 276 | } |
| 277 | } |
| 278 | |
| 279 | // HasNeighborsWith applies on the given Selector a neighbors check. |
| 280 | // The given predicate applies its filtering on the selector. |
searching dependent graphs…