Как я проверяю, чтобы видеть, существует ли имя столбца в CachedRowSet?

То, что у вас есть, будет работать, пока hashtext в hashtags отображается как тип данных keyword (или отображается как тип данных text с включенными полевыми данными ), с оговорками, которые идут с делать это).

Вот рабочий пример

private static void Main()
{
    var defaultIndex = "my_index";
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

    var settings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(settings);

    if (client.IndexExists(defaultIndex).Exists)
        client.DeleteIndex(defaultIndex);

    var createIndexResponse = client.CreateIndex(defaultIndex, c => c
        .Mappings(m => m
            .Map(mm => mm
                .AutoMap()
            )
        )
    );

    var bulkResponse = client.Bulk(b => b
        .IndexMany(new []
        {
            new Tweet 
            { 
                id = 1, 
                text = "foo",
                hashtags = new List
                { 
                    new hashtags { hashtext = "aaaa" },
                    new hashtags { hashtext = "bbbb" },
                    new hashtags { hashtext = "cccc" }
                }
            }, 
            new Tweet
            {
                id = 2,
                text = "bar",
                hashtags = new List
                {
                    new hashtags { hashtext = "aaaa" },
                    new hashtags { hashtext = "bbbb" }
                }
            },
            new Tweet
            {
                id = 3,
                text = "baz",
                hashtags = new List
                {
                    new hashtags { hashtext = "aaaa" },
                    new hashtags { hashtext = "cccc" }
                }
            }
        })
        .Refresh(Refresh.WaitFor)
    );

    var searchResponse = client.Search(s => s
        .Size(0)
        .Aggregations(childAggs => childAggs
                .Nested("hashtags", n => n
                    .Path(p => p.hashtags)
                    .Aggregations(nestedAggs => nestedAggs
                        .Terms("by_tags", t => t
                            .Field(f => f.hashtags.First().hashtext)
                        )
                    )
                )
            )
        );

    var hashtagBuckets = searchResponse.Aggregations.Nested("hashtags").Terms("by_tags").Buckets;

    foreach(var bucket in hashtagBuckets)
    {
        Console.WriteLine($"{bucket.Key}\t{bucket.DocCount} times");
    }
}

public class Tweet
{
    public ulong id { get; set; }
    public string text { get; set; }
    [Nested]
    public List hashtags { get; set; }
}


public class hashtags
{
    [Keyword]
    public string hashtext { get; set; }
}

, который пишет следующее в консоль

aaaa  3 times
bbbb  2 times
cccc  2 times

9
задан bluish 6 March 2012 в 08:06
поделиться

4 ответа

Нет более простого пути с общим API JDBC (по крайней мере, не, что я знаю об или могу найти... У меня есть точно тот же код в моем наборе инструментов собственной разработки.)

(Ваш код не завершен):

ResultSetMetaData meta = crs.getMetaData();
 int numCol = meta.getColumnCount();

for (int i = 1; i < numCol+1; i++) 
{
    if(meta.getColumnName(i).equals("name"))
    {return true;}

}
return false;

Однако если Вы используете и/или SQL-запросы собственного, определенного для базы данных API, я уверен, что можно найти более изящные способы сделать то же самое..., но необходимо было бы записать пользовательский код для каждой базы данных, с которой необходимо иметь дело. Я придерживался бы API JDBC на вашем месте.

Есть ли что-то о Вашем предлагаемом решении, которое заставляет Вас думать, что это неправильно? Это кажется достаточно простым мне...

9
ответ дан 4 December 2019 в 11:08
поделиться

Какая база данных?

Я думаю в Oracle существуют таблицы, где столбцы перечислены.

Я не помню, работает ли это на представления также, но я предполагаю, что они делают, это было что-то как:

select colum_name from all_views where view_name like 'myview'

или

select name from all_objects where object_name like 'myview' and object_type='view'

Я не помню точно синтаксис. У Вас должны быть пространственные полномочия все же.

Каждый RDBMS должен иметь что-то подобное.

Можно также выполнить запрос

select * from myView where 1 = 0 ; 

И от метаданных получают столбцы, если, что Вы хотите, чтобы они постарались не выбирать данные прежде, чтобы знать, присутствуют ли столбцы.

1
ответ дан 4 December 2019 в 11:08
поделиться

Нет, действительно нет лучшего пути. Можно хотеть повторно посмотреть на проблему. Если можно переопределить проблему, иногда она делает решение более простым, потому что проблема изменилась.

1
ответ дан 4 December 2019 в 11:08
поделиться

ПРЕДУПРЕЖДЕНИЕ: следующий комментарий - чисто по памяти без каких-либо подтверждающих документов:)

Если я правильно помню, существует загадочная проблема, которая поднимает свою очень уродливую голову, когда оракул кэширует набор строк реализация используется с пулом соединений. Похоже, есть безмолвная ссылка на соединение, содержащееся в кэшированном объекте набора строк (даже если оно должно быть отключено), которое закрывает другое соединение, впоследствии открытое из пула при сборке мусора. По этой причине я в конце концов сдался и написал свой собственный уровень объекта данных (в наши дни я передал его в spring и hibernate).

0
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: