Last active
June 18, 2019 21:28
-
-
Save corajr/ff7a13e930376cfe9f5712e0f49c6997 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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