Skip to content

Instantly share code, notes, and snippets.

@corajr
Last active June 18, 2019 21:28
Show Gist options
  • Save corajr/ff7a13e930376cfe9f5712e0f49c6997 to your computer and use it in GitHub Desktop.
Save corajr/ff7a13e930376cfe9f5712e0f49c6997 to your computer and use it in GitHub Desktop.
from __future__ import absolute_import
from google.appengine.ext import ndb
from appengine import backup_model
from appengine import db_decorators
@db_decorators.written_in_transaction_model()
class ActivitySessionSubentity(ndb.Model):
activity_type = ndb.StringProperty(indexed=True)
event_timestamp = ndb.DateTimeProperty(indexed=False)
content_id = ndb.StringProperty(indexed=False)
content_commit_sha = ndb.StringProperty(indexed=False)
assigned_course_mastery_goal_id = ndb.StringProperty(indexed=False)
learning_time_ms = ndb.IntegerProperty(indexed=False)
in_school = ndb.BooleanProperty(indexed=False)
# The following are only set for exercise-type activities.
problems_correct = ndb.IntegerProperty(indexed=False)
problems_total = ndb.IntegerProperty(indexed=False)
mastery_level_changes = ndb.JsonProperty(indexed=False, compressed=True)
@db_decorators.written_in_transaction_model()
class DailyStudentReport(backup_model.BackupModelNDB):
kaid = ndb.StringProperty(indexed=True)
date = ndb.DateTimeProperty(indexed=True)
sessions = ndb.StructuredProperty(ActivitySessionSubentity,
indexed=True, repeated=True)
@db_decorators.written_in_transaction_model()
class ActivitySession(ndb.Model):
kaid = ndb.StringProperty(indexed=True)
event_timestamp = ndb.DateTimeProperty(indexed=True)
activity_type = ndb.StringProperty(indexed=True)
content_id = ndb.StringProperty(indexed=False)
content_commit_sha = ndb.StringProperty(indexed=False)
assigned_course_mastery_goal_id = ndb.StringProperty(indexed=False)
learning_time_ms = ndb.IntegerProperty(indexed=False)
in_school = ndb.BooleanProperty(indexed=False)
# The following are only set for exercise-type activities.
problems_correct = ndb.IntegerProperty(indexed=False)
problems_total = ndb.IntegerProperty(indexed=False)
mastery_level_changes = ndb.JsonProperty(indexed=False, compressed=True)
@db_decorators.written_in_transaction_model()
class DailyActivityTime(backup_model.BackupModelNDB):
kaid = ndb.StringProperty(indexed=True)
date = ndb.DateTimeProperty(indexed=True)
exercise_learning_time_ms = ndb.IntegerProperty(indexed=False)
outside_school_learning_time_ms = ndb.IntegerProperty(indexed=False)
total_learning_time_ms = ndb.IntegerProperty(indexed=False)
from __future__ import absolute_import
from accounts import fake_user
from appengine.gae_testutil import gae_testcase
from progress import daily_student_report
from shared.testutil import fake_datetime
ActivitySessionSubentity = daily_student_report.ActivitySessionSubentity
DailyStudentReport = daily_student_report.DailyStudentReport
ActivitySession = daily_student_report.ActivitySession
class DailyStudentReportTest(gae_testcase.GAETestCase):
def setUp(self):
super(DailyStudentReportTest, self).setUp(
db_consistency_probability=1,
use_test_db=True)
self.user = fake_user.insert_user('individual_student_report')
self.mastery_level_changes = {}
for i in xrange(10):
exercise_title = u"Mastering the exercise called {}".format(i)
self.mastery_level_changes[exercise_title] = {
'before': 'unfamiliar',
'after': 'proficient'
}
def test_size_option_1(self):
# Create an example daily entity and check its size.
datetime = fake_datetime.push_fake_datetime()
now = datetime.datetime.now()
dsr = DailyStudentReport(kaid=self.user.kaid, date=now)
example_video_session = ActivitySessionSubentity(
activity_type="Video",
event_timestamp=now,
content_id="x123456789",
content_commit_sha="f8e092b03408a460a13ac809effa121472bf3f87",
learning_time_ms=10000,
in_school=True,
assigned_course_mastery_goal_id="x912345678")
example_article_session = ActivitySessionSubentity(
activity_type="Article",
event_timestamp=now,
content_id="x987654321",
content_commit_sha="f8e092b03408a460a13ac809effa121472bf3f87",
learning_time_ms=10000,
in_school=True,
assigned_course_mastery_goal_id="x912345678")
example_exercise_session = ActivitySessionSubentity(
activity_type="TopicQuiz",
event_timestamp=now,
content_id="x21324354657",
content_commit_sha="f8e092b03408a460a13ac809effa121472bf3f87",
assigned_course_mastery_goal_id="x912345678",
learning_time_ms=10000,
in_school=False,
problems_correct=10,
problems_total=10,
mastery_level_changes=self.mastery_level_changes)
for _ in xrange(2):
dsr.sessions.append(example_video_session)
dsr.sessions.append(example_article_session)
dsr.sessions.append(example_exercise_session)
size = len(dsr._to_pb().Encode())
print "Option 1: {} bytes".format(size)
datetime = fake_datetime.pop_fake_datetime()
def test_size_option_2(self):
# Create an example daily entity and check its size.
datetime = fake_datetime.push_fake_datetime()
now = datetime.datetime.now()
example_article_session = ActivitySessionSubentity(
activity_type="Article",
event_timestamp=now,
content_id="x987654321",
content_commit_sha="f8e092b03408a460a13ac809effa121472bf3f87",
learning_time_ms=10000,
in_school=True,
assigned_course_mastery_goal_id="x912345678")
example_video_session = ActivitySession(
kaid=self.user.kaid,
event_timestamp=now,
activity_type="Video",
content_id="x123456789",
learning_time_ms=10000,
in_school=True,
assigned_course_mastery_goal_id="x912345678")
example_exercise_session = ActivitySession(
kaid=self.user.kaid,
event_timestamp=now,
activity_type="TopicQuiz",
content_id="x123456789",
assigned_course_mastery_goal_id="x912345678",
learning_time_ms=10000,
in_school=False,
problems_correct=10,
problems_total=10,
mastery_level_changes=self.mastery_level_changes)
sessions = []
for _ in xrange(2):
sessions.append(example_video_session)
sessions.append(example_exercise_session)
sessions.append(example_article_session)
size = sum(len(session._to_pb().Encode()) for session in sessions)
print "Option 2: {} bytes".format(size)
datetime = fake_datetime.pop_fake_datetime()
def test_size_daily_entities(self):
datetime = fake_datetime.push_fake_datetime()
now = datetime.datetime.now()
time_entity = daily_student_report.DailyActivityTime(
kaid=self.user.kaid,
date=now,
exercise_learning_time_ms=10000,
outside_school_learning_time_ms=10000,
total_learning_time_ms=10000,
)
size = len(time_entity._to_pb().Encode()) * 4
print "Timekeeping Option 2: {} bytes per day".format(size)
datetime = fake_datetime.pop_fake_datetime()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment