Slide 1

Slide 1 text

(SBQI2- ,PUMJOͰ/ ໰୊ ΛରԠ͢Δ ͠Β͡

Slide 2

Slide 2 text

8IPBN* w ,PUMJO (SBQI2- ZFBS w 0QFO4PVSDFLPUMJOHSBQIRMTBNQMF w -PWF,PUMJO w 8PSLTGPS6CJF *OD @shiraji @shiraj_i

Slide 3

Slide 3 text

,PUMJO'FTU IUUQTTQFBLFSEFDLDPNTIJSBKJTFSWFSTJEFLPUMJOQMVTHSBQIRM

Slide 4

Slide 4 text

/ 1SPCMFN w 0OFDPNQBOZIBTNBOZESVHT w 0OFESVHIBTPOFDPNQBOZ

Slide 5

Slide 5 text

w 4&-&$5 '30.ESVHXIFSFDPNQBOZ@JE w 4&-&$5 '30.DPNQBOZXIFSFJE w / 1SPCMFN

Slide 6

Slide 6 text

w NVMUJQMFESVHTBUPODF / 1SPCMFN

Slide 7

Slide 7 text

w 4&-&$5 '30.ESVHXIFSFJEJO    / 1SPCMFN w 4&-&$5 '30.DPNQBOZXIFSFJE w 4&-&$5 '30.DPNQBOZXIFSFJE w 4&-&$5 '30.DPNQBOZXIFSFJE

Slide 8

Slide 8 text

w 4&-&$5 '30.ESVHXIFSFJEJO     w 4&-&$5 '30.DPNQBOZXIFSFJEJO     w / 1SPCMFN

Slide 9

Slide 9 text

w 6TF%BUB-PBEFS w 3FHJTUFS%BUB-PBEFSUP(SBQI2-$POUFYUXJUI4USJOHLFZ w (FU%BUB-PBEFSVTJOH4USJOHLFZBU3FTPMWFS w *O%BUB-PBEFS XBJUVOUJMBMMJUFNT 4PMWJOH/ XJUIHSBQIRMKBWBTUBSUFS

Slide 10

Slide 10 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( )a return context

Slide 11

Slide 11 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry() )a return context

Slide 12

Slide 12 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register() )a return context

Slide 13

Slide 13 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> }c )b )a return context

Slide 14

Slide 14 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> CompletableFuture.supplyAsync { }d }c )b )a return context

Slide 15

Slide 15 text

/ XJUIHSBQIRMKBWBTUBSUFS val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM company where company_id in (1, 2, 3) drugService.getCompanyByIds(companyIds) }d }c )b )a return context

Slide 16

Slide 16 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompany(drug: Drug): Company {a companyService.getCompanyById(drug.companyId) }a }b

Slide 17

Slide 17 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompany(drug: Drug, env: DataFetchingEnvironment): Company {a companyService.getCompanyById(drug.companyId) }a }b

Slide 18

Slide 18 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompanies(drug: Drug, env: DataFetchingEnvironment): CompletableFuture>? {a companyService.getCompanyById(drug.companyId) }a }b

Slide 19

Slide 19 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompanies(drug: Drug, env: DataFetchingEnvironment): CompletableFuture>? {a }a }b

Slide 20

Slide 20 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompanies(drug: Drug, env: DataFetchingEnvironment): CompletableFuture>? {a return env .getDataLoader>(“key_companies_by_drugs_id”) }a }b

Slide 21

Slide 21 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompanies(drug: Drug, env: DataFetchingEnvironment): CompletableFuture>? {a return env .getDataLoader>(“key_companies_by_drugs_id”) .load(drug.companyId) }a }b

Slide 22

Slide 22 text

/ XJUIHSBQIRMKBWBTUBSUFS @Component class DrugResolver : GraphQLResolver { @Suppress("unused") fun getCompanies(drug: Drug, env: DataFetchingEnvironment): CompletableFuture>? {a return env .getDataLoader>(“key_companies_by_drugs_id”) .load(drug.companyId) }a }b val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM company where company_id in (1, 2, 3) drugService.getCompanyByIds(companyIds) }d }c )b )a return context

