Skip to content

Commit

Permalink
Merge pull request #795 from yubarajshrestha/feature/790
Browse files Browse the repository at this point in the history
Adds oldest, latest methods to QueryBuilder, fixes #790
  • Loading branch information
josephmancuso authored Oct 25, 2022
2 parents 19437ac + 8f248f0 commit fe9fff2
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/masoniteorm/models/Model.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ class Model(TimeStampsMixin, ObservesEvents, metaclass=ModelMeta):
"where_doesnt_have",
"with_",
"with_count",
"latest",
"oldest"
)
)

Expand Down
24 changes: 24 additions & 0 deletions src/masoniteorm/query/QueryBuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2266,3 +2266,27 @@ def get_schema(self):
return Schema(
connection=self.connection, connection_details=self._connection_details
)

def latest(self, *fields):
"""Gets the latest record.
Returns:
querybuilder
"""

if not fields:
fields = ("created_at",)

return self.order_by(column=",".join(fields), direction="DESC")

def oldest(self, *fields):
"""Gets the oldest record.
Returns:
querybuilder
"""

if not fields:
fields = ("created_at",)

return self.order_by(column=",".join(fields), direction="ASC")
24 changes: 24 additions & 0 deletions tests/mssql/builder/test_mssql_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,3 +411,27 @@ def test_truncate_without_foreign_keys(self):
builder = self.get_builder(dry=True)
sql = builder.truncate(foreign_keys=True)
self.assertEqual(sql, "TRUNCATE TABLE [users]")

def test_latest(self):
builder = self.get_builder()
builder.latest("email")
self.assertEqual(
builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC"
)

def test_latest_multiple(self):
builder = self.get_builder()
builder.latest("email", "created_at")
self.assertEqual(
builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC, [created_at] DESC"
)

def test_oldest(self):
builder = self.get_builder()
builder.oldest("email")
self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC")

def test_oldest_multiple(self):
builder = self.get_builder()
builder.oldest("email", "created_at")
self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC, [created_at] ASC")
28 changes: 28 additions & 0 deletions tests/mysql/builder/test_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -917,3 +917,31 @@ def update_lock(self):
builder.truncate()
"""
return "SELECT * FROM `users` WHERE `users`.`votes` >= '100' FOR UPDATE"

def test_latest(self):
builder = self.get_builder()
builder.latest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def test_oldest(self):
builder = self.get_builder()
builder.oldest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def latest(self):
"""
builder.order_by('email', 'des')
"""
return "SELECT * FROM `users` ORDER BY `email` DESC"

def oldest(self):
"""
builder.order_by('email', 'asc')
"""
return "SELECT * FROM `users` ORDER BY `email` ASC"
28 changes: 28 additions & 0 deletions tests/postgres/builder/test_postgres_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -772,3 +772,31 @@ def shared_lock(self):
builder.truncate()
"""
return """SELECT * FROM "users" WHERE "users"."votes" >= '100' FOR SHARE"""

def test_latest(self):
builder = self.get_builder()
builder.latest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def test_oldest(self):
builder = self.get_builder()
builder.oldest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def oldest(self):
"""
builder.order_by('email', 'asc')
"""
return """SELECT * FROM "users" ORDER BY "email" ASC"""

def latest(self):
"""
builder.order_by('email', 'des')
"""
return """SELECT * FROM "users" ORDER BY "email" DESC"""
28 changes: 28 additions & 0 deletions tests/sqlite/builder/test_sqlite_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -971,3 +971,31 @@ def truncate_without_foreign_keys(self):
'DELETE FROM "users"',
"PRAGMA foreign_keys = ON",
]

def test_latest(self):
builder = self.get_builder()
builder.latest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def test_oldest(self):
builder = self.get_builder()
builder.oldest('email')
sql = getattr(
self, inspect.currentframe().f_code.co_name.replace("test_", "")
)()
self.assertEqual(builder.to_sql(), sql)

def oldest(self):
"""
builder.order_by('email', 'asc')
"""
return """SELECT * FROM "users" ORDER BY "email" ASC"""

def latest(self):
"""
builder.order_by('email', 'des')
"""
return """SELECT * FROM "users" ORDER BY "email" DESC"""

0 comments on commit fe9fff2

Please sign in to comment.