Compare commits

...

11 Commits

Author SHA1 Message Date
1cc0660a93 Merge pull request 'Add operations to get trimmed getVideo queries for metrics' (#11) from loewy/add-get-metrics-for-video-queries into master
Reviewed-on: #11
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-06-05 01:28:16 -06:00
14da2ae388 add averageTimePerShot, elapsedTime and MedianRun forVideo queries
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-06-04 23:20:47 -07:00
9ee4d43c89 Merge pull request 'Restructure protobuf/add annotations' (#10) from ivan/restructure-protobuf-types-and-add-annotations into master
Reviewed-on: #10
2024-05-24 20:26:00 -06:00
fcac551806 Restructure protobuf/add annotations
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-05-24 20:24:24 -06:00
044d8fa46d Merge pull request 'mk/implement-one-of' (#9) from mk/implement-one-of into master
Reviewed-on: #9
2024-05-22 16:49:28 -06:00
33f5404820 Actually incorperate one of stuff
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-05-22 16:41:24 -06:00
04a30e67d3 Add gql mods for implementing one-of 2024-05-22 15:13:18 -06:00
08183ed952 Merge pull request 'rename pkg to rbproto' (#8) from mk/fixing-rbproto into master
Reviewed-on: #8
2024-05-22 12:01:23 -06:00
4fac231c43 rename pkg to rbproto
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-05-22 12:00:39 -06:00
30e356e3e0 Add Protobuf with Testing + Codegen (#7)
Reviewed-on: #7
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
Co-authored-by: Mike Kalange <countablecloud@gmail.com>
Co-committed-by: Mike Kalange <countablecloud@gmail.com>
2024-05-22 11:27:54 -06:00
36712557cb Merge pull request 'Add workflow' (#6) from ivan/add-workflow into master
Reviewed-on: #6
2024-05-21 14:34:15 -06:00
16 changed files with 1985 additions and 58 deletions

View File

@@ -13,5 +13,5 @@ jobs:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: graphql-codegen causes no changes
- name: codegen causes no changes
run: ./bin/assert-no-changes-wrapper.sh

1
README.md Normal file
View File

@@ -0,0 +1 @@
# rbgql

View File

@@ -4,6 +4,12 @@ git ls-files | xargs md5sum > before.txt
yarn install
yarn graphql-codegen
prettier ./src --write
for proto in $(find ./rbproto -iname '*.proto'); do
name=$(basename "$proto" .proto)
protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto
yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts
done
prettier ./rbproto --write
git ls-files | xargs md5sum > after.txt

View File

@@ -21,7 +21,7 @@
in
with pkgs; {
devShell = mkShell {
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just];
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf];
};
});
}

View File

@@ -1,4 +1,5 @@
NIX := "LD_LIBRARY_PATH='' nix"
PROTOBUF_DIR := "$PWD/rbproto"
prettier-gql:
#!/usr/bin/env bash
@@ -12,3 +13,27 @@ gql-codegen:
gql: gql-codegen prettier-gql
protobuf-compile-a-python name:
protoc -I={{ PROTOBUF_DIR }} --python_out={{ PROTOBUF_DIR }}/python --pyi_out={{ PROTOBUF_DIR }}/python {{ PROTOBUF_DIR }}/shot.proto
protobuf-compile-a-js name:
#!/usr/bin/env bash
set -euxo pipefail
{{NIX}} develop --impure --command bash -c 'yarn pbjs {{ PROTOBUF_DIR }}/shot.proto --ts {{ PROTOBUF_DIR }}/ts/shot.ts && yarn prettier ./rbproto --write'
protobuf-compile-all-js:
#!/usr/bin/env bash
for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do
name=$(basename "$proto" .proto)
just protobuf-compile-a-js $name
done
protobuf-compile-all-python:
#!/usr/bin/env bash
for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do
name=$(basename "$proto" .proto)
just protobuf-compile-a-python $name
done
protobuf-compile-everything: protobuf-compile-all-js protobuf-compile-all-python

View File

@@ -18,6 +18,7 @@
"@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-react-apollo": "^4.2.0",
"graphql": "^16.8.1",
"pbjs": "^0.0.14",
"prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4"
},

16
pyproject.toml Normal file
View File

@@ -0,0 +1,16 @@
[tool.poetry]
name = "rbproto"
version = "0.1.0"
description = ""
authors = ["Mike Kalange <countablecloud@gmail.com>"]
readme = "README.md"
packages = [{include = "rbproto"}]
[tool.poetry.dependencies]
python = ">=3.10,<3.12"
protobuf = "^4.25.3"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

1
rbproto/__init__.py Normal file
View File

@@ -0,0 +1 @@
from .python.shot_pb2 import * # noqa: F401

View File

@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: shot.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xe6\x01\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x42\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_globals['_BOX']._serialized_start=31
_globals['_BOX']._serialized_end=94
_globals['_POINT']._serialized_start=96
_globals['_POINT']._serialized_end=125
_globals['_BALLDETECTION']._serialized_start=127
_globals['_BALLDETECTION']._serialized_end=254
_globals['_RLEBALLDETECTION']._serialized_start=256
_globals['_RLEBALLDETECTION']._serialized_end=340
_globals['_RLEDETECTIONHISTORY']._serialized_start=342
_globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals['_DETECTIONHISTORY']._serialized_start=420
_globals['_DETECTIONHISTORY']._serialized_end=490
_globals['_PATH']._serialized_start=493
_globals['_PATH']._serialized_end=723
_globals['_IDENTIFIERHISTORY']._serialized_start=725
_globals['_IDENTIFIERHISTORY']._serialized_end=807
_globals['_SHOT']._serialized_start=809
_globals['_SHOT']._serialized_end=881
# @@protoc_insertion_point(module_scope)

View File

@@ -0,0 +1,86 @@
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class Box(_message.Message):
__slots__ = ["left", "top", "width", "height"]
LEFT_FIELD_NUMBER: _ClassVar[int]
TOP_FIELD_NUMBER: _ClassVar[int]
WIDTH_FIELD_NUMBER: _ClassVar[int]
HEIGHT_FIELD_NUMBER: _ClassVar[int]
left: float
top: float
width: float
height: float
def __init__(self, left: _Optional[float] = ..., top: _Optional[float] = ..., width: _Optional[float] = ..., height: _Optional[float] = ...) -> None: ...
class Point(_message.Message):
__slots__ = ["x", "y"]
X_FIELD_NUMBER: _ClassVar[int]
Y_FIELD_NUMBER: _ClassVar[int]
x: float
y: float
def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ...
class BallDetection(_message.Message):
__slots__ = ["plane_position", "annotation", "interpolated"]
PLANE_POSITION_FIELD_NUMBER: _ClassVar[int]
ANNOTATION_FIELD_NUMBER: _ClassVar[int]
INTERPOLATED_FIELD_NUMBER: _ClassVar[int]
plane_position: Point
annotation: Box
interpolated: bool
def __init__(self, plane_position: _Optional[_Union[Point, _Mapping]] = ..., annotation: _Optional[_Union[Box, _Mapping]] = ..., interpolated: bool = ...) -> None: ...
class RLEBallDetection(_message.Message):
__slots__ = ["detection", "count"]
DETECTION_FIELD_NUMBER: _ClassVar[int]
COUNT_FIELD_NUMBER: _ClassVar[int]
detection: BallDetection
count: int
def __init__(self, detection: _Optional[_Union[BallDetection, _Mapping]] = ..., count: _Optional[int] = ...) -> None: ...
class RLEDetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...) -> None: ...
class DetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
class Path(_message.Message):
__slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"]
START_FRAME_FIELD_NUMBER: _ClassVar[int]
END_FRAME_FIELD_NUMBER: _ClassVar[int]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
IS_STATIC_FIELD_NUMBER: _ClassVar[int]
start_frame: int
end_frame: int
detections: DetectionHistory
rle_detections: RLEDetectionHistory
not_present: bool
is_static: bool
def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ...) -> None: ...
class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths"]
BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
PATHS_FIELD_NUMBER: _ClassVar[int]
ball_identifier: int
paths: _containers.RepeatedCompositeFieldContainer[Path]
def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
class Shot(_message.Message):
__slots__ = ["identifier_histories"]
IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ...

