예제 #1
0
 public TermCollector(QueryGroup group)
 {
     itsRequiredTerms        = new Hashtable();
     itsOptionalTerms        = new Hashtable();
     itsOptionalNestingDepth = 0;
     group.Accept(this);
 }
예제 #2
0
        private string GenerateSelect(QueryGroup group)
        {
            group.Accept(this);

            if (itsJoins.Count == 0 && itsWhereTerms.Count == 0)
            {
                itsIsFeasible = false;
                itsIsMappable = false;
                return(string.Empty);
            }

            foreach (Variable variable in itsQuery.Variables)
            {
                if (itsVariableFirstMentions.Contains(variable.Name))
                {
                    if (!itsSelectedVariables.Contains(variable.Name))
                    {
                        itsVariableList.Add(variable);
                        itsSelectedVariables[variable.Name] = variable;

                        itsSelectTerms.Add("rn_" + variable.Name + ".resourceHash rh_" + variable.Name);
                        itsSelectTerms.Add("rn_" + variable.Name + ".nodeHash nh_" + variable.Name);
                        itsSelectTerms.Add("rn_" + variable.Name + ".nodeType nt_" + variable.Name);

                        itsJoins.Add("JOIN ResourceNodes rn_" + variable.Name + " ON rn_" + variable.Name + ".resourceHash=" + itsVariableFirstMentions[variable.Name] + " AND rn_" + variable.Name + ".graphId=" + itsVariableTables[variable.Name] + ".graphId");
                        itsJoins.Add("LEFT OUTER JOIN UriRefs u_" + variable.Name + " ON rn_" + variable.Name + ".nodeHash=u_" + variable.Name + ".hash AND rn_" + variable.Name + ".nodeType='u'");

                        if (!itsNonLiteralVariables.Contains(variable.Name))
                        {
                            itsSelectTerms.Add("COALESCE(u_" + variable.Name + ".uri, pl_" + variable.Name + ".value, l_" + variable.Name + ".value) val_" + variable.Name);
                            itsSelectTerms.Add("COALESCE(tl_" + variable.Name + ".value, t_" + variable.Name + ".value) sub_" + variable.Name);

                            itsJoins.Add("LEFT OUTER JOIN PlainLiterals pl_" + variable.Name + " ON rn_" + variable.Name + ".nodeHash=pl_" + variable.Name + ".hash AND rn_" + variable.Name + ".nodeType='p'");
                            itsJoins.Add("LEFT OUTER JOIN Languages l_" + variable.Name + " ON pl_" + variable.Name + ".languageHash=l_" + variable.Name + ".hash");
                            itsJoins.Add("LEFT OUTER JOIN TypedLiterals tl_" + variable.Name + " ON rn_" + variable.Name + ".nodehash=tl_" + variable.Name + ".hash AND rn_" + variable.Name + ".nodeType='t'");
                            itsJoins.Add("LEFT OUTER JOIN DataTypes t_" + variable.Name + " ON tl_" + variable.Name + ".datatypeHash=t_" + variable.Name + ".hash");
                        }
                        else
                        {
                            itsSelectTerms.Add("u_" + variable.Name + ".uri val_" + variable.Name);
                            itsSelectTerms.Add("NULL sub_" + variable.Name);
                        }
                    }
                }
                else
                {
                    itsSelectTerms.Add("NULL rh_" + variable.Name);
                    itsSelectTerms.Add("NULL nh_" + variable.Name);
                    itsSelectTerms.Add("NULL nt_" + variable.Name);
                    itsSelectTerms.Add("NULL val_" + variable.Name);
                    itsSelectTerms.Add("NULL sub_" + variable.Name);
                }
            }


            return(BuildSql());
        }