Jayesh45-master opened a new pull request, #14929:
URL: https://github.com/apache/iceberg/pull/14929
<html>
<body>
<!--StartFragment--><h2 data-start="238" data-end="249">PR Title</h2>
<p data-start="251" data-end="316"><strong data-start="251"
data-end="316">Implement in-memory test harness for IRC Events REST
endpoint</strong></p>
<hr data-start="318" data-end="321">
<h2 data-start="323" data-end="340">PR Description</h2>
<h3 data-start="342" data-end="353">Summary</h3>
<p data-start="355" data-end="697">This PR introduces a <strong
data-start="376" data-end="404">lightweight test harness</strong> for the IRC
Events REST endpoint in the Iceberg REST Catalog.<br data-start="466"
data-end="469">
The implementation is intentionally <strong data-start="505"
data-end="523">non-production</strong>, using an <strong data-start="534"
data-end="559">in-memory event store</strong>, and is designed to unblock
further development and validation of the Events API before it is merged into
the REST Catalog specification.</p>
<p data-start="699" data-end="790">This work follows the consensus reached
in #12584 and builds on the groundwork from #13580.</p>
<hr data-start="792" data-end="795">
<h3 data-start="797" data-end="811">Motivation</h3>
<p data-start="813" data-end="941">Before finalizing and merging the IRC
Events endpoint into the REST Catalog specification, we need a concrete
implementation to:</p>
<ul data-start="943" data-end="1078">
<li data-start="943" data-end="972">
<p data-start="945" data-end="972">Validate endpoint contracts</p>
</li>
<li data-start="973" data-end="1010">
<p data-start="975" data-end="1010">Enable integration and unit testing</p>
</li>
<li data-start="1011" data-end="1078">
<p data-start="1013" data-end="1078">Provide a reference implementation for
future production backends</p>
</li>
</ul>
<p data-start="1080" data-end="1173">The test harness satisfies these needs
without introducing storage or operational complexity.</p>
<hr data-start="1175" data-end="1178">
<h3 data-start="1180" data-end="1199">What’s Included</h3>
<p data-start="1201" data-end="1261">This PR adds support for <strong
data-start="1226" data-end="1234">POST</strong> and <strong data-start="1239"
data-end="1246">GET</strong> operations on:</p>
<pre class="overflow-visible! px-0!" data-start="1263" data-end="1290"><div
class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative
bg-token-sidebar-surface-primary"><div class="sticky
top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div
class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div
class="bg-token-bg-elevated-secondary text-token-text-secondary flex
items-center gap-4 rounded-sm px-2 font-sans text-xs"></div></div></div><div
class="overflow-y-auto p-4" dir="ltr"><code
class="whitespace-pre!"><span><span>/v1/{prefix}/events
</span></span></code></div></div></pre>
<p data-start="1292" data-end="1319">using an in-memory backend.</p>
<h4 data-start="1321" data-end="1352">Key components introduced:</h4>
<ul data-start="1354" data-end="1879">
<li data-start="1354" data-end="1476">
<p data-start="1356" data-end="1382"><strong data-start="1356"
data-end="1382">In-memory events store</strong></p>
<ul data-start="1385" data-end="1476">
<li data-start="1385" data-end="1426">
<p data-start="1387" data-end="1426">Thread-safe storage for received
events</p>
</li>
<li data-start="1429" data-end="1476">
<p data-start="1431" data-end="1476">Suitable for tests and local
development only</p>
</li>
</ul>
</li>
<li data-start="1478" data-end="1554">
<p data-start="1480" data-end="1509"><strong data-start="1480"
data-end="1509">Request / response models</strong></p>
<ul data-start="1512" data-end="1554">
<li data-start="1512" data-end="1533">
<p data-start="1514" data-end="1533"><code data-start="1514"
data-end="1533">PostEventsRequest</code></p>
</li>
<li data-start="1536" data-end="1554">
<p data-start="1538" data-end="1554"><code data-start="1538"
data-end="1554">EventsResponse</code></p>
</li>
</ul>
</li>
<li data-start="1556" data-end="1662">
<p data-start="1558" data-end="1573"><strong data-start="1558"
data-end="1573">REST wiring</strong></p>
<ul data-start="1576" data-end="1662">
<li data-start="1576" data-end="1610">
<p data-start="1578" data-end="1610">New routes registered in <code
data-start="1603" data-end="1610">Route</code></p>
</li>
<li data-start="1613" data-end="1662">
<p data-start="1615" data-end="1662">Endpoint handling added to <code
data-start="1642" data-end="1662">RESTCatalogAdapter</code></p>
</li>
</ul>
</li>
<li data-start="1664" data-end="1744">
<p data-start="1666" data-end="1682"><strong data-start="1666"
data-end="1682">Path helpers</strong></p>
<ul data-start="1685" data-end="1744">
<li data-start="1685" data-end="1744">
<p data-start="1687" data-end="1744">Centralized <code data-start="1699"
data-end="1720">/v1/{prefix}/events</code> path in <code data-start="1729"
data-end="1744">ResourcePaths</code></p>
</li>
</ul>
</li>
<li data-start="1746" data-end="1879">
<p data-start="1748" data-end="1757"><strong data-start="1748"
data-end="1757">Tests</strong></p>
<ul data-start="1760" data-end="1879">
<li data-start="1760" data-end="1879">
<p data-start="1762" data-end="1793"><code data-start="1762"
data-end="1782">TestEventsEndpoint</code> validates:</p>
<ul data-start="1798" data-end="1879">
<li data-start="1798" data-end="1814">
<p data-start="1800" data-end="1814">Posting events</p>
</li>
<li data-start="1819" data-end="1845">
<p data-start="1821" data-end="1845">Retrieving stored events</p>
</li>
<li data-start="1850" data-end="1879">
<p data-start="1852" data-end="1879">Basic request/response flow</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr data-start="1881" data-end="1884">
<h3 data-start="1886" data-end="1903">Files Changed</h3>
<div class="TyagGW_tableContainer"><div tabindex="-1" class="group
TyagGW_tableWrapper flex w-fit flex-col-reverse">
File | Description
-- | --
ResourcePaths.java | Added V1_EVENTS path and helper
PostEventsRequest.java | Request model for POST /events
EventsResponse.java | Response model for GET /events
InMemoryEventsStore.java | Simple in-memory event backend
RESTCatalogAdapter.java | Endpoint handling for events
Route.java | Added EVENTS_POST and EVENTS_GET routes
TestEventsEndpoint.java | Unit test covering the new endpoint
</div></div>
<hr data-start="2379" data-end="2382">
<h3 data-start="2384" data-end="2400">Design Notes</h3>
<ul data-start="2402" data-end="2667">
<li data-start="2402" data-end="2499">
<p data-start="2404" data-end="2499"><strong data-start="2404"
data-end="2432">Non-production by design</strong><br data-start="2432"
data-end="2435">
The in-memory store is scoped to testing and local usage only.</p>
</li>
<li data-start="2501" data-end="2583">
<p data-start="2503" data-end="2583"><strong data-start="2503"
data-end="2532">No persistence guarantees</strong><br data-start="2532"
data-end="2535">
Events are not durable and reset between runs.</p>
</li>
<li data-start="2585" data-end="2667">
<p data-start="2587" data-end="2667"><strong data-start="2587"
data-end="2611">Minimal surface area</strong><br data-start="2611"
data-end="2614">
No external dependencies or configuration required.</p>
</li>
</ul>
<p data-start="2669" data-end="2766">This approach keeps the implementation
simple while providing meaningful coverage and validation.</p>
<hr data-start="2768" data-end="2771">
<h3 data-start="2773" data-end="2784">Testing</h3>
<ul data-start="2786" data-end="2967">
<li data-start="2786" data-end="2814">
<p data-start="2788" data-end="2814">Added <code data-start="2794"
data-end="2814">TestEventsEndpoint</code></p>
</li>
<li data-start="2815" data-end="2896">
<p data-start="2817" data-end="2826">Verified:</p>
<ul data-start="2829" data-end="2896">
<li data-start="2829" data-end="2855">
<p data-start="2831" data-end="2855">POST events are accepted</p>
</li>
<li data-start="2858" data-end="2896">
<p data-start="2860" data-end="2896">GET returns previously posted events</p>
</li>
</ul>
</li>
<li data-start="2897" data-end="2967">
<p data-start="2899" data-end="2933">Full build executed locally using:</p>
<pre class="overflow-visible! px-0!" data-start="2936" data-end="2967"><div
class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative
bg-token-sidebar-surface-primary"><div class="sticky
top-[calc(--spacing(9)+var(--header-height))] @w-xl/main:top-9"><div
class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div
class="bg-token-bg-elevated-secondary text-token-text-secondary flex
items-center gap-4 rounded-sm px-2 font-sans text-xs"></div></div></div><div
class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre!
language-bash"><span><span>./gradlew build
</span></span></code></div></div></pre>
</li>
</ul>
<hr data-start="2969" data-end="2972">
<h3 data-start="2974" data-end="3000">Backward Compatibility</h3>
<ul data-start="3002" data-end="3114">
<li data-start="3002" data-end="3023">
<p data-start="3004" data-end="3023">No breaking changes</p>
</li>
<li data-start="3024" data-end="3074">
<p data-start="3026" data-end="3074">No impact on existing REST Catalog
functionality</p>
</li>
<li data-start="3075" data-end="3114">
<p data-start="3077" data-end="3114">New endpoint is additive and
isolated</p>
</li>
</ul>
<hr data-start="3116" data-end="3119">
<h3 data-start="3121" data-end="3149">Follow-ups / Future Work</h3>
<ul data-start="3151" data-end="3287">
<li data-start="3151" data-end="3189">
<p data-start="3153" data-end="3189">Pluggable or persistent event stores</p>
</li>
<li data-start="3190" data-end="3222">
<p data-start="3192" data-end="3222">Metrics and retention policies</p>
</li>
<li data-start="3223" data-end="3252">
<p data-start="3225" data-end="3252">Authorization and filtering</p>
</li>
<li data-start="3253" data-end="3287">
<p data-start="3255" data-end="3287">Production-ready implementations</p>
</li>
</ul>
<hr data-start="3289" data-end="3292">
<h3 data-start="3294" data-end="3307">Checklist</h3>
<ul class="contains-task-list" data-start="3309" data-end="3492">
<li class="task-list-item" data-start="3309" data-end="3344">
<p data-start="3315" data-end="3344"><input disabled="" type="checkbox"
checked=""> Follows Iceberg REST patterns</p>
</li>
<li class="task-list-item" data-start="3345" data-end="3384">
<p data-start="3351" data-end="3384"><input disabled="" type="checkbox"
checked=""> Minimal, test-only implementation</p>
</li>
<li class="task-list-item" data-start="3385" data-end="3412">
<p data-start="3391" data-end="3412"><input disabled="" type="checkbox"
checked=""> Covered by unit tests</p>
</li>
<li class="task-list-item" data-start="3413" data-end="3455">
<p data-start="3419" data-end="3455"><input disabled="" type="checkbox"
checked=""> No production assumptions introduced</p>
</li>
<li class="task-list-item" data-start="3456" data-end="3492">
<p data-start="3462" data-end="3492"><input disabled="" type="checkbox"
checked=""> Ready for review and iteration</p></li></ul><!--EndFragment-->
</body>
</html>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]