Slide 23

Slide 23 text

"TTPDJBUFLFZXJUIWBMVF val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM company where company_id in (1, 2, 3) drugService.getCompanyByIds(companyIds) }d }c )b )a return context w 0SEFSNBUUFS w DPNQBOZ*ET    <$PNQBOZ JE $PNQBOZ JE $PNQBOZ JE > w DPNQBOZ*ET    <$PNQBOZ JE OVMM $PNQBOZ JE >

Slide 24

Slide 24 text

$PNQMFYSFMBUJPOT type Drug { id: ID! company: Company! kinkiDrugs: [Drug!] } w 0OFESVHIBTNVMUJQMF,JOLJESVHT w %SVHTNJHIUIBWFTBNF,JOLJESVHT

Slide 25

Slide 25 text

w 4&-&$5 '30.ESVHXIFSFJEJO     w 4&-&$5 '30.LJOLJ@ESVHXIFSFESVH@B@JEJO     w 4&-&$5 '30.ESVHXIFSFJEJO    $PNQMFYSFMBUJPOT

Slide 26

Slide 26 text

JE ESVH@B@JE ESVH@C@JE             w 4&-&$5 '30.LJOLJ@ESVHXIFSF ESVH@B@JEJO     w :FT ESVH@C@JEJT    CVUEVQMJDBUFE LJOLJ@ESVH $PNQMFYSFMBUJPOT

Slide 27

Slide 27 text

"TTPDJBUFLFZXJUIWBMVF val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_companies_by_drugs_id”, DataLoader.newDataLoader { companyIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM company where company_id in (1, 2, 3) drugService.getCompanyByIds(companyIds) }d }c )b )a return context w 0SEFSNBUUFS w DPNQBOZ*ET    <$PNQBOZ JE $PNQBOZ JE $PNQBOZ JE > w DPNQBOZ*ET    <$PNQBOZ JE OVMM $PNQBOZ JE >

Slide 28

Slide 28 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> }c )b )a

Slide 29

Slide 29 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> CompletableFuture.supplyAsync { }d }c )b )a

Slide 30

Slide 30 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM kinki_drug where drug_a_id in (1, 2, 3) val kinkis = kinkiDrugService.getKinkiDrugs(drugsIds) // SELECT * FROM drug where id in (4, 5, 6) val drugs = drugService.getDrugs(kinkis.map { it.drugBId }) }d }c )b )a

Slide 31

Slide 31 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM kinki_drug where drug_a_id in (1, 2, 3) val kinkis = kinkiDrugService.getKinkiDrugs(drugsIds) // SELECT * FROM drug where id in (4, 5, 6) val drugs = drugService.getDrugs(kinkis.map { it.drugBId }) // Create Map> val kinkiMap = kinkis.associateWith { kinkiDrug -> drugs.filter { it.id == kinkiDrug.drugBId } }x }d }c )b )a

Slide 32

