Metastatic.Analysis.BusinessLogic.MissingPreload (Metastatic v0.9.2)

View Source

Detects database queries without eager loading (N+1 query potential).

Universal pattern: accessing related data without preloading/prefetching.

Examples

Python (Django ORM without select_related):

users = User.objects.all()  # Should use select_related('profile')
for user in users:
    print(user.profile.bio)  # N+1 query - profile accessed in loop

JavaScript (Sequelize without include):

const users = await User.findAll();  # Should include: [{ model: Profile }]
users.forEach(user => {
    console.log(user.profile.bio);  # N+1 - profile fetched per user
});

Elixir (Ecto without preload):

users = Repo.all(User)  # Should use preload(:profile)
Enum.each(users, fn user ->
    IO.puts(user.profile.bio)  # N+1 - profile loaded per user
end)

C# (Entity Framework without Include):

var users = context.Users.ToList();  # Should use Include(u => u.Profile)
foreach (var user in users) {
    Console.WriteLine(user.Profile.Bio);  # Lazy loading - N+1 queries
}

Go (GORM without Preload):

var users []User
db.Find(&users)  # Should use Preload("Profile")
for _, user := range users {
    fmt.Println(user.Profile.Bio)  # N+1 - separate query per user
}

Java (Hibernate without JOIN FETCH):

List<User> users = session.createQuery("FROM User").list();  # Should use JOIN FETCH
for (User user : users) {
    System.out.println(user.getProfile().getBio());  # Lazy loading triggers N queries
}

Ruby (ActiveRecord without includes):

users = User.all  # Should use User.includes(:profile)
users.each do |user|
    puts user.profile.bio  # N+1 - profile query per user
end