public string GenerateQuery(QueryModel queryModel, out ScalarResultBehavior scalarResultBehavior)
        {
            // If ITypeSerializer is an IExtendedTypeSerializer, use it as the member name resolver
            // Otherwise fallback to the legacy behavior which assumes we're using Newtonsoft.Json
            // Note that DefaultSerializer implements IExtendedTypeSerializer, but has the same logic as JsonNetMemberNameResolver

            var serializer = Serializer as IExtendedTypeSerializer;

#pragma warning disable CS0618 // Type or member is obsolete
            var memberNameResolver = serializer != null ?
                                     (IMemberNameResolver) new ExtendedTypeSerializerMemberNameResolver(serializer) :
                                     (IMemberNameResolver) new JsonNetMemberNameResolver(JsonConvert.DefaultSettings().ContractResolver);
#pragma warning restore CS0618 // Type or member is obsolete

            var methodCallTranslatorProvider = new DefaultMethodCallTranslatorProvider();

            var queryGenerationContext = new N1QlQueryGenerationContext
            {
                MemberNameResolver           = memberNameResolver,
                MethodCallTranslatorProvider = methodCallTranslatorProvider,
                Serializer = serializer,
                // TODO: Don't use .Result
                ClusterVersion = _clusterVersionProvider.GetVersionAsync().Result ?? FeatureVersions.DefaultVersion,
                LoggerFactory  = _cluster.ClusterServices.GetRequiredService <ILoggerFactory>()
            };

            var visitor = new N1QlQueryModelVisitor(queryGenerationContext);
            visitor.VisitQueryModel(queryModel);

            var query = visitor.GetQuery();
            _logger.LogDebug("Generated query: {0}", query);

            scalarResultBehavior = visitor.ScalarResultBehavior;
            return(query);
        }
        public string GenerateQuery(QueryModel queryModel, bool selectDocumentMetadata, out ScalarResultBehavior scalarResultBehavior)
        {
            // If ITypeSerializer is an IExtendedTypeSerializer, use it as the member name resolver
            // Otherwise fallback to the legacy behavior which assumes we're using Newtonsoft.Json
            // Note that DefaultSerializer implements IExtendedTypeSerializer, but has the same logic as JsonNetMemberNameResolver

            var serializer = Serializer as IExtendedTypeSerializer;

#pragma warning disable CS0618 // Type or member is obsolete
            var memberNameResolver = serializer != null ?
                                     (IMemberNameResolver) new ExtendedTypeSerializerMemberNameResolver(serializer) :
                                     (IMemberNameResolver) new JsonNetMemberNameResolver(_configuration.SerializationSettings.ContractResolver);
#pragma warning restore CS0618 // Type or member is obsolete

            var methodCallTranslatorProvider = new DefaultMethodCallTranslatorProvider();

            var queryGenerationContext = new N1QlQueryGenerationContext
            {
                MemberNameResolver           = memberNameResolver,
                MethodCallTranslatorProvider = methodCallTranslatorProvider,
                Serializer             = serializer,
                SelectDocumentMetadata = selectDocumentMetadata,
                ClusterVersion         = VersionProvider.Current.GetVersion(_bucket)
            };

            var visitor = new N1QlQueryModelVisitor(queryGenerationContext);
            visitor.VisitQueryModel(queryModel);

            var query = visitor.GetQuery();
            _log.Debug("Generated query: {0}", query);

            scalarResultBehavior = visitor.ScalarResultBehavior;
            return(query);
        }
        public string ExecuteCollection(QueryModel queryModel)
        {
            //TODO: this should be refactored so that does not rely on NewtonSoft and so that it's using a
            //"pluggable" resolver and translator via configuration.
            var memberNameResolver           = new JsonNetMemberNameResolver(_configuration.SerializationSettings.ContractResolver);
            var methodCallTranslatorProvider = new DefaultMethodCallTranslatorProvider();
            var query = N1QlQueryModelVisitor.GenerateN1QlQuery(queryModel, memberNameResolver,
                                                                methodCallTranslatorProvider, _configuration.Serializer.Invoke());

            Log.Debug(m => m("Generated query: {0}", query));

            return(query);
        }
        public string ExecuteCollection(QueryModel queryModel, out bool resultExtractionRequired)
        {
            // If ITypeSerializer is an IExtendedTypeSerializer, use it as the member name resolver
            // Otherwise fallback to the legacy behavior which assumes we're using Newtonsoft.Json
            // Note that DefaultSerializer implements IExtendedTypeSerializer, but has the same logic as JsonNetMemberNameResolver

            var serializer         = _configuration.Serializer.Invoke() as IExtendedTypeSerializer;
            var memberNameResolver = serializer != null ?
                                     (IMemberNameResolver) new ExtendedTypeSerializerMemberNameResolver(serializer) :
                                     (IMemberNameResolver) new JsonNetMemberNameResolver(_configuration.SerializationSettings.ContractResolver);

            var methodCallTranslatorProvider = new DefaultMethodCallTranslatorProvider();

            var visitor = new N1QlQueryModelVisitor(memberNameResolver, methodCallTranslatorProvider, _configuration.Serializer.Invoke());

            visitor.VisitQueryModel(queryModel);

            var query = visitor.GetQuery();

            Log.Debug(m => m("Generated query: {0}", query));

            resultExtractionRequired = visitor.ResultExtractionRequired;
            return(query);
        }