private void CheckItemName(string firstItemName, string secondItemName)
    {
        if (string.IsNullOrWhiteSpace(firstItemName) || string.IsNullOrWhiteSpace(secondItemName))
        {
            return;
        }

        SyntheticItem item = SyntheticTable.syntheticItems.SingleOrDefault(obj => obj.firstItemName.Equals(firstItemName) && obj.secondItemName.Equals(secondItemName));

        // 彈開
        if (item == null)
        {
            var rb     = GameObject.Find(secondItemName).GetComponent <Rigidbody2D>();
            var xSpeed = Input.GetAxis("Mouse X");
            var ySpeed = Input.GetAxis("Mouse Y");
            rb.velocity = new Vector2(xSpeed, ySpeed) * 2;
        }

        // 觸發事件
        else
        {
            if (item.itemEvents != null)
            {
                item.itemEvents.Invoke();
            }
            if (item.generateItemNames != null)
            {
                foreach (string generateItemName in item.generateItemNames)
                {
                    GenerateItem(generateItemName);
                }
            }
            if (item.disappearItemNames != null)
            {
                foreach (var disappearItemName in item.disappearItemNames)
                {
                    DisableItem(disappearItemName);
                }
            }
        }
    }
        //Method that populates an existing synthetic field item
        private void PopulateExistingSyntheticField(string[] meta)
        {
            int           i  = 0;
            SyntheticItem si = new SyntheticItem();

            //meta should always be a 6, but add check to avoid error
            while (i < meta.Length && (i % 6 == 0))
            {
                si.SyntheticAlias = meta[i++];
                si.SyntheticType  = meta[i++];
                string[] sFields = meta[i++].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                si.SyntheticFields = sFields.ToList <string>();
                string[] sTables = meta[i++].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                si.SyntheticTables = sTables.ToList <string>();
                si.SyntheticX      = meta[i++];
                si.SyntheticY      = meta[i++];
            }

            SelectedSynthItem = si;

            //Check the appropriate radio button based on the SyntheticType
            switch (SelectedSynthItem.SyntheticType)
            {
            case "ADDITION":
                rbMathAdd.Checked = true;
                break;

            case "DIVISION":
                rbMathDivide.Checked = true;
                break;

            case "MULTIPLICATION":
                rbMathMultiply.Checked = true;
                break;

            case "SUBTRACTION":
                rbMathSubtract.Checked = true;
                break;

            case "DATEPART - DAY OF YEAR":
                rbDatePartDayOfYear.Checked = true;
                break;

            case "DATEPART - DAY":
                rbDatePartDays.Checked = true;
                break;

            case "DATEPART - MONTH":
                rbDatePartMonths.Checked = true;
                break;

            case "DATEPART - QUARTER":
                rbDatePartMonths.Checked = true;
                break;

            case "DATEPART - WEEK":
                rbDatePartWeekOfYear.Checked = true;
                break;

            case "DATEPART - YEAR":
                rbDatePartYears.Checked = true;
                break;

            case "DATEDIFF - FROM NOW":
                rbDatePartCalcAge.Checked = true;
                break;

            case "DATEDIFF - FROM TWO DATES":
                rbCalAgeBetween2Dates.Checked = true;
                break;

            case "TO LOWER CASE":
                rbToLowerCase.Checked = true;
                break;

            case "TO UPPER CASE":
                rbToUpperCase.Checked = true;
                break;

            case "LEFT":
                rbPullXLeft.Checked = true;
                break;

            case "RIGHT":
                rbPullXRight.Checked = true;
                break;

            case "SUBSTRING":
                rbPullXAtY.Checked = true;
                break;
            }

            //Set the alias, x, and y values
            txtAlias.Text = si.SyntheticAlias;
            txtX.Text     = si.SyntheticX;
            txtY.Text     = si.SyntheticY;

            //Select all grid rows (needed for an iteration through the rows)
            taig.SelectAllRows();

            //Get a list of the fields (with table) used for the synthetic items construction
            List <string> fieldsWithTable = si.GetFieldsWithTable();

            System.Collections.ArrayList selectedRowIDs = new System.Collections.ArrayList();

            //Loop through the selected grid rows to determine if the row contains the table.field used for the synthetic items construction
            foreach (int rowID in taig.SelectedRows)
            {
                string field = taig.get_item(rowID, "COLUMN_NAME");
                string table = GetLookupTableFromBaseTable(taig.get_item(rowID, "TABLE_NAME"));

                if (fieldsWithTable.Contains(table + "." + field))
                {
                    selectedRowIDs.Add(rowID);
                }
            }

            //Now, deselect all grid rows & select only the rows that contained a match
            taig.DeSelectAllRows();
            taig.SelectRows(selectedRowIDs);

            //Generate the query clause
            GenerateSynthClause();
        }
        private void GenerateSynthClause()
        {
            SyntheticItem si = new SyntheticItem();

            si.SyntheticFields = new List <string>();
            si.SyntheticTables = new List <string>();
            string synth = "";

            if (rbMathAdd.Checked || rbMathDivide.Checked || rbMathMultiply.Checked || rbMathSubtract.Checked || rbConCat.Checked)
            {
                synth = "(";
                string op = "";

                if (rbMathAdd.Checked || rbConCat.Checked)
                {
                    si.SyntheticType = "ADDITION";
                    op = "+";
                }

                if (rbMathDivide.Checked)
                {
                    si.SyntheticType = "DIVISION";
                    op = @"\";
                }

                if (rbMathMultiply.Checked)
                {
                    si.SyntheticType = "MULTIPLICATION";
                    op = "*";
                }

                if (rbMathSubtract.Checked)
                {
                    si.SyntheticType = "SUBTRACTION";
                    op = "-";
                }

                foreach (object o in taig.SelectedRows)
                {
                    int row = (int)o;
                    si.SyntheticFields.Add(taig.get_item(row, "COLUMN_NAME"));
                    si.SyntheticTables.Add(GetLookupTableFromBaseTable(taig.get_item(row, "TABLE_NAME")));
                    synth += GetLookupTableFromBaseTable(taig.get_item(row, "TABLE_NAME")) + "." + Program.BraketizeKeywords(taig.get_item(row, "COLUMN_NAME")) + op;
                }

                // strip off the trailing op
                if (synth.EndsWith(op))
                {
                    synth = synth.Substring(0, synth.Length - 1);
                }

                synth            += ") AS '" + txtAlias.Text + "'";
                si.SyntheticAlias = txtAlias.Text;
            }

            if (rbDatePartDayOfYear.Checked || rbDatePartDays.Checked ||
                rbDatePartMonths.Checked || rbDatePartQuarter.Checked ||
                rbDatePartWeekOfYear.Checked || rbDatePartYears.Checked ||
                rbDatePartCalcAge.Checked || rbCalAgeBetween2Dates.Checked)
            {
                string field = GetLookupTableFromBaseTable(taig.get_item(taig.SelectedRow, "TABLE_NAME")) + "." + Program.BraketizeKeywords(taig.get_item(taig.SelectedRow, "COLUMN_NAME"));
                si.SyntheticFields.Add(taig.get_item(taig.SelectedRow, "COLUMN_NAME"));
                si.SyntheticTables.Add(GetLookupTableFromBaseTable(taig.get_item(taig.SelectedRow, "TABLE_NAME")));

                if (rbDatePartDayOfYear.Checked)
                {
                    si.SyntheticType = "DATEPART - DAY OF YEAR";
                    synth            = "DATEPART(DAYOFYEAR," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartDays.Checked)
                {
                    si.SyntheticType = "DATEPART - DAY";
                    synth            = "DATEPART(DAY," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartMonths.Checked)
                {
                    si.SyntheticType = "DATEPART - MONTH";
                    synth            = "DATEPART(MONTH," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartQuarter.Checked)
                {
                    si.SyntheticType = "DATEPART - QUARTER";
                    synth            = "DATEPART(QUARTER," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartWeekOfYear.Checked)
                {
                    si.SyntheticType = "DATEPART - WEEK";
                    synth            = "DATEPART(WEEK," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartYears.Checked)
                {
                    si.SyntheticType = "DATEPART - YEAR";
                    synth            = "DATEPART(YEAR," + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbDatePartCalcAge.Checked)
                {
                    si.SyntheticType = "DATEDIFF - FROM NOW";
                    synth            = "FLOOR(DATEDIFF(day, " + field + ", GETDATE()) / 365.25) AS '" + txtAlias.Text + "'";
                }

                if (rbCalAgeBetween2Dates.Checked && taig.SelectedRows.Count > 1)
                {
                    field = GetLookupTableFromBaseTable(taig.get_item((int)taig.SelectedRows[0], "TABLE_NAME")) + "." + Program.BraketizeKeywords(taig.get_item((int)taig.SelectedRows[0], "COLUMN_NAME"));
                    si.SyntheticFields.Add(taig.get_item((int)taig.SelectedRows[0], "COLUMN_NAME"));
                    si.SyntheticTables.Add(GetLookupTableFromBaseTable(taig.get_item((int)taig.SelectedRows[0], "TABLE_NAME")));
                    string field2 = Program.BraketizeKeywords(taig.get_item((int)taig.SelectedRows[1], "COLUMN_NAME"));
                    si.SyntheticFields.Add(taig.get_item((int)taig.SelectedRows[1], "COLUMN_NAME"));
                    si.SyntheticTables.Add(GetLookupTableFromBaseTable(taig.get_item((int)taig.SelectedRows[1], "TABLE_NAME")));
                    si.SyntheticType = "DATEDIFF - FROM TWO DATES";
                    synth            = "FLOOR(DATEDIFF(day, " + field + "," + field2 + ") / 365.25) AS '" + txtAlias.Text + "'";
                }

                si.SyntheticAlias = txtAlias.Text;
            }

            if (rbToLowerCase.Checked || rbToUpperCase.Checked || rbPullXAtY.Checked || rbPullXLeft.Checked || rbPullXRight.Checked)
            {
                string field = GetLookupTableFromBaseTable(taig.get_item(taig.SelectedRow, "TABLE_NAME")) + "." + Program.BraketizeKeywords(taig.get_item(taig.SelectedRow, "COLUMN_NAME"));
                si.SyntheticFields.Add(taig.get_item(taig.SelectedRow, "COLUMN_NAME"));
                si.SyntheticTables.Add(GetLookupTableFromBaseTable(taig.get_item(taig.SelectedRow, "TABLE_NAME")));

                if (rbToLowerCase.Checked)
                {
                    si.SyntheticType = "TO LOWER CASE";
                    synth            = "LOWER(" + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbToUpperCase.Checked)
                {
                    si.SyntheticType = "TO UPPER CASE";
                    synth            = "UPPER(" + field + ") AS '" + txtAlias.Text + "'";
                }

                if (rbPullXLeft.Checked)
                {
                    si.SyntheticType = "LEFT";
                    synth            = "LEFT(" + field + "," + txtX.Text + ") AS '" + txtAlias.Text + "'";
                }

                if (rbPullXRight.Checked)
                {
                    si.SyntheticType = "RIGHT";
                    synth            = "RIGHT(" + field + "," + txtX.Text + ") AS '" + txtAlias.Text + "'";
                }

                if (rbPullXAtY.Checked)
                {
                    si.SyntheticType = "SUBSTRING";
                    synth            = "SUBSTRING(" + field + "," + txtY.Text + "," + txtX.Text + ") AS '" + txtAlias.Text + "'";
                }

                si.SyntheticAlias = txtAlias.Text;
            }

            si.SyntheticX     = txtX.Text;
            si.SyntheticY     = txtY.Text;
            SelectedSynthItem = si;
            txtCalc.Text      = synth;
        }