54
rbproto/shot.proto Normal file
View File

@@ -0,0 +1,54 @@
syntax = "proto3";
package serialized_shot;
message Box {
float left = 1;
float top = 2;
float width = 3;
float height = 4;
}
message Point {
float x = 1;
float y = 2;
}
message BallDetection {
Point plane_position = 1;
Box annotation = 2;
bool interpolated = 3;
}
message RLEBallDetection {
BallDetection detection = 1;
uint32 count = 2;
}
message RLEDetectionHistory {
repeated RLEBallDetection detections = 1;
}
message DetectionHistory {
repeated BallDetection detections = 1;
}
message Path {
uint32 start_frame = 1;
uint32 end_frame = 2;
oneof detection_history {
DetectionHistory detections = 3;
RLEDetectionHistory rle_detections = 4;
bool not_present = 5;
}
bool is_static = 6;
}
message IdentifierHistory {
uint32 ball_identifier = 1;
repeated Path paths = 2;
}
message Shot {
repeated IdentifierHistory identifier_histories = 3;
}

1242
rbproto/ts/shot.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -49,14 +49,9 @@ export type AggregationIdentifierGql = {
groupName: Scalars["String"]["output"];
};
export type AggregationInput = {
bucketSet?: InputMaybe<BucketSetInputGql>;
enum?: InputMaybe<EnumAggregation>;
};
export type AndFilter = {
filters: Array<FilterInput>;
};
export type AggregationInput =
| { bucketSet: BucketSetInputGql; enum?: never }
| { bucketSet?: never; enum: EnumAggregation };
export type BankFeaturesGql = {
__typename?: "BankFeaturesGQL";
@@ -133,21 +128,202 @@ export type EnumAggregation = {
feature: Scalars["String"]["input"];
};
export type FilterInput = {
andFilters?: InputMaybe<AndFilter>;
cueBallSpeed?: InputMaybe<RangeFilter>;
cueObjectAngle?: InputMaybe<RangeFilter>;
cueObjectDistance?: InputMaybe<RangeFilter>;
difficulty?: InputMaybe<RangeFilter>;
intendedPocketType?: InputMaybe<Array<PocketEnum>>;
make?: InputMaybe<Array<Scalars["Boolean"]["input"]>>;
orFilters?: InputMaybe<OrFilter>;
shotDirection?: InputMaybe<Array<ShotDirectionEnum>>;
tags?: InputMaybe<Array<VideoTagInput>>;
targetPocketDistance?: InputMaybe<RangeFilter>;
userId?: InputMaybe<Array<Scalars["Int"]["input"]>>;
videoId?: InputMaybe<Array<Scalars["Int"]["input"]>>;
};
export type FilterInput =
| {
andFilters: Array<FilterInput>;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed: RangeFilter;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle: RangeFilter;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance: RangeFilter;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty: RangeFilter;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType: Array<PocketEnum>;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make: Array<Scalars["Boolean"]["input"]>;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters: Array<FilterInput>;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection: Array<ShotDirectionEnum>;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags: Array<VideoTagInput>;
targetPocketDistance?: never;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance: RangeFilter;
userId?: never;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId: Array<Scalars["Int"]["input"]>;
videoId?: never;
}
| {
andFilters?: never;
cueBallSpeed?: never;
cueObjectAngle?: never;
cueObjectDistance?: never;
difficulty?: never;
intendedPocketType?: never;
make?: never;
orFilters?: never;
shotDirection?: never;
tags?: never;
targetPocketDistance?: never;
userId?: never;
videoId: Array<Scalars["Int"]["input"]>;
};
export type GetUploadLinkReturn = {
__typename?: "GetUploadLinkReturn";
@@ -236,10 +412,6 @@ export type MutationSetLoggerLevelArgs = {
path: Scalars["String"]["input"];
};
export type OrFilter = {
filters: Array<FilterInput>;
};
export type PageInfoGql = {
__typename?: "PageInfoGQL";
endCursor?: Maybe<Scalars["String"]["output"]>;
@@ -329,6 +501,11 @@ export type RangeFilter = {
lessThan?: InputMaybe<Scalars["Float"]["input"]>;
};
export type SerializedShotPathsGql = {
__typename?: "SerializedShotPathsGQL";
b64EncodedBuffer?: Maybe<Scalars["String"]["output"]>;
};
export enum ShotDirectionEnum {
Left = "LEFT",
Right = "RIGHT",
@@ -343,6 +520,7 @@ export type ShotGql = {
endFrame: Scalars["Int"]["output"];
id: Scalars["Int"]["output"];
pocketingIntentionFeatures?: Maybe<PocketingIntentionFeaturesGql>;
serializedShotPaths?: Maybe<SerializedShotPathsGql>;
startFrame: Scalars["Int"]["output"];
updatedAt?: Maybe<Scalars["DateTime"]["output"]>;
user?: Maybe<UserGql>;
@@ -866,6 +1044,36 @@ export type GetVideoQuery = {
};
};
export type GetAverageTimePerShotForVideoQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
export type GetAverageTimePerShotForVideoQuery = {
__typename?: "Query";
getVideo: {
__typename?: "VideoGQL";
averageTimeBetweenShots?: number | null;
};
};
export type GetElapsedTimeForVideoQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
export type GetElapsedTimeForVideoQuery = {
__typename?: "Query";
getVideo: { __typename?: "VideoGQL"; elapsedTime?: number | null };
};
export type GetMedianRunForVideoQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
export type GetMedianRunForVideoQuery = {
__typename?: "Query";
getVideo: { __typename?: "VideoGQL"; medianRun?: number | null };
};
export type CreateUploadStreamMutationVariables = Exact<{
videoMetadataInput: VideoMetadataInput;
}>;
@@ -1937,11 +2145,9 @@ export const GetVideoDetailsDocument = gql`
elapsedTime
endTime
makePercentage
makePercentage
medianRun
startTime
totalShots
totalShots
totalShotsMade
createdAt
updatedAt
@@ -2185,6 +2391,225 @@ export type GetVideoQueryResult = Apollo.QueryResult<
GetVideoQuery,
GetVideoQueryVariables
>;
export const GetAverageTimePerShotForVideoDocument = gql`
query GetAverageTimePerShotForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
averageTimeBetweenShots
}
}
`;
/**
* __useGetAverageTimePerShotForVideoQuery__
*
* To run a query within a React component, call `useGetAverageTimePerShotForVideoQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAverageTimePerShotForVideoQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetAverageTimePerShotForVideoQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetAverageTimePerShotForVideoQuery(
baseOptions: Apollo.QueryHookOptions<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>(GetAverageTimePerShotForVideoDocument, options);
}
export function useGetAverageTimePerShotForVideoLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>(GetAverageTimePerShotForVideoDocument, options);
}
export function useGetAverageTimePerShotForVideoSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>(GetAverageTimePerShotForVideoDocument, options);
}
export type GetAverageTimePerShotForVideoQueryHookResult = ReturnType<
typeof useGetAverageTimePerShotForVideoQuery
>;
export type GetAverageTimePerShotForVideoLazyQueryHookResult = ReturnType<
typeof useGetAverageTimePerShotForVideoLazyQuery
>;
export type GetAverageTimePerShotForVideoSuspenseQueryHookResult = ReturnType<
typeof useGetAverageTimePerShotForVideoSuspenseQuery
>;
export type GetAverageTimePerShotForVideoQueryResult = Apollo.QueryResult<
GetAverageTimePerShotForVideoQuery,
GetAverageTimePerShotForVideoQueryVariables
>;
export const GetElapsedTimeForVideoDocument = gql`
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
elapsedTime
}
}
`;
/**
* __useGetElapsedTimeForVideoQuery__
*
* To run a query within a React component, call `useGetElapsedTimeForVideoQuery` and pass it any options that fit your needs.
* When your component renders, `useGetElapsedTimeForVideoQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetElapsedTimeForVideoQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetElapsedTimeForVideoQuery(
baseOptions: Apollo.QueryHookOptions<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>(GetElapsedTimeForVideoDocument, options);
}
export function useGetElapsedTimeForVideoLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>(GetElapsedTimeForVideoDocument, options);
}
export function useGetElapsedTimeForVideoSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>(GetElapsedTimeForVideoDocument, options);
}
export type GetElapsedTimeForVideoQueryHookResult = ReturnType<
typeof useGetElapsedTimeForVideoQuery
>;
export type GetElapsedTimeForVideoLazyQueryHookResult = ReturnType<
typeof useGetElapsedTimeForVideoLazyQuery
>;
export type GetElapsedTimeForVideoSuspenseQueryHookResult = ReturnType<
typeof useGetElapsedTimeForVideoSuspenseQuery
>;
export type GetElapsedTimeForVideoQueryResult = Apollo.QueryResult<
GetElapsedTimeForVideoQuery,
GetElapsedTimeForVideoQueryVariables
>;
export const GetMedianRunForVideoDocument = gql`
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
medianRun
}
}
`;
/**
* __useGetMedianRunForVideoQuery__
*
* To run a query within a React component, call `useGetMedianRunForVideoQuery` and pass it any options that fit your needs.
* When your component renders, `useGetMedianRunForVideoQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetMedianRunForVideoQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetMedianRunForVideoQuery(
baseOptions: Apollo.QueryHookOptions<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>(GetMedianRunForVideoDocument, options);
}
export function useGetMedianRunForVideoLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>(GetMedianRunForVideoDocument, options);
}
export function useGetMedianRunForVideoSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>(GetMedianRunForVideoDocument, options);
}
export type GetMedianRunForVideoQueryHookResult = ReturnType<
typeof useGetMedianRunForVideoQuery
>;
export type GetMedianRunForVideoLazyQueryHookResult = ReturnType<
typeof useGetMedianRunForVideoLazyQuery
>;
export type GetMedianRunForVideoSuspenseQueryHookResult = ReturnType<
typeof useGetMedianRunForVideoSuspenseQuery
>;
export type GetMedianRunForVideoQueryResult = Apollo.QueryResult<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>;
export const CreateUploadStreamDocument = gql`
mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
createUploadStream(videoMetadata: $videoMetadataInput) {

View File

@@ -91,11 +91,9 @@ query GetVideoDetails($videoId: Int!) {
elapsedTime
endTime
makePercentage
makePercentage
medianRun
startTime
totalShots
totalShots
totalShotsMade
createdAt
updatedAt
@@ -148,3 +146,19 @@ query GetVideo($videoId: Int!) {
}
}
}
query GetAverageTimePerShotForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
averageTimeBetweenShots
}
}
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
elapsedTime
}
}
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
medianRun
}
}

View File

@@ -43,9 +43,9 @@ input AggregateInputGQL {
filterInput: FilterInput
}
input AggregationInput {
bucketSet: BucketSetInputGQL = null
enum: EnumAggregation = null
input AggregationInput @oneOf {
bucketSet: BucketSetInputGQL
enum: EnumAggregation
}
input BucketSetInputGQL {
@@ -62,28 +62,20 @@ input EnumAggregation {
feature: String!
}
input FilterInput {
andFilters: AndFilter = null
orFilters: OrFilter = null
cueObjectDistance: RangeFilter = null
targetPocketDistance: RangeFilter = null
cueObjectAngle: RangeFilter = null
cueBallSpeed: RangeFilter = null
difficulty: RangeFilter = null
intendedPocketType: [PocketEnum!] = null
shotDirection: [ShotDirectionEnum!] = null
videoId: [Int!] = null
userId: [Int!] = null
make: [Boolean!] = null
tags: [VideoTagInput!] = null
}
input AndFilter {
filters: [FilterInput!]!
}
input OrFilter {
filters: [FilterInput!]!
input FilterInput @oneOf {
andFilters: [FilterInput!]
orFilters: [FilterInput!]
cueObjectDistance: RangeFilter
targetPocketDistance: RangeFilter
cueObjectAngle: RangeFilter
cueBallSpeed: RangeFilter
difficulty: RangeFilter
intendedPocketType: [PocketEnum!]
shotDirection: [ShotDirectionEnum!]
videoId: [Int!]
userId: [Int!]
make: [Boolean!]
tags: [VideoTagInput!]
}
input RangeFilter {
@@ -144,6 +136,7 @@ type ShotGQL {
cueObjectFeatures: CueObjectFeaturesGQL
pocketingIntentionFeatures: PocketingIntentionFeaturesGQL
bankFeatures: BankFeaturesGQL
serializedShotPaths: SerializedShotPathsGQL
user: UserGQL
}
@@ -177,6 +170,10 @@ enum WallTypeEnum {
SHORT
}
type SerializedShotPathsGQL {
b64EncodedBuffer: String
}
type UserGQL {
id: Int!
firebaseUid: String!

View File

@@ -1553,6 +1553,11 @@ colorette@^2.0.16:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
commander@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c"
integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==
common-tags@1.8.2:
version "1.8.2"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6"
@@ -2538,6 +2543,14 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pbjs@^0.0.14:
version "0.0.14"
resolved "https://registry.yarnpkg.com/pbjs/-/pbjs-0.0.14.tgz#5ab3d4a5f06a9ab78dd320c63f72877120d4c48d"
integrity sha512-F4aA0ojrQ37kxFPOg4yRLP/vxb76rYQwMQigmVEljYlA7hZKmjaWjP6IkRn4nA0NdIj4Xxe4iqWrrIhJy+MwWQ==
dependencies:
commander "4.0.1"
protocol-buffers-schema "3.1.0"
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -2574,6 +2587,11 @@ prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.13.1"
protocol-buffers-schema@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.0.tgz#d8a819549ead3e6bd189ebe9e50e96636bbc5cc7"
integrity sha512-1g9zFjLFhGN1Dc5UVO8D2loVslp6sVxk5sJqgD66CuWUITh2gOaTLRN/pIakGFfB6e0nNF6hImrYFDurEsA1UQ==
punycode@^1.3.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"