ð€ æ°ããGato GraphQLã®ãªãªãŒã¹ã«ãªã1.5幎ãããã£ãã®ãïŒ
Gato GraphQLã®ããŒãžã§ã³0.9ããªãªãŒã¹ãããŸããããªãªãŒã¹ãŸã§ã«ã»ãŒ1.5幎ã®éçºæéãšã16000以äžã®ã³ããããèŠããŸããã確ãã«é·ãæéã§ãïŒ
Hacker Newsã§ãã®çºè¡šãå ±æããéãæ¬¡ã®ãããªè³ªåãåããŸããïŒ
[...] 16kãã®ã³ãããã«äœãå«ãŸããŠããã®ãæ°ã«ãªããŸããç§ããããŸã§æºãã£ããããžã§ã¯ãã§ãã³ãããæ°ãäžäžãè¶ ãããã®ã¯ãæ°å人ããæ°çŸäººããã«ã¿ã€ã ã§åããŠããŸããã[...] ãã®æçš¿ã§ã¯è§ŠããããŠããªããããªãå æãã¹ãè€éãããã£ãã®ã§ããããïŒ
ã³ãããæ°ã¯ããŸãä¿¡é Œæ§ã®é«ãææšã§ã¯ãããŸãããéåžžã«åçŽãªå€æŽãäžã€ã®ã³ããããšããŠããã·ã¥ããããšãããããã§ãã16kã®ã³ãããã®ãã¡å€ãã¯"typo"ã®ä¿®æ£ããREADMEã®èª¬æãå°ãæ¹åããã ãã®ãã®ã§ããã
ããã§ããã³ãããæ°ã¯å®éã®äœæ¥éã®ç®å®ã«ã¯ãªããŸãããŸããäžåºŠã«æ°åãããã«ã¯æ°çŸãã®å€æŽãå«ã倧éã®ã³ãããã倿°ãããŸãããããŒãžã§ã³0.8ãš0.9ã®éã®å€æŽã¯å®éã«éåžžã«å€§ããããããå®çŸããã«ã¯åªåãšæéãå¿
èŠã§ããã
ãã®ããã°èšäºã§ã¯ãããã»ã©é·ãæéãããã£ãçç±ã説æããããã«ããããã®å€æŽå
容ã玹ä»ããŸããããããŠãã³ãŒãããŒã¹ã«è¿œå ãããé«åºŠãªæ©èœã®ãã¬ãã¥ãŒãã玹ä»ããŸãããããã¯ä»åŸãªãªãŒã¹äºå®ã®ããŒãžã§ã³1.0ã§æ¥ã®ç®ãèŠãããšã«ãªããŸãã
GraphQLãµãŒããŒã®èæ¯
ãŸãããã®ãšã³ãžã³ã®æŽå²ãšããã®åäœã«é¢ããæè¡çãªè©³çްãå°ãã玹ä»ããŸãã
ïŒããã¯äž»ã«éçºè ã®æ¹åãã®å 容ã§ããæè¡çãªè©±ã«èå³ããªãæ¹ã¯ã次ã®ã»ã¯ã·ã§ã³ã«ãé²ã¿ãã ãããïŒ
Gato GraphQLã¯PoPïŒPHP ã§ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããšã³ãžã³ã§ãJavaScript ã® React ã Vue ã«çžåœããŸãïŒã®äžã«æ§ç¯ãããŠããŸãããã®ãšã³ãžã³ãžã®äŸåã¯çµ¶å¯Ÿçã§ããããã®ãããã©ã°ã€ã³ã¯GitHubäžã®GatoGraphQL/GatoGraphQLã¢ãã¬ãã«ãã¹ããããŠããŸãã
å éšçã«ã¯ããã®äŸåé¢ä¿ã¯æ¬¡ã®ãããªåœ¢ã«ãªã£ãŠããŸãã
Gato GraphQLã¯ãGraphQLã¯ãšãªããŸãåçã®ã³ã³ããŒãã³ãã¢ãã«ã«å€æããPoPããã®ã¢ãã«ã解決ããŠå¿ èŠãªããŒã¿ããã¹ãŠååŸãããã®åŸããŒã¿ãGraphQLã¯ãšãªã®åœ¢ã«æŽåœ¢ãããŸãã
2013幎ãã2014幎ããã«PoP ã®éçºãå§ãããšããGraphQL ã¯ãŸã ååšããŠããããã³ã³ããŒãã³ãã¢ãã«ãããŒã¿ã«è§£æ±ºããããã®æ¹æ³è«ã¯ãŒãããèšèšã»å®è£
ãããŸãããåç
§ãšãªãã¢ãã«ããªãã£ãããšïŒæŠå¿µã«ã€ããŠã¯GraphQLãå®è£
ã«ã€ããŠã¯graphql-jsãªãã¡ã¬ã³ã¹ãããžã§ã¯ãã®ãããªïŒã¯ãåŸã§èª¬æããããã«ãé害ã«ããªããæµã¿ã«ããªããŸããã
PoPã¯åœåããµãŒããŒãµã€ãã§ãŠã§ããµã€ãå
šäœãHTMLãšããŠã¬ã³ããªã³ã°ããããã«èšèšãããŠãããããŒãžã®URLã«?output=jsonã远å ãããšJSONãã©ãŒãããã§ãã®ãŸãŸã®ããŒã¿ãå
¬éãã远å ã®URLãã©ã¡ãŒã¿ãŒã§ååŸããããŒã¿ïŒèšå®ãDBãªããžã§ã¯ãããŒã¿ïŒãããã«çµã蟌ããããã«ãªã£ãŠããŸããã
以äžã®ãªã³ã¯ãã¯ãªãã¯ããŠã¿ãŠãã ããïŒãã¹ãŠåããŠã§ãããŒãžãæããŠããŸãããURLãã©ã¡ãŒã¿ãŒãç°ãªããŸãïŒãã©ã®ããã«ç°ãªãããã確èªãã ããïŒ
- HTMLã³ã³ãã³ãïŒmesym.com/en/posts/
- JSONçããŒã¿ïŒèšå® + DBïŒïŒmesym.com/en/posts/?output=json
- JSONçããŒã¿ïŒDBïŒïŒmesym.com/en/posts/?output=json&module=data
æåŸã®ãªã³ã¯ãã¯ãªãã¯ãããšãããèªèã蚪ããŸããããã¯ã»ãŒGraphQLãã®ãã®ã§ãïŒå¯äžã®å€§ããªéãã¯ãã¬ã¹ãã³ã¹å ã®ããŒã¿ãæé»çã§ãããšããç¹ã§ãããŒãžã«å«ãŸããã³ã³ããŒãã³ãïŒPHPïŒã«ãã£ãŠãã§ã«å®çŸ©ãããŠããããã§ããäžæ¹GraphQLã§ã¯ãã¯ãšãªãéããŠååŸããããŒã¿ãèªåã§æ±ºå®ã§ããŸãã
ããã§2019幎ããã«GraphQLãç¥ã£ããšããPoPã§GraphQLãµãŒããŒãå®çŸããããšã¯ç§ã«ãšã£ãŠåœç¶ã®ããšã§ãããããã¹ãããšã¯GraphQLã¯ãšãªãå ¥åãšããŠåãåãããã®ã¯ãšãªã«åºã¥ããŠã³ã³ããŒãã³ãã¢ãã«ããã®å Žã§çæããã ãã§ããã£ãã®ã§ãã
ãããŠå®éã«ããããŸãããããŸãæ©èœããŸããããããåäœãé ãã£ãã®ã§ããPoPã¯ç¬èªã®å ¥åãã©ãŒããããçè§£ãããã®ã ã£ããããGraphQLã¯ãšãªãPoPãã©ãŒãããã«å€æããå¿ èŠããããŸããïŒ
- GraphQLã¯ãšãªãããŒã¹ããæ¬¡ã«
- ã¯ãšãªãPoPãã©ãŒãããã«å€æããæ¬¡ã«
- PoPãã©ãŒããããããŒã¹ãã
GraphQLã¯ãšãªã®ããŒã¹ã2åè¡ããïŒGraphQLçšã«äžåºŠãPoPçšã«äžåºŠïŒãPoPãã©ãŒãããã¯ASTã䜿ã£ãŠè§£æ±ºããã®ã§ã¯ãªããã¯ãšãªæååãäœåºŠãããŒã¹ããã ãã§ãããïŒASTã䜿ããªãã®ã¯æãã³ãŒãã£ã³ã°ã§ããããåŸãã¹ã仿§ããªããéçºãææ©çã«é²ãã§ãããããåçŽãªsubstr(...)ã§ãã®æ¥ãã®æ¥ãä¹ãåã£ãŠããŸãããïŒ
GraphQL仿§ããªãã£ãããšãé害ã ã£ãã®ã¯ãã®ããã§ããç§ã®ãœãªã¥ãŒã·ã§ã³ã¯é
ãïŒããŒãžã§ã³0.8ã®æç¹ã§ã¯ãã®ç¶æ³ã§ããïŒãä¿®æ£ããããšã«ããŸããã
ãšã³ãžã³ãGraphQL-firstã«è»¢æãã
ç§ã決ãã解決çã¯ãPoPããã€ãã£ãã§GraphQLèšèªã話ããããã«ããããšã§ããããããã°ãPoPãžã®å ¥åãšããŠGraphQLã¯ãšãªãæž¡ãã ãã§ã远å ã®ã¢ããã¿ãŒãªãã«ããŸãç©äºãäºéã«ããªãããšãªããã³ã³ããŒãã³ãã¢ãã«ã«å€æãããããã«ãªããŸãã
ããã¯PoPãããžã§ã¯ããããµãŒããŒãµã€ãã§ãŠã§ããµã€ãåãã«ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãGraphQLã¯ãšãªã解決ããããæ¹é ãããPHPã©ã€ãã©ãªãããå®éã«GraphQLãµãŒããŒãã®ãã®ãžãšè»¢æããããšãæå³ããŠããŸããã
ã³ãŒãããŒã¹ã¯ãã®åŸãå€§èŠæš¡ãªå€é©ãéãããšã³ãžã³å ã®ãã¹ãŠã®PHPãµãŒãã¹éã§ç¶æ ãäŒéããããã®åºç€ãšããŠGraphQL ASTãå°å ¥ãããŸãããGraphQL ASTãªããžã§ã¯ããPoPãžã®å ¥åãšãªããŸããïŒã¯ãšãªæååã®ä»£ããã«ïŒã
PHPåãã®ä»ã®GraphQLãµãŒããŒã¯graphql-phpã«äŸåããŠããŸãããGato GraphQLãã©ã°ã€ã³ã¯ããã§ã¯ãããŸãããããã¯ã¡ã³ããã³ã¹ã®èгç¹ã§ã¯æªããã¥ãŒã¹ã§ããïŒä»è
ãã³ãŒãã£ã³ã°ãããã®ãåå©çšã§ããªãããïŒãç¬ç«æ§ãšãã芳ç¹ã§ã¯è¯ããã¥ãŒã¹ã§ããèªåã®ããŒã¹ãšå€æã§ãã©ã°ã€ã³ã«ã«ã¹ã¿ã æ©èœã远å ã§ããŸãïŒãã®ãããã©ã°ã€ã³ã¯ãã§ã«ãoneofãå
¥åãªããžã§ã¯ããæäŸããŠããŸãïŒã
ãããŠä»¥äžã®ã»ã¯ã·ã§ã³ã§ç€ºãããã«ãããã¯å€§ããªã¢ããã³ããŒãžã§ãã
GraphQLãžã®ç¬èªæ©èœã®çµã¿èŸŒã¿
GraphQLã¯éåžžãããŒã¿ãã§ããã³ã°ãšé¢é£ä»ããããŠããŸããåœç¶ãªãããGato GraphQLããä»»æã®ããŒã¿ïŒæçš¿ããŠãŒã¶ãŒãã³ã¡ã³ããªã©ïŒãååŸã§ããŸãïŒ
query {
posts(
pagination: { limit: 5, offset: 20 }
sort: { by: DATE, order: ASC }
) {
id
title
content
url
author {
id
name
url
}
comments {
id
date
content
}
}
}ãããããã¯æãå±ããããææã«éããŸãããGraphQLã¯ããŒã¿ã®æäœã倿ãããã«ã¯ãµãŒãã¹éã®ä»²ä»ãšããŠGraphQLããã€ãã©ã€ã³ã«çµã¿èŸŒããªã©ãä»ã®å€ãã®ãŠãŒã¹ã±ãŒã¹ã«ã掻çšã§ããŸãã
GraphQLã圹ç«ã€ãŠãŒã¹ã±ãŒã¹ã®äŸã以äžã«æããŸãïŒ
- äžã€ä»¥äžã®ãœãŒã¹ããæ å ±ãæœåºãïŒWordPressãµã€ãã®ãŠãŒã¶ãŒãšMailchimpã®ãã¥ãŒã¹ã¬ã¿ãŒé£çµ¡å ããŒã¿ãªã©ïŒããã®ããŒã¿ãçµã¿åãããåäžã®ããŒã¿ã»ãããšããŠåæãã
- ãµã€ãäžã®ã³ã³ãã³ããé©å¿ãããããã®æäœãå®è¡ããïŒ
- äžåºŠéãã®æäœãšããŠãäŸãã°ãµã€ããå¥ã®ãã¡ã€ã³ã«ç§»è¡ããéã«ã³ã³ãã³ããšã¡ã¿ããŒã¿å
šäœã®
"www.myoldsite.com"ã"mynewsite.com"ã«çœ®ãæãã - ç¶ç¶çãªæäœãšããŠãã©ã€ã¿ãŒãæ°ããããã°èšäºãå
¬éãããã³ã«
"http://"ã"https://"ã«çœ®ãæãã
- äžåºŠéãã®æäœãšããŠãäŸãã°ãµã€ããå¥ã®ãã¡ã€ã³ã«ç§»è¡ããéã«ã³ã³ãã³ããšã¡ã¿ããŒã¿å
šäœã®
- Google Translate APIã«æ¥ç¶ããŠãã¹ãŠã®ããã°èšäºãå¥ã®èšèªã«ç¿»èš³ãã
- ããã°èšäºãå ¬éãããåŸã«èªåçã«ãã€ãŒããéä¿¡ãã
PoPã¯ãããã®ä»ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããããèšèšãããŠãããGraphQLã§ã¯ïŒæ¬æ¥ïŒãµããŒããããŠããªãæ©èœãéããŠå®çŸããŠããŸãïŒ
- ã¹ããŒãå ã®ãã¹ãŠã®åã«è¿œå ããããæ©èœããã£ãŒã«ãïŒãããŒã¿ããã£ãŒã«ãã«å ããŠïŒã®ãµããŒã
- åãã¯ãšãªå ã§ããããã£ãŒã«ãã®çµæãå¥ã®ãã£ãŒã«ããžã®å ¥åãšããŠæž¡ã
- ãã£ã¬ã¯ãã£ããåæããŠããããã£ã¬ã¯ãã£ããå¥ã®ãã£ã¬ã¯ãã£ãã®åäœã倿Žã§ããããã«ãã
- ãã£ãŒã«ãã®å€ã«åºã¥ããŠãã£ã¬ã¯ãã£ããåçã«é©çšãããã©ãããæ±ºå®ãã
ãããŠç§ã¯ãããã®æ©èœãGraphQLãµãŒããŒããåãé€ãããã¯å šããããŸããã§ããããã§ã«ã³ãŒãã£ã³ã°ããŠããã確ãã«äŸ¡å€ããããã®ã ããã§ãã
v0.9ãããã»ã©æéãããã£ãäºã€ç®ã®çç±ã¯ãGraphQL仿§ãå£ããªãæ¹æ³ã§ãããã®æ°ããæ©èœãGraphQLã«çµã¿èŸŒãæ¹æ³ãèŠã€ããªããã°ãªããªãã£ãããã§ãïŒããšãã°ãGraphQLæ§æã«æ°ããèŠçŽ ãå°å
¥ããããšã¯èš±å®¹ãããŸããã§ããïŒã
GraphQLã«ãããããŒã¿æäœã®äŸ
ãã©ã°ã€ã³ã§GraphQLã«å°å
¥ãããæ°ããæ©èœã¯ãããŒãžã§ã³1.0ã®ãªãªãŒã¹ãšãšãã«ãè¿ãå°æ¥ã«ããæç¢ºã«èŠããŠããã§ãããããããããã®äžéšã¯ãã§ã«è©Šãããšãã§ããŸãã
以äžã®GraphQLã¯ãšãªã¯ãå€éšã®REST APIãããŠãŒã¶ãŒãšã³ããªã®ãªã¹ããååŸãïŒã¬ã¹ãã³ã¹ãã@removeããããšãã§ããŸãïŒããã®ããŒã¿ãåãã¯ãšãªå
ã®å¥ã®ãã£ãŒã«ãã«å
¥åããåãšã³ããªããemailããããã£ãæœåºããæåŸã«åããšã³ããªã®èšèªãè±èªãŸãã¯ãã€ãèªã®å Žåã«ã®ã¿emailã倧æåã«å€æããŸãïŒ
###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes
{
# Retrieve data from a REST API endpoint
userEntries: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
) # @remove # <= Uncomment this directive to not print the API data
emails: _echo(value: $__userEntries)
# Iterate all the entries, passing every entry
# (under the dynamic variable $userEntry)
# to each of the next 4 directives
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
affectDirectivesUnderPos: [1, 2, 3, 4]
)
# Extract property "lang" from the entry
# via the functionality field `_objectProperty`,
# and pass it onwards as dynamic variable $userLang
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "lang"
}
}
passOnwardsAs: "userLang"
)
# Execute functionality field `_inArray` to find out
# if $userLang is either "en" or "de", and place the
# result under dynamic variable $isSpecialLang
@applyField(
name: "_inArray"
arguments: {
value: $userLang,
array: ["en", "de"]
}
passOnwardsAs: "isSpecialLang"
)
# Extract property "email" from the entry
# and set it back as the value for that entry
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "email"
}
}
setResultInResponse: true
)
# If $isSpecialLang is `true` then execute
# directive `@strUpperCase`
@if(condition: $isSpecialLang)
@strUpperCase
}ããããã®ã¬ã¹ãã³ã¹ã§ãïŒç¹å®ã®emailã®ã¿ã倧æåã«ãªã£ãŠããããšã«æ³šç®ããŠãã ããïŒïŒ
{
"data": {
"userEntries": [
{
"email": "abracadabra@ganga.com",
"lang": "de"
},
{
"email": "longon@caramanon.com",
"lang": "es"
},
{
"email": "rancotanto@parabara.com",
"lang": "en"
},
{
"email": "quezarapadon@quebrulacha.net",
"lang": "fr"
},
{
"email": "test@test.com",
"lang": "de"
},
{
"email": "emilanga@pedrola.com",
"lang": "fr"
}
],
"emails": [
"ABRACADABRA@GANGA.COM",
"longon@caramanon.com",
"RANCOTANTO@PARABARA.COM",
"quezarapadon@quebrulacha.net",
"TEST@TEST.COM",
"emilanga@pedrola.com"
]
}
}ãã²ãèªèº«ã§ç¢ºèªããŠã¿ãŠãã ããïŒãRunããã¿ã³ãæŒããŠã¯ãšãªãå®è¡ããŠãã ããïŒ
###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes {
# Retrieve data from a REST API endpoint
userEntries: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
)
# @remove # <= Uncomment this directive to not print the API data
emails: _echo(value: $__userEntries)
# Iterate all the entries, passing every entry
# (under the dynamic variable $userEntry)
# to each of the next 4 directives
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
affectDirectivesUnderPos: [1, 2, 3, 4]
)
# Extract property "lang" from the entry
# via the functionality field `_objectProperty`,
# and pass it onwards as dynamic variable $userLang
@applyField(
name: "_objectProperty"
arguments: { object: $userEntry, by: { key: "lang" } }
passOnwardsAs: "userLang"
)
# Execute functionality field `_inArray` to find out
# if $userLang is either "en" or "de", and place the
# result under dynamic variable $isSpecialLang
@applyField(
name: "_inArray"
arguments: { value: $userLang, array: ["en", "de"] }
passOnwardsAs: "isSpecialLang"
)
# Extract property "email" from the entry
# and set it back as the value for that entry
@applyField(
name: "_objectProperty"
arguments: { object: $userEntry, by: { key: "email" } }
setResultInResponse: true
)
# If $isSpecialLang is `true` then execute
# directive `@strUpperCase`
@if(condition: $isSpecialLang)
@strUpperCase
}GraphQLã®ä»æ§ã«çžãããªãã£ãããšã¯é害ã ã£ããšè¿°ã¹ãŸããããïŒæ¯ãè¿ã£ãŠã¿ããšïŒæµã¿ã§ããããŸãããGraphQL仿§ã®å¶çŽããªãã£ãããããããã®æ°ããæ©èœãèªç±ã«å€¢æ³ã§ããããã§ãã
ãããŠä»ããããã®æ©èœãGato GraphQLã«ç§»è¡ãããããšã§ãWordPressãµã€ãã®ã³ã³ãã³ãã®ååŸãæäœã倿ã«é¢ããããããçšéã«ãããŠãéåžžã«æçšãªå³æ¹ãšãªãããšãã§ããŸããïŒãã ãããããã«ã¢ã¯ã»ã¹ã§ããã®ã¯ä»åŸãªãªãŒã¹ãããv1.0ãããšãªããŸããïŒ
æéã¯ããããŸãããããã®åªåã¯ç¢ºãã«å ±ããããã®ã§ããã
ãã²ã詊ããã ããïŒ
é·ãåŸ ã¡æéãããã ãã®äŸ¡å€ããã£ããšç¢ºä¿¡ããŠããã ããŸãããïŒããã§ããã°å¹žãã§ãïŒ
ãã²ãã©ã°ã€ã³ãããŠã³ããŒãããŠã確èªããŠã¿ãŠãã ããïŒ
éçºç¶æ³ãæ°ããããã¥ã¡ã³ããv1.0ãå«ãä»åŸã®ãªãªãŒã¹ã«é¢ãããã¥ãŒã¹ãåãåãããã§ããïŒãã²ãã¥ãŒã¹ã¬ã¿ãŒã«ç»é²ããŠãã ããã
GitHubäžã®ãªãŒãã³ãœãŒã¹ã³ãŒããæ¢çŽ¢ãããã§ããïŒGatoGraphQL/GatoGraphQLãã芧ãã ããïŒã¹ã¿ãŒããæ°è»œã«ã©ãã...ã¹ã¿ãŒã¯å€§æè¿ã§ãïŒ âïžâïžâïžïŒ
ãšããã§ãWordPressäžã§ã©ã®ãããªã³ã³ãã³ã倿ãå¿ èŠã§ããïŒãã®ããã«å°çšã®åçšãã©ã°ã€ã³ããã§ã«äœ¿çšããŠããå Žåãå«ããŠïŒïŒãã²ãŠãŒã¹ã±ãŒã¹ããç¥ãããã ããã
ãã®ã³ã³ãã³ããæ°ã«å ¥ã£ããããã²å人ãååãšã·ã§ã¢ããŠãæãåºããŠãã ãã â€ïžã