| 457 | | assert(class_uri); |
| 458 | | |
| 459 | | SLV2PluginClass plugin_class = slv2_plugin_class_new(world, |
| 460 | | parent_uri, class_uri, label); |
| 461 | | raptor_sequence_push(world->plugin_classes, plugin_class); |
| 462 | | // FIXME: Slow! ORDER BY broken in certain versions of redland? |
| 463 | | raptor_sequence_sort(world->plugin_classes, slv2_plugin_class_compare_by_uri); |
| | 455 | if (class_uri && parent_uri) { |
| | 456 | SLV2PluginClass plugin_class = NULL; |
| | 457 | |
| | 458 | // Check if this is another match for the last plugin (avoid search) |
| | 459 | SLV2PluginClasses classes = world->plugin_classes; |
| | 460 | const unsigned n_classes = raptor_sequence_size(classes); |
| | 461 | if (n_classes >= 1) { |
| | 462 | SLV2PluginClass prev = raptor_sequence_get_at(classes, n_classes - 1); |
| | 463 | if (librdf_uri_equals(class_uri, prev->uri->val.uri_val)) |
| | 464 | plugin_class = prev; |
| | 465 | } |
| | 466 | |
| | 467 | SLV2Value uri = slv2_value_new_librdf_uri(world, class_uri); |
| | 468 | |
| | 469 | // If this class differs from the last, append a new one |
| | 470 | if (!plugin_class) { |
| | 471 | if (n_classes == 0) { |
| | 472 | plugin_class = slv2_plugin_class_new(world, parent_uri, class_uri, label); |
| | 473 | raptor_sequence_push(classes, plugin_class); |
| | 474 | } else { |
| | 475 | SLV2PluginClass first = raptor_sequence_get_at(classes, 0); |
| | 476 | SLV2PluginClass prev = raptor_sequence_get_at(classes, n_classes - 1); |
| | 477 | |
| | 478 | // If the URI is > the last in the list, just append (avoid sort) |
| | 479 | if (strcmp( |
| | 480 | slv2_value_as_string(slv2_plugin_class_get_uri(prev)), |
| | 481 | (const char*)librdf_uri_as_string(class_uri)) < 0) { |
| | 482 | plugin_class = slv2_plugin_class_new(world, parent_uri, class_uri, label); |
| | 483 | raptor_sequence_push(classes, plugin_class); |
| | 484 | |
| | 485 | // If the URI is < the first in the list, just prepend (avoid sort) |
| | 486 | } else if (strcmp( |
| | 487 | slv2_value_as_string(slv2_plugin_class_get_uri(first)), |
| | 488 | (const char*)librdf_uri_as_string(class_uri)) > 0) { |
| | 489 | plugin_class = slv2_plugin_class_new(world, parent_uri, class_uri, label); |
| | 490 | raptor_sequence_shift(classes, plugin_class); |
| | 491 | |
| | 492 | // Otherwise the query engine is giving us unsorted results :/ |
| | 493 | } else { |
| | 494 | plugin_class = slv2_plugin_classes_get_by_uri(classes, uri); |
| | 495 | if (!plugin_class) { |
| | 496 | plugin_class = slv2_plugin_class_new(world, parent_uri, class_uri, label); |
| | 497 | raptor_sequence_push(classes, plugin_class); |
| | 498 | raptor_sequence_sort(classes, slv2_plugin_class_compare_by_uri); |
| | 499 | } |
| | 500 | } |
| | 501 | } |
| | 502 | } else { |
| | 503 | // TODO: Support classes with several parents |
| | 504 | } |
| | 505 | } |