Use last squeak entry as field in pagination rpc (#1177)

* Update timeline to use more efficient pagination rpc with last entry

* Update address squeaks to use more efficient pagination rpc with last entry

* Update reply squeaks to use more efficient pagination rpc with last entry

* Use last_entry as param in get_timeline db query function

* Use last_entry as param in get address squeaks db query function

* Use last_entry as param in get reply squeaks db query function
This commit is contained in:
Jonathan Zernik 2021-09-04 08:31:24 -07:00 committed by GitHub
parent cb10b2f6c4
commit 47be5c96f9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 112 additions and 158 deletions

View file

@ -52,9 +52,9 @@ export default function SqueakPage() {
getAncestorSqueakDisplaysRequest(hash, handleLoadedAncestorSqueaks);
};
const subscribeAncestorSqueaks = (hash) => subscribeAncestorSqueakDisplaysRequest(hash, setAncestorSqueaks);
const getReplySqueaks = (hash, limit, blockHeight, squeakTime, squeakHash) => {
const getReplySqueaks = (hash, limit, lastEntry) => {
setWaitingForReplySqueaks(true);
getReplySqueakDisplaysRequest(hash, limit, blockHeight, squeakTime, squeakHash, handleLoadedReplySqueaks);
getReplySqueakDisplaysRequest(hash, limit, lastEntry, handleLoadedReplySqueaks);
};
const subscribeReplySqueaks = (hash) => subscribeReplySqueakDisplaysRequest(hash, (resp) => {
setReplySqueaks((prevReplySqueaks) => prevReplySqueaks.concat(resp));
@ -107,7 +107,7 @@ export default function SqueakPage() {
return () => stream.cancel();
}, [hash]);
useEffect(() => {
getReplySqueaks(hash, SQUEAKS_PER_PAGE, null, null, null);
getReplySqueaks(hash, SQUEAKS_PER_PAGE, null);
}, [hash]);
useEffect(() => {
const stream = subscribeReplySqueaks(hash);
@ -234,10 +234,7 @@ export default function SqueakPage() {
disabled={waitingForReplySqueaks}
onClick={() => {
const latestSqueak = replySqueaks.slice(-1).pop();
const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null);
const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null);
const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null);
getReplySqueaks(hash, SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash);
getReplySqueaks(hash, SQUEAKS_PER_PAGE, latestSqueak);
}}
>
<ReplayIcon />

View file

@ -49,9 +49,9 @@ export default function SqueakAddressPage() {
const getSqueakProfile = (address) => {
getSqueakProfileByAddressRequest(address, setSqueakProfile);
};
const getSqueaks = (address, limit, blockHeight, squeakTime, squeakHash) => {
const getSqueaks = (address, limit, lastEntry) => {
setWaitingForSqueaks(true);
getAddressSqueakDisplaysRequest(address, limit, blockHeight, squeakTime, squeakHash, handleLoadedAddressSqueaks);
getAddressSqueakDisplaysRequest(address, limit, lastEntry, handleLoadedAddressSqueaks);
};
const subscribeSqueaks = (address) => subscribeAddressSqueakDisplaysRequest(address, (resp) => {
setSqueaks((prevSqueaks) => [resp].concat(prevSqueaks));
@ -90,7 +90,7 @@ export default function SqueakAddressPage() {
getSqueakProfile(address);
}, [address]);
useEffect(() => {
getSqueaks(address, SQUEAKS_PER_PAGE, null, null, null);
getSqueaks(address, SQUEAKS_PER_PAGE, null);
}, [address]);
useEffect(() => {
const stream = subscribeSqueaks(address);
@ -247,10 +247,7 @@ export default function SqueakAddressPage() {
disabled={waitingForSqueaks}
onClick={() => {
const latestSqueak = squeaks.slice(-1).pop();
const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null);
const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null);
const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null);
getSqueaks(address, SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash);
getSqueaks(address, SQUEAKS_PER_PAGE, latestSqueak);
}}
>
<ReplayIcon />

View file

@ -43,9 +43,9 @@ export default function TimelinePage() {
const history = useHistory();
const getSqueaks = (limit, blockHeight, squeakTime, squeakHash) => {
const getSqueaks = (limit, lastEntry) => {
setWaitingForTimeline(true);
getTimelineSqueakDisplaysRequest(limit, blockHeight, squeakTime, squeakHash, handleLoadedTimeline, alertFailedRequest);
getTimelineSqueakDisplaysRequest(limit, lastEntry, handleLoadedTimeline, alertFailedRequest);
};
const subscribeNewSqueaks = () => subscribeTimelineSqueakDisplaysRequest(handleLoadedNewSqueak);
const getNetwork = () => {
@ -67,7 +67,7 @@ export default function TimelinePage() {
const handleClickRefresh = () => {
setSqueaks(null);
setNewSqueaks(null);
getSqueaks(SQUEAKS_PER_PAGE, null, null, null);
getSqueaks(SQUEAKS_PER_PAGE, null);
};
const handleLoadedTimeline = (loadedSqueaks) => {
@ -90,7 +90,7 @@ export default function TimelinePage() {
};
useEffect(() => {
getSqueaks(SQUEAKS_PER_PAGE, null, null, null);
getSqueaks(SQUEAKS_PER_PAGE, null);
}, []);
useEffect(() => {
const stream = subscribeNewSqueaks();
@ -148,10 +148,7 @@ export default function TimelinePage() {
disabled={waitingForTimeline}
onClick={() => {
const latestSqueak = squeaks.slice(-1).pop();
const latestSqueakHeight = (latestSqueak ? latestSqueak.getBlockHeight() : null);
const latestSqueakTime = (latestSqueak ? latestSqueak.getSqueakTime() : null);
const latestSqueakHash = (latestSqueak ? latestSqueak.getSqueakHash() : null);
getSqueaks(SQUEAKS_PER_PAGE, latestSqueakHeight, latestSqueakTime, latestSqueakHash);
getSqueaks(SQUEAKS_PER_PAGE, latestSqueak);
}}
>
<ReplayIcon />

View file

@ -111,12 +111,10 @@ export function getUserRequest(handleResponse) {
});
}
export function getTimelineSqueakDisplaysRequest(limit, blockHeight, squeakTime, squeakHash, handleResponse, handleErr) {
export function getTimelineSqueakDisplaysRequest(limit, lastEntry, handleResponse, handleErr) {
const request = new GetTimelineSqueakDisplaysRequest();
request.setLimit(limit);
request.setBlockHeight(blockHeight);
request.setSqueakTime(squeakTime);
request.setSqueakHash(squeakHash);
request.setLastEntry(lastEntry);
client.getTimelineSqueakDisplays(request, {}, (err, response) => {
if (err) {
handleErr(err);
@ -356,13 +354,11 @@ export function getAncestorSqueakDisplaysRequest(hash, handleResponse) {
});
}
export function getReplySqueakDisplaysRequest(hash, limit, latestBlockHeight, latestSqueakTime, latestSqueakHash, handleResponse) {
export function getReplySqueakDisplaysRequest(hash, limit, lastEntry, handleResponse) {
const request = new GetReplySqueakDisplaysRequest();
request.setSqueakHash(hash);
request.setLimit(limit);
request.setLatestBlockHeight(latestBlockHeight);
request.setLatestSqueakTime(latestSqueakTime);
request.setLatestSqueakHash(latestSqueakHash);
request.setLastEntry(lastEntry);
client.getReplySqueakDisplays(request, {}, (err, response) => {
handleResponse(response.getSqueakDisplayEntriesList());
});
@ -376,13 +372,11 @@ export function getSqueakProfileByAddressRequest(address, handleResponse) {
});
}
export function getAddressSqueakDisplaysRequest(address, limit, blockHeight, squeakTime, squeakHash, handleResponse) {
export function getAddressSqueakDisplaysRequest(address, limit, lastEntry, handleResponse) {
const request = new GetAddressSqueakDisplaysRequest();
request.setAddress(address);
request.setLimit(limit);
request.setBlockHeight(blockHeight);
request.setSqueakTime(squeakTime);
request.setSqueakHash(squeakHash);
request.setLastEntry(lastEntry);
client.getAddressSqueakDisplays(request, {}, (err, response) => {
handleResponse(response.getSqueakDisplayEntriesList());
});

View file

@ -553,14 +553,8 @@ message GetTimelineSqueakDisplaysRequest {
/// Limit number of results
int32 limit = 1;
/// Block height
int32 block_height = 2;
/// Squeak time
int64 squeak_time = 3;
/// Hash of the squeak.
string squeak_hash = 4;
/// Last entry
SqueakDisplayEntry last_entry = 2;
}
message GetTimelineSqueakDisplaysReply {
@ -575,14 +569,8 @@ message GetAddressSqueakDisplaysRequest {
/// Limit number of results
int32 limit = 2;
/// Block height
int32 block_height = 3;
/// Squeak time
int64 squeak_time = 4;
/// Hash of the squeak.
string squeak_hash = 5;
/// Last entry
SqueakDisplayEntry last_entry = 3;
}
message GetAddressSqueakDisplaysReply {
@ -607,14 +595,8 @@ message GetReplySqueakDisplaysRequest {
/// Limit number of results
int32 limit = 2;
/// Block height
int32 latest_block_height = 3;
/// Squeak time
int64 latest_squeak_time = 4;
/// Hash of the squeak.
string latest_squeak_hash = 5;
/// Last entry
SqueakDisplayEntry last_entry = 3;
}
message GetReplySqueakDisplaysReply {

View file

@ -201,3 +201,20 @@ def message_to_peer_address(peer_address: squeak_admin_pb2.PeerAddress) -> PeerA
host=peer_address.host,
port=peer_address.port,
)
def message_to_squeak_entry(squeak_entry: squeak_admin_pb2.SqueakDisplayEntry) -> SqueakEntry:
return SqueakEntry(
squeak_hash=bytes.fromhex(squeak_entry.squeak_hash),
address=squeak_entry.author_address,
block_height=squeak_entry.block_height,
block_hash=bytes.fromhex(squeak_entry.block_hash),
block_time=squeak_entry.block_time,
squeak_time=squeak_entry.squeak_time,
reply_to=bytes.fromhex(
squeak_entry.reply_to) if squeak_entry.reply_to else None,
is_unlocked=squeak_entry.is_unlocked,
squeak_profile=None, # TODO: message to squeak profile
liked_time=squeak_entry.liked_time_s,
content=squeak_entry.content_str,
)

View file

@ -24,6 +24,7 @@ import logging
from proto import squeak_admin_pb2
from squeaknode.admin.messages import connected_peer_to_message
from squeaknode.admin.messages import message_to_peer_address
from squeaknode.admin.messages import message_to_squeak_entry
from squeaknode.admin.messages import offer_entry_to_message
from squeaknode.admin.messages import payment_summary_to_message
from squeaknode.admin.messages import received_payments_to_message
@ -312,28 +313,24 @@ class SqueakAdminServerHandler(object):
def handle_get_timeline_squeak_display_entries(self, request):
limit = request.limit
block_height = request.block_height
squeak_time = request.squeak_time
squeak_hash_str = request.squeak_hash
squeak_hash = bytes.fromhex(
squeak_hash_str) if squeak_hash_str else None
last_entry = message_to_squeak_entry(request.last_entry) if request.HasField(
"last_entry") else None
# block_height = last_entry.block_height
# squeak_time = last_entry.squeak_time
# squeak_hash_str = last_entry.squeak_hash
# squeak_hash = bytes.fromhex(
# squeak_hash_str) if squeak_hash_str else None
logger.info("""Handle get timeline squeak display entries with
limit: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
last_entry: {}
""".format(
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
))
squeak_entries = (
self.squeak_controller.get_timeline_squeak_entries(
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
)
)
logger.info(
@ -351,30 +348,21 @@ class SqueakAdminServerHandler(object):
def handle_get_squeak_display_entries_for_address(self, request):
address = request.address
limit = request.limit
block_height = request.block_height
squeak_time = request.squeak_time
squeak_hash_str = request.squeak_hash
squeak_hash = bytes.fromhex(
squeak_hash_str) if squeak_hash_str else None
last_entry = message_to_squeak_entry(request.last_entry) if request.HasField(
"last_entry") else None
logger.info("""Handle get squeak display entries for address: {} with
limit: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
last_entry: {}
""".format(
address,
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
))
squeak_entries = (
self.squeak_controller.get_squeak_entries_for_address(
address,
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
)
)
logger.info(
@ -418,30 +406,21 @@ class SqueakAdminServerHandler(object):
squeak_hash_str = request.squeak_hash
squeak_hash = bytes.fromhex(squeak_hash_str)
limit = request.limit
latest_block_height = request.latest_block_height
latest_squeak_time = request.latest_squeak_time
latest_squeak_hash_str = request.latest_squeak_hash
latest_squeak_hash = bytes.fromhex(
latest_squeak_hash_str) if latest_squeak_hash_str else None
last_entry = message_to_squeak_entry(request.last_entry) if request.HasField(
"last_entry") else None
logger.info("""Handle get reply squeak display entries for squeak hash: {} with
limit: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
last_entry: {}
""".format(
squeak_hash_str,
limit,
latest_block_height,
latest_squeak_time,
latest_squeak_hash_str,
last_entry,
))
squeak_entries = (
self.squeak_controller.get_reply_squeak_entries(
squeak_hash,
limit,
latest_block_height,
latest_squeak_time,
latest_squeak_hash,
last_entry,
)
)
logger.info(

View file

@ -241,24 +241,22 @@ class SqueakDb:
def get_timeline_squeak_entries(
self,
limit: int,
block_height: int = MAX_INT,
squeak_time: int = MAX_INT,
squeak_hash: bytes = MAX_HASH,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
""" Get all followed squeaks. """
block_height = block_height or MAX_INT
squeak_time = squeak_time or MAX_INT
squeak_hash = squeak_hash or MAX_HASH
logger.debug("""Timeline db query with
last_block_height = last_entry.block_height if last_entry else MAX_INT
last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT
last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH
logger.info("""Timeline db query with
limit: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
""".format(
limit,
block_height,
squeak_time,
squeak_hash.hex(),
last_block_height,
last_squeak_time,
last_squeak_hash.hex(),
))
s = (
select([self.squeaks, self.profiles])
@ -275,9 +273,9 @@ class SqueakDb:
self.squeaks.c.n_time,
self.squeaks.c.hash,
) < tuple_(
block_height,
squeak_time,
squeak_hash,
last_block_height,
last_squeak_time,
last_squeak_hash,
)
)
.order_by(
@ -318,14 +316,23 @@ class SqueakDb:
self,
address: str,
limit: int,
block_height: int,
squeak_time: int,
squeak_hash: bytes,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
""" Get a squeak. """
block_height = block_height or MAX_INT
squeak_time = squeak_time or MAX_INT
squeak_hash = squeak_hash or MAX_HASH
last_block_height = last_entry.block_height if last_entry else MAX_INT
last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT
last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH
logger.info("""Timeline db query with
limit: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
""".format(
limit,
last_block_height,
last_squeak_time,
last_squeak_hash.hex(),
))
s = (
select([self.squeaks, self.profiles])
.select_from(
@ -341,9 +348,9 @@ class SqueakDb:
self.squeaks.c.n_time,
self.squeaks.c.hash,
) < tuple_(
block_height,
squeak_time,
squeak_hash,
last_block_height,
last_squeak_time,
last_squeak_hash,
)
)
.order_by(
@ -428,26 +435,22 @@ class SqueakDb:
self,
squeak_hash: bytes,
limit: int,
latest_block_height: int,
latest_squeak_time: int,
latest_squeak_hash: bytes,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
""" Get all replies for a squeak hash. """
latest_block_height = latest_block_height or MAX_INT
latest_squeak_time = latest_squeak_time or MAX_INT
latest_squeak_hash = latest_squeak_hash or MAX_HASH
logger.debug("""Replies db query with
squeak_hash: {}
last_block_height = last_entry.block_height if last_entry else MAX_INT
last_squeak_time = last_entry.squeak_time if last_entry else MAX_INT
last_squeak_hash = last_entry.squeak_hash if last_entry else MAX_HASH
logger.info("""Timeline db query with
limit: {}
latest_block_height: {}
latest_squeak_time: {}
latest_squeak_hash: {}
block_height: {}
squeak_time: {}
squeak_hash: {}
""".format(
squeak_hash.hex(),
limit,
latest_block_height,
latest_squeak_time,
latest_squeak_hash.hex(),
last_block_height,
last_squeak_time,
last_squeak_hash.hex(),
))
s = (
select([self.squeaks, self.profiles])
@ -464,9 +467,9 @@ class SqueakDb:
self.squeaks.c.n_time,
self.squeaks.c.hash,
) < tuple_(
latest_block_height,
latest_squeak_time,
latest_squeak_hash,
last_block_height,
last_squeak_time,
last_squeak_hash,
)
)
.order_by(

View file

@ -425,15 +425,11 @@ class SqueakController:
def get_timeline_squeak_entries(
self,
limit: int,
block_height: int,
squeak_time: int,
squeak_hash: bytes,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
return self.squeak_db.get_timeline_squeak_entries(
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
)
def get_liked_squeak_entries(self) -> List[SqueakEntry]:
@ -443,16 +439,12 @@ class SqueakController:
self,
address: str,
limit: int,
block_height: int,
squeak_time: int,
squeak_hash: bytes,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
return self.squeak_db.get_squeak_entries_for_address(
address,
limit,
block_height,
squeak_time,
squeak_hash,
last_entry,
)
def get_ancestor_squeak_entries(self, squeak_hash: bytes) -> List[SqueakEntry]:
@ -464,16 +456,12 @@ class SqueakController:
self,
squeak_hash: bytes,
limit: int,
latest_block_height: int,
latest_squeak_time: int,
latest_squeak_hash: bytes,
last_entry: Optional[SqueakEntry],
) -> List[SqueakEntry]:
return self.squeak_db.get_thread_reply_squeak_entries(
squeak_hash,
limit,
latest_block_height,
latest_squeak_time,
latest_squeak_hash,
last_entry,
)
def lookup_squeaks(self, addresses: List[str], min_block: int, max_block: int) -> List[bytes]: