2016-04-16 6 views
6

किसी स्कीमा में किसी क्वेरी को परिभाषित करते समय, मैं एक तर्क के डिफ़ॉल्ट मान के रूप में उपयोग करने के लिए पहले घोषित किए गए ग्राफ़क्यूएलयूम टाइप के मान को कैसे संदर्भित करूं?ग्राफ़क्यूएलएनयूटी टाइप में डिफ़ॉल्ट रूप के रूप में ग्राफ़क्यूएल क्वेरी तर्क के नामों का उपयोग कैसे करें?

मान लीजिए कि ObservationPeriod GraphQLEnumType निम्नलिखित मैं परिभाषित किया है:

observationPeriodEnum = new GraphQLEnumType { 
    name: "ObservationPeriod" 
    description: "One of the performance metrics observation periods" 
    values: 
    Daily: 
     value: '1D' 
     description: "Daily" 
    […] 
} 

और क्वेरी तर्क period के प्रकार के रूप में इसका इस्तेमाल:

queryRootType = new GraphQLObjectType { 
    name: "QueryRoot" 
    description: "Query entry points to the DWH." 
    fields: 
    performance: 
     type: performanceType 
     description: "Given a portfolio EID, an observation period (defaults to YTD) 
        and as-of date, as well as the source performance engine, 
        return the matching performance metrics." 
     args: 
     period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily ← how to achieve this? 
     […] 
} 
वर्तमान में

मैं के रूप में वास्तविक '1D' स्ट्रिंग मान उपयोग कर रहा हूँ डिफ़ॉल्ट मान; इस काम करता है:

 period: 
      type: observationPeriodEnum 
      defaultValue: '1D' 

लेकिन वहाँ एक तरह से मैं Daily प्रतीकात्मक नाम के बजाय इस्तेमाल कर सकते हैं क्या है? मुझे स्कीमा के भीतर नामों का उपयोग करने का कोई तरीका नहीं मिला। क्या मैंने कुछ अनदेखा किया है?

मैं, पूछ रहा हूँ क्योंकि मैं भी स्थिरांक का एक सेट के रूप में व्यवहार करने के लिए, और स्कीमा परिभाषा इस तरह उन्हें उपयोग करने में सक्षम होने के लिए एक enum प्रकार उम्मीद कर रहा था:

 period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily 

भोले वैकल्पिक हल:

## 
# Given a GraphQLEnumType instance, this macro function injects the names 
# of its enum values as keys the instance itself and returns the modified 
# GraphQLEnumType instance. 
# 
modifiedWithNameKeys = (enumType) -> 
    for ev in enumType.getValues() 
    unless enumType[ ev.name]? 
     enumType[ ev.name] = ev.value 
    else 
     console.warn "SCHEMA> Enum name #{ev.name} conflicts with key of same 
     name on GraphQLEnumType object; it won't be injected for value lookup" 
    enumType 

observationPeriodEnum = modifiedWithNameKeys new GraphQLEnumType { 
    name: "description: "Daily"" 
    values: 
    […] 

जो के रूप में स्कीमा परिभाषा वांछित इसका इस्तेमाल करने की अनुमति देता है:

 period: 
      type: observationPeriodEnum 
      defaultValue: observationPeriodEnum.Daily 

बेशक, यह संशोधक अपने वादे fullfils, enum नाम GraphQLEnumType मौजूदा विधि और चर नाम के साथ हस्तक्षेप नहीं करते केवल जब तक (जो वर्तमान में कर रहे हैं: name, description, _values, _enumConfig, _valueLookup, _nameLookup, getValues, serialize, parseValue, _getValueLookup, _getNameLookup और toString - https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L687 में लाइन 687 के आसपास GraphQLEnumType वर्ग की परिभाषा देखें)

उत्तर

1

मैं सिर्फ इस में भाग गया। मेरे enum:

const contributorArgs = Object.assign(
    {}, 
    connectionArgs, { 
    sort: { 
     type: new GraphQLEnumType({ 
     name: 'ContributorSort', 
     values: { 
      top: { value: 0 }, 
     }, 
     }) 
    }, 
    } 
); 

मेरे प्रश्नों में, मैं कर रहा था:

... on Topic { 
    id 
    contributors(first: 10, sort: 'top') { 
    ... 
    } 
} 

बाहर कर देता है तो आप सिर्फ मान को उद्धृत नहीं है (जो इस बारे में सोच के बाद समझ में आता है, यह enum में एक मूल्य है एक

... on Topic { 
    id 
    contributors(first: 10, sort: top) { 
    ... 
    } 
} 
+0

हाय @ मैथ्यू हर्बस्ट, इस पर ध्यान देने और अपने अनुभव को साझा करने के लिए धन्यवाद - जो एक जीक्यूएल क्वेरी (यानी, रनटाइम »पर) में एक अनुमानित शाब्दिक मूल्य बताते हुए संबंधित है। मेरा प्रश्न हालांकि * स्कीमा घोषणा * के बारे में था: स्कीमा घोषित करते समय, शाब्दिक मूल्य को डुप्लिकेट करने के बजाय प्रतीक का उपयोग करके, गणना किए गए मानों में से किसी एक को कैसे एक्सेस किया जाए? - कि, «स्कीमा डिजाइन समय» पर, बल्कि «क्वेरी-टाइम/रनटाइम»। – Olivier

0

यह स्कीमा परिभाषा भाषा के माध्यम से डिफ़ॉल्ट इनपुट के रूप में enum मूल्यों की घोषणा करने के possible है, लेकिन ऐसा लगता है कि आप केवल जे एस पुस्तकालय एपीआई का उपयोग कर रहे आप हो सकता है: प्रकार, न कि वास्तविक मूल्य। काम करने के उदाहरण के लिए look at the ASTs और comparing that with the AST आपके जेएस कोड के उत्पादन से समाधान के लिए एक समाधान प्राप्त करने के लिए खून बह रहा है।

क्षमा करें कोई समाधान नहीं, लेकिन उम्मीद है कि मदद करता है!

संबंधित मुद्दे