Slide 32 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> CompletableFuture.supplyAsync { // SELECT * FROM kinki_drug where drug_a_id in (1, 2, 3) val kinkis = kinkiDrugService.getKinkiDrugs(drugsIds) // SELECT * FROM drug where id in (4, 5, 6) val drugs = drugService.getDrugs(kinkis.map { it.drugBId }) // Create Map> val kinkiMap = kinkis.associateWith { kinkiDrug -> drugs.filter { it.id == kinkiDrug.drugBId } }x // Create Map> drugIds.associateWith { drugId -> kinkiMap.filter { entry -> entry.key.drugAId == drugId }.values.flatten() } }d }c )b )a

Slide 33

Slide 33 text

#FTU1SBDUJDF

Slide 34

Slide 34 text

0UIFS1SPCMFNT w .BOBHJOH4USJOH,FZ w /BWJHBUJOHUPMPBEFSJNQMFNFOUBUJPOBOEJUTDBMMFF w 5FTUJOHMPBEFSJNQMFNFOUBUJPO w $BDIJOH w /PEPDVNFOUBUJPO

Slide 35

Slide 35 text

.BLFDVTUPN%BUB-PBEFS to be precise, BatchLoader not DataLoader

Slide 36

Slide 36 text

context.setDataLoaderRegistry( DataLoaderRegistry().register( “key_kinki_drugs_by_drugs_id”, DataLoader.newMappedDataLoader { drugIds, _ -> CompletableFuture.supplyAsync { // do whatever you want }d }c )b )a .BLFDVTUPN#BUDI-PBEFS

Slide 37

Slide 37 text

@Component class DrugDataLoader : MappedBatchLoader> { override fun load(ids: Set?): CompletionStage>> { return CompletableFuture.supplyAsync { // do whatever you want }a }b }c .BLFDVTUPN#BUDI-PBEFS

Slide 38

Slide 38 text

4USJOH,FZ /BWJHBUJPO context.setDataLoaderRegistry( DataLoaderRegistry().register( // Use class name DrugDataLoader::class.qualifiedName, DataLoader.newMappedDataLoader(drugDataLoader) )b )a @Component class DrugDataLoader : MappedBatchLoader> { override fun load(ids: Set?): CompletionStage>> { return CompletableFuture.supplyAsync { // do whatever you want }a }b }c @Suppress("unused") fun getKinkiDrugs(drug: Drug, environment: DataFetchingEnvironment): CompletableFuture>? { return environment // Use class name .getDataLoader>(DrugDataLoader::class.qualifiedName) .load(drug.id) }b

Slide 39

Slide 39 text

0UIFS1SPCMFNT 㾎.BOBHJOH4USJOH,FZ 㾎/BWJHBUJOHUPMPBEFSJNQMFNFOUBUJPOBOEJUTDBMMFF w 5FTUJOHMPBEFSJNQMFNFOUBUJPO w $BDIJOH w /PEPDVNFOUBUJPO

Slide 40

Slide 40 text

@Component class DrugDataLoader : MappedBatchLoader> { override fun load(ids: Set?): CompletionStage>> { return CompletableFuture.supplyAsync { // do whatever you want }a }b }c .BLFDVTUPN#BUDI-PBEFS .PDLBOEUFTUMPBENFUIPE

Slide 41

Slide 41 text

0UIFS1SPCMFNT 㾎.BOBHJOH4USJOH,FZ 㾎/BWJHBUJOHUPMPBEFSJNQMFNFOUBUJPOBOEJUTDBMMFF 㾎5FTUJOHMPBEFSJNQMFNFOUBUJPO w $BDIJOH w /PEPDVNFOUBUJPO

Slide 42

Slide 42 text

4USJOH,FZ /BWJHBUJPO val context = GraphQLContext(httpServletRequest, httpServletResponse) context.setDataLoaderRegistry( DataLoaderRegistry().register( cDrugDataLoader::class.qualifiedName, // cache survive until drugDataLoader DataLoader.newMappedDataLoader(drugDataLoader) )b )a return context @Component class DrugDataLoader : MappedBatchLoader> { // keep cache here override fun load(ids: Set?): CompletionStage>> { return CompletableFuture.supplyAsync { // do whatever you want }a }b }c

Slide 43

Slide 43 text

0UIFS1SPCMFNT 㾎.BOBHJOH4USJOH,FZ 㾎/BWJHBUJOHUPMPBEFSJNQMFNFOUBUJPOBOEJUTDBMMFF 㾎5FTUJOHMPBEFSJNQMFNFOUBUJPO 㾎$BDIJOH w /PEPDVNFOUBUJPO

Slide 44

Slide 44 text

%PDVNFOUBUJPO

Slide 45

Slide 45 text

5IBOLZPV