diff --git a/hive/db/schema.py b/hive/db/schema.py index fa2b8fcd155a2be1916c1280628cbe0e87e1b753..a06125cf9094f6a9a4b19d37f8025ada9900fd91 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -560,6 +560,74 @@ def setup(db): """ db.query_no_return(sql) + # In original hivemind, a value of 'active_at' was calculated from + # max + # { + # created ( account_create_operation ), + # last_account_update ( account_update_operation/account_update2_operation ), + # last_post ( comment_operation - only creation ) + # last_root_post ( comment_operation - only creation + only ROOT ), + # last_vote_time ( vote_operation ) + # } + # In order to simplify calculations, `last_account_update` is not taken into consideration, because this updating accounts is very rare + # and posting/voting after an account updating, fixes `active_at` value immediately. + + sql = """ + DROP VIEW IF EXISTS public.hive_accounts_info_view; + + CREATE OR REPLACE VIEW public.hive_accounts_info_view + AS + SELECT + id, + name, + COALESCE( + ( + select count(*) post_count + FROM hive_posts hp + WHERE ha.id=hp.author_id + GROUP BY hp.author_id + ), + 0 + ) post_count, + COALESCE( + ( + select max(hp.created_at) + FROM hive_posts hp + WHERE ha.id=hp.author_id + GROUP BY hp.author_id + ), + '1970-01-01 00:00:00.0' + ) post_active_at, + COALESCE( + ( + select max(hv.last_update) + from hive_votes hv + WHERE ha.id=hv.voter_id + GROUP BY hv.voter_id + ), + '1970-01-01 00:00:00.0' + ) AS vote_active_at, + created_at, + display_name, + about, + reputation, + profile_image, + location, + website, + cover_image, + rank, + following, + followers, + proxy, + proxy_weight, + lastread_at, + cached_at, + raw_json + FROM + hive_accounts ha + """ + db.query_no_return(sql) + sql = """ DROP VIEW IF EXISTS public.hive_posts_view; diff --git a/hive/server/bridge_api/objects.py b/hive/server/bridge_api/objects.py index eec588ef24ca68105a1eee78fcaf051279bf7085..1d185af61c69eaadcc90c63ae0604d420fe35230 100644 --- a/hive/server/bridge_api/objects.py +++ b/hive/server/bridge_api/objects.py @@ -201,7 +201,7 @@ def _condenser_profile_object(row): 'id': row['id'], 'name': row['name'], 'created': json_date(row['created_at']), - 'active': json_date(row['active_at']), + 'active': json_date(max( row['created_at'], row['post_active_at'], row['vote_active_at'] )), 'post_count': row['post_count'], 'reputation': row['reputation'], 'blacklists': blacklists, diff --git a/hive/server/condenser_api/cursor.py b/hive/server/condenser_api/cursor.py index 3d4d0ecf5233f76613176a571f814c6e33486075..1094b03762f8daf249bb77b95c33d1ec037d1d98 100644 --- a/hive/server/condenser_api/cursor.py +++ b/hive/server/condenser_api/cursor.py @@ -439,11 +439,8 @@ async def get_accounts(db, accounts: list): ret = [] names = ["'{}'".format(a) for a in accounts] - sql = """SELECT created_at, reputation, display_name, about, - location, website, profile_image, cover_image, followers, following, - proxy, post_count, proxy_weight, vote_weight, rank, - lastread_at, active_at, cached_at, raw_json - FROM hive_accounts WHERE name IN ({})""".format(",".join(names)) + sql = """SELECT * + FROM hive_accounts_info_view WHERE name IN ({})""".format(",".join(names)) result = await db.query_all(sql) for row in result: @@ -466,7 +463,9 @@ async def get_accounts(db, accounts: list): account_data['vote_weight'] = row.vote_weight account_data['rank'] = row.rank account_data['lastread_at'] = row.lastread_at.isoformat() - account_data['active_at'] = row.active_at.isoformat() + + account_data['active_at'] = max( row.created_at, row.post_active_at, row.vote_active_at ).isoformat() + account_data['cached_at'] = row.cached_at.isoformat() ret.append(account_data)