/// <summary>
        /// Creates a new sones GQL instance
        /// </summary>
        /// <param name="myIGraphDBInstace">The graph database instance on which the gql statements are executed</param>
        public SonesQueryLanguage(IGraphDB myIGraphDBInstace)
        {
            _IGraphDBInstance = myIGraphDBInstace;
            _settings = new GraphApplicationSettings(SonesGQLConstants.ApplicationSettingsLocation);

            #region plugin manager

            _GQLPluginManager = new GQLPluginManager();

            #endregion

            #region create gql grammar and set extendable members

            _GQLGrammar = new SonesGQLGrammar(myIGraphDBInstace);

            SetExtendableMember(_GQLGrammar);

            #endregion

            //build parser
            _parser = new Parser(_GQLGrammar);

            //check language
            if (_parser.Language.ErrorLevel != GrammarErrorLevel.Warning && _parser.Language.ErrorLevel != GrammarErrorLevel.NoError)
            {
                throw new IronyInitializeGrammarException(_parser.Language.Errors, "");
            }
        }
        private void SetExtendableMember(SonesGQLGrammar myGQLGrammar)
        {
            #region aggregate

            List<IGQLAggregate> aggregates = new List<IGQLAggregate>();
            foreach (var plugin in _GQLPluginManager.GetPluginNameForType<IGQLAggregate>())
            {
                aggregates.Add(_GQLPluginManager.GetAndInitializePlugin<IGQLAggregate>(plugin));
            }

            if (aggregates.Count == 0)
            {
                throw new GQLGrammarSetExtandableMemberException(typeof(IGQLAggregate), 
                            "There is no plugin found to set in GQL grammar.");
            }
            myGQLGrammar.SetAggregates(aggregates);

            #endregion

            #region functions

            List<IGQLFunction> functions = new List<IGQLFunction>();
            foreach (var plugin in _GQLPluginManager.GetPluginNameForType<IGQLFunction>())
            {
                functions.Add(_GQLPluginManager.GetAndInitializePlugin<IGQLFunction>(plugin) as IGQLFunction);
            }

            if (functions.Count == 0)
            {
                throw new GQLGrammarSetExtandableMemberException(typeof(IGQLFunction), 
                            "There is no plugin found to set in GQL grammar.");
            }
            myGQLGrammar.SetFunctions(functions);

            #endregion

            #region indces

            List<String> indices = new List<string>();

            indices.AddRange(_GQLPluginManager.GetPluginNameForType<ISonesVersionedIndex>());
            indices.AddRange(_GQLPluginManager.GetPluginNameForType<ISonesIndex>());

            if (indices.Count < 1)
            {
                throw new GQLGrammarSetExtandableMemberException(typeof(ISonesIndex),
                            @"There is no valid index plugin found to set in GQL grammar.");
                           
            }

            myGQLGrammar.SetIndices(indices);

            #endregion

            #region import

            List<IGraphDBImport> importer = new List<IGraphDBImport>();
            foreach (var plugin in _GQLPluginManager.GetPluginNameForType<IGraphDBImport>())
            {
                importer.Add(_GQLPluginManager.GetAndInitializePlugin<IGraphDBImport>(plugin));
            }

            if (importer.Count == 0)
            {
                throw new GQLGrammarSetExtandableMemberException(typeof(IGraphDBImport), 
                            "There is no plugin found to set in GQL grammar.");
            }
            myGQLGrammar.SetGraphDBImporter(importer);

            #endregion

            #region export

            List<IGraphDBExport> exporter = new List<IGraphDBExport>();
            foreach (var plugin in _GQLPluginManager.GetPluginNameForType<IGraphDBExport>())
            {
                exporter.Add(_GQLPluginManager.GetAndInitializePlugin<IGraphDBExport>(plugin));
            }

            if (exporter.Count == 0)
            {
                throw new GQLGrammarSetExtandableMemberException(typeof(IGraphDBExport), 
                            "There is no plugin found to set in GQL grammar.");
            }
            myGQLGrammar.SetGraphDBExporter(exporter);

            #endregion

            #region additional statements

            List<IGQLStatementPlugin> statements = new List<IGQLStatementPlugin>();
            foreach (var plugin in _GQLPluginManager.GetPluginNameForType<IGQLStatementPlugin>())
            {
                statements.Add(_GQLPluginManager.GetAndInitializePlugin<IGQLStatementPlugin>(plugin,
                    new Dictionary<string, object>
                    {
                        {"sonesGQL", myGQLGrammar},
                        {"graphDB", _IGraphDBInstance}
                    }));
            }

            myGQLGrammar.SetStatements(statements);

            #endregion